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