gpt4 book ai didi

assembly - x86指令中的 ".s"后缀是什么?

转载 作者:行者123 更新时间:2023-12-02 16:17:59 25 4
gpt4 key购买 nike

当我使用 objdump(使用 AT&T 和 Intel 语法)反汇编某些二进制文件的 .text 部分时,我有时会看到带有 .s< 的指令 后缀,例如:cmpb.s %bh,%chsbbl.s %edi,%ediadcb.s %bl, %dh

.s 后缀是否具有有效/有用的含义(甚至可能不是后缀),或者这是反汇编某些数据/填充的人为产物,就好像它是指令序列一样?谢谢。

最佳答案

要了解 .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 字段设置为 11。是寄存器的值。 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 告诉我们使用 form 3 编码,其中源操作数始终是寄存器(即它来自 REG 字段),而目标操作数是存储器位置或寄存器(即,它由 Mod 和 R/M 字段确定)。 12 告诉我们使用 form 4 编码,其中操作数是相反的 - 源操作数由 Mod 和 R/M 字段确定,目标操作数来自 REG 字段。

因此,寄存器在 ModR/M 字节中存储的位置被交换,指令的第一个字节告诉我们哪个操作数存储在哪里。

关于assembly - x86指令中的 ".s"后缀是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16746922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com