如何使用 AT&T 汇编语法添加 `SS:` 或 `ES:`

小太郎*_*小太郎 2 x86 assembly att memory-segmentation

如何在不添加 a或 的情况下添加a 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)
Run Code Online (Sandbox Code Playgroud)

我试过movl $foo, %ss:0x10(%esp)在没有警告的情况下组装,但是,通过二进制文件,仍然没有添加SS:

sta*_*ica 5

一个SS:与所使用的当不需要前缀ESPEBP寄存器。对于那些以寄存器为基数的,ss已经是默认段了。

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

您不想要或不需要机器代码中的实际 SS 前缀(除非您想因对齐/填充原因使指令更长)。在SS:英特尔的语法拆装只是提醒你的寻址模式所隐含的默认段。

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


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

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