Существует ли код операции x86 для перемещения непосредственного байта в область прямой памяти (без использования регистров)? - PullRequest
16 голосов
/ 14 сентября 2011

Есть ли способ переместить конкретное непосредственное число байтового размера в прямую ячейку памяти?Т.е.

MOV 10h,ffffh

для записи значения 16 в адрес памяти 65535?Если да, то какой это код операции, или я должен сначала сохранить адрес памяти в регистре?

Ответы [ 2 ]

14 голосов
/ 14 сентября 2011

Да.Код операции C6.Вам следует скачать копию документов Intel ISA, которые находятся в свободном доступе .

. На ваш следующий вопрос: полная кодировка вашего примера:

  c6      04      25   ff ff 00 00   10
opcode  modr/m   sib     address     immediate
5 голосов

Справочник по Intel, том 2 Справочник по наборам инструкций - 325383-056US Сентябрь 2015 Раздел 3.2 «MOV - Перемещение» "имеет таблицу, которая содержит:

Opcode            Instruction
----------------  ----------------
C6 /0 ib          MOV r/m8, imm8
C7 /0 iw          MOV r/m16, imm16
C7 /0 id          MOV r/m32, imm32
REX.W + C7 /0 io  MOV r/m64, imm32

Тогда вы должны знать, что:

  • r/m означает регистр или ячейку памяти
  • imm означает немедленное

Итак, это те кодировки, которые вы ищете.

Более эмпирически, вы могли бы просто попробовать и декомпилировать:

mov byte [0x1234678], 0x9A

Тогда:

as --32 -o a.o a.S
nasm -felf32 -o a.o a.asm

Дает:

00000000 <.text>:
   0:    c6 05 78 56 34 12 9a    movb    $0x9a,0x12345678

Итак, мы заключаем, что c6 - это код операции с ModR / M 05, и сразу же следует следующий.

...