2

如何在不添加or的情况下预先添加SS:orES:使用 AT&T 汇编语法?.byte 0x36.byte 0x26

IE。我如何能够在mov dword ptr ss:[esp+0x10], offset foo不使用以下命令的情况下从 Intel 语法转换为 AT&T:

.byte   0x36
movl    $foo, 0x10(%esp)

我已经尝试过movl $foo, %ss:0x10(%esp)没有警告的汇编,但是通过二进制文件,仍然没有添加SS:

4

1 回答 1

5

与and寄存器一起使用SS:时不需要前缀。对于那些作为基础的寄存器,已经是默认段了。ESPEBPss

这可能是汇编器为了节省空间而简单地省略它的原因。

您不希望或不需要机器代码中的实际 SS 前缀(除非您出于对齐/填充原因使指令更长)。Intel-syntax 反汇编中的SS:只是为了提醒您寻址模式隐含的默认段。

如果出于某种奇怪的原因,您确实需要在机器代码中使用冗余 SS 前缀,则可以使用指令手动发出SS:前缀。.byte 0x36汇编器不会修改原始字节。


主流 32 位操作系统使用平面内存模型,其中所有段基数均为 0,因此无论如何都没关系;这就是为什么您可以将 ESP 复制到另一个寄存器(如 EAX)以获取堆栈变量的地址,并使用(%eax)aka取消引用它%ds:(%eax)以仍然寻址相同的堆栈内存。这就是为什么编译器不需要知道指针来自哪里,也不需要使用%ss:(%eax).

如果您不使用非平面内存模式编写自己的操作系统,则只有 FS 或 GS​​ 段覆盖(用于线程本地存储)在普通代码中有用。

于 2010-08-08T10:19:23.980 回答