Символы кода ассемблера

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

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

Другие вопросы по тегам