Что такое суффикс .s в инструкциях для x86?

Когда я дизассемблирую .text разделы некоторых двоичных файлов, используя objdump (с синтаксисами AT&T и Intel), я иногда вижу инструкции с суффиксом .s, например: cmpb.s %bh,%ch, sbbl.s %edi,%edi или adcb.s %bl,%dh.

Имеет ли суффикс .s действительное / полезное значение (возможно, даже не как суффикс), или это артефакт разборки некоторых данных / заполнения, как если бы это была последовательность инструкций? Спасибо.


person Peter Goodman    schedule 25.05.2013    source источник
comment
Обратите внимание, что .s суффиксы переопределения кодировки были заменены префиксами {load} и {store} , а также {vex3}, {disp32} и другие. например {load}add %eax, %ecx.   -  person Peter Cordes    schedule 10.03.2018


Ответы (2)


Чтобы понять, что означает суффикс .s, вам необходимо понять, как кодируются инструкции x86. Если мы возьмем adc в качестве примера, есть четыре основных формы, которые могут принимать операнды:

  1. Исходный операнд является непосредственным, а целевой операнд - регистром аккумулятора.
  2. Исходный операнд является непосредственным, а целевой операнд - регистром или ячейкой памяти.
  3. Исходный операнд - это регистр, а целевой операнд - регистр или ячейка памяти.
  4. Исходный операнд - это регистр или ячейка памяти, а целевой операнд - это регистр.

И, конечно же, существуют их варианты для разных размеров операндов: 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
comment
Отличный ответ, я просто хотел добавить, что суффикс .s - это соглашение GAS. Никакие другие ассемблеры не используют его (но я не думаю, что кто-то из них действительно поддерживает выбор кодировки). Вот другая страница, описывающая проблему с дополнительными примерами. - person Igor Skochinsky; 27.05.2013
comment
Интересное чтение - спасибо за ссылку. Что касается других ассемблеров, поддерживающих несколько кодировок, я был убежден, что раньше сталкивался с подобной функциональностью в другом ассемблере (или, возможно, дизассемблере), я просто не могу вспомнить, где и каков был синтаксис. Возможно, я написал что-то сам. - person James Holderness; 28.05.2013
comment
GAS имеет новый синтаксис для переопределений кодирования, например префикс {load} для кодирования с источником r / m. sourceware.org/binutils/docs/as/i386_002dMnemonics.html. - person Peter Cordes; 10.03.2018

Суффикс инструкции .s меняет местами регистровые операнды в кодировке инструкции (справочник).

person Michael    schedule 25.05.2013
comment
Надеюсь, что когда-нибудь SO-пост расскажет, какими рекреационными наркотиками злоупотребляли эти парни. - person Hans Passant; 25.05.2013
comment
Спасибо за отличную ссылку. Я действительно попал на этот сайт, но когда искал различные префиксы. Увидев вашу ссылку, я понял, что мне не удалось установить связь между этим сайтом (о binutils) и тем, как это может мне помочь! - person Peter Goodman; 25.05.2013