Символы кода ассемблера
Я довольно смущен преобразованием шестнадцатеричных машинных инструкций в символьные коды операций. У меня есть несколько проблем с обзором из этого раздела:
What machine code is generated for the instruction: sbb al, 10
sbb reg/mem from reg/mem 0001 10dw | mod reg r/m | disp-lo | disp-hi
sbb immed from reg/mem 1000 00dw | mod 101 r/m | disp-lo | disp-hi | disp-lo | disp-hi
sbb immed from accumulator 0001 110w | data-lo | data-hi
Answer: 01C0A
What is the symbolic opcode for this hex machine instruction: F7 26 10 00
I converted F7 to 1111 0111 and this matches up with these instructions
mul 1111 011w | mod 100 r/m | disp-lo | disp-hi
imul 1111 011w | mod 101 r/m | disp-lo | disp-hi
div 1111 011w | mod 110 r/m | disp-lo | disp-hi
idiv 1111 011w | mod 111 r/m | disp-lo | disp-hi
Answer: mul
Я понятия не имею, как справиться с этими проблемами, и я не могу обернуть голову вокруг концепции. Может кто-нибудь объяснить мне это в более простых терминах?
2 ответа
Смотрите википедию на списках инструкций x86 и x86
См. Также руководство Intel по набору команд x86 и многие другие сайты, такие как x86asm, на этой странице.
Поиск в Интернете дает много много ссылок.
И вы можете использовать отладчик, как gdb
чтобы помочь вам.
Справедливо отмечается, что существует множество возможностей для sbb al, 10
, но либо ваш ресурс неверен, либо вы выбрали неверные данные из него. Вот из руководства Intel:
SBB – Integer Subtraction with Borrow
immediate to register 1000 00sw : 11 011 reg : immediate data
immediate to AL, AX, or EAX 0001 110w : immediate data
Если вы используете вторую кодировку, вы получите 2-байтовую инструкцию: 1Ch, 0Ah
, w
отличает инструкции, работающие с операндами байтового размера, от (d/q) операндов размера слова. Вот w
=0, поскольку операнды являются байтами. w
будет 1 для sbb (r/e)ax, imm
,
Теперь, если вы используете первую кодировку, вы получите 3-байтовую инструкцию. w
имеет то же значение. s
отличает инструкции, чьи непосредственные значения (d) имеют размер слова от тех, чьи непосредственные значения имеют размер в байтах (если вы внимательно посмотрите описание инструкции, вы найдете две формы, которые отличаются только размером непосредственного операнда). Вот s
=0, потому что непосредственный размер имеет байтовый размер. reg
это регистр индекса. За al
(а также (r/e)ax
) это 0. С этим вы получите: 80h, 0D8h, 0Ah
,
Обе кодировки являются действительными кодировками sbb al, 10
, но обычно короче предпочтительнее.
Вы обязательно должны прочитать руководства по процессорам Intel и / или AMD, в которых описан набор инструкций и кодировки инструкций, вероятно, прочитайте несколько раз за несколько операций и прочитайте как Intel, так и AMD. Вся необходимая информация есть, просто ее много, и она не в лучшей форме для обучения.
Если вы хотите проверить свое понимание кодировок команд, используйте такие инструменты, как: ассемблер, дизассемблер и отладчик. Вы можете, например, написать db 80h, 0D8h, 0Ah
или же db 1Ch, 0Ah
вместо sbb al, 10
в коде, скомпилируйте его, затем посмотрите на его разборку, чтобы увидеть, что это действительно sbb al, 10
, Вы можете изменить различные элементы здесь и там и посмотреть, какие изменения они вносят в разборку.