当我使用.text
(包含AT& T和Intel语法)反汇编某些二进制文件的objdump
部分时,我有时会看到带有.s
后缀的说明,例如:{ {1}},cmpb.s %bh,%ch
或sbbl.s %edi,%edi
。
adcb.s %bl,%dh
后缀是否具有有效/有用的含义(甚至可能不作为后缀),或者这是一个反汇编某些数据/填充的假象,就好像它是一系列指令一样?谢谢。
答案 0 :(得分:14)
要了解.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位寄存器按照al,cl,dl,bl,ah,ch,dh,bh的顺序编码为数字0到7)
回到第一个字节,10
告诉我们使用表格3编码,其中源操作数总是一个寄存器(即它来自REG字段),目标操作数是一个内存位置或寄存器(即由Mod和R / M字段确定)。 12
告诉我们使用4格式编码,其中操作数是相反的 - 源操作数由Mod和R / M字段确定,目标操作数来自REG字段。
因此,寄存器存储在ModR / M字节中的位置被交换,指令的第一个字节告诉我们哪个操作数存储在哪里。
答案 1 :(得分:8)
.s
指令后缀以指令编码(reference)交换寄存器操作数。