Чтобы понять, что означает суффикс .s
, вам необходимо понять, как кодируются инструкции x86. Если мы возьмем adc
в качестве примера, есть четыре основных формы, которые могут принимать операнды:
- Исходный операнд является непосредственным, а целевой операнд - регистром аккумулятора.
- Исходный операнд является непосредственным, а целевой операнд - регистром или ячейкой памяти.
- Исходный операнд - это регистр, а целевой операнд - регистр или ячейка памяти.
- Исходный операнд - это регистр или ячейка памяти, а целевой операнд - это регистр.
И, конечно же, существуют их варианты для разных размеров операндов: 8-битные, 16-битные, 32-битные и т. Д.
Когда один из ваших операндов является регистром, а другой - ячейкой памяти, очевидно, какую из форм 3 и 4 должен использовать ассемблер, но когда оба операнда являются регистрами, применима любая форма. Префикс .s
сообщает ассемблеру, какую форму использовать (или, в случае разборки, показывает, какая форма была использована).
Рассматривая конкретный пример adcb %bl,%dh
, его можно закодировать двумя способами:
10 de adcb %bl,%dh
12 f3 adcb.s %bl,%dh
Первый байт определяет форму используемой инструкции, к которой я вернусь позже. Второй байт известен как байт ModR / M и определяет режим адресации и используемые операнды регистра. Байт ModR / M можно разделить на три поля: Mod (2 старших бита), REG (следующие 3) и R / M (последние 3).
de: Mod=11, REG = 011, R/M = 110
f3: Mod=11, REG = 110, R/M = 011
Поля Mod и R / M вместе определяют эффективный адрес ячейки памяти, если один из операндов является ячейкой памяти, но когда этот операнд является просто регистром, поле Mod устанавливается на 11, а R / M - это значение. реестра. Поле REG, очевидно, просто представляет другой регистр.
Таким образом, в байте de
поле R / M содержит регистр dh
, а поля REG содержат регистр bl
. И в байте f3
поле R / M содержит регистр bl
, а поля REG содержат регистр dh
. (8-битные регистры кодируются числами от 0 до 7 в порядке al, cl, dl, bl, ah, ch, dh, bh)
Возвращаясь к первому байту, 10
говорит нам использовать кодировку формы 3, где исходный операнд всегда является регистром (т.е. он поступает из поля REG), а целевой операнд - это ячейка памяти или регистр (т.е. определяется полями Mod и R / M). 12
говорит нам использовать кодировку формы 4, где операнды противоположны - исходный операнд определяется полями Mod и R / M, а целевой операнд берется из поля REG.
Таким образом, позиции, в которых хранятся регистры в байте ModR / M, меняются местами, и первый байт инструкции сообщает нам, какой операнд и где хранится.
person
James Holderness
schedule
25.05.2013
.s
суффиксы переопределения кодировки были заменены префиксами{load}
и{store}
i>, а также{vex3}
,{disp32}
и другие. например{load}add %eax, %ecx
. - person Peter Cordes   schedule 10.03.2018