Есть ли код операции x86 для перемещения непосредственного байта в прямую ячейку памяти (без использования регистров)?

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

MOV 10h,ffffh

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

Ответы

Ответ 1

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

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

  c6      04      25   ff ff 00 00   10
opcode  modr/m   sib     address     immediate

Ответ 2

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

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 и следующий результат.