Символы кода ассемблера - PullRequest
0 голосов
/ 13 декабря 2011

Я довольно запутался с преобразованием шестнадцатеричных машинных инструкций в символьные коды операций. У меня есть несколько проблем с обзором из этого раздела:

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 ]

4 голосов
/ 13 декабря 2011

См. Страницы Википедии на x86 и x86 списках инструкций

См. Также Руководство Intel по набору инструкций x86 и на многих других сайтах, таких как x86asm , эта страница .

Поиск в Интернете дает много ссылок.

И вы можете использовать отладчик, такой как gdb, чтобы помочь вам.

2 голосов
/ 13 декабря 2011

Справедливо отмечается, что существует множество возможностей для 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. Здесь и там вы можете изменять различные биты и смотреть, какие изменения они вносят в разборку.

...