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