如何使用 AT&T 汇编语法在前面添加 SS:
或 ES:
,而不添加 .byte 0x36
或 。字节0x26
?
即。我如何能够将 mov dword ptr ss:[esp+0x10], offset foo
从 Intel 语法转换为 AT&T,而不使用:
.byte 0x36
movl $foo, 0x10(%esp)
我已经尝试过 movl $foo, %ss:0x10(%esp)
,它在没有警告的情况下进行汇编,但是,查看二进制文件,仍然没有添加 SS:
最佳答案
与 ESP
和 EBP
寄存器一起使用时,不需要 SS:
前缀。对于那些作为基址的寄存器,ss
已经是默认段。
这可能是汇编器简单地省略它以节省空间的原因。
您不希望或不需要机器代码中的实际 SS 前缀(除非您出于对齐/填充原因想要使指令更长)。 Intel 语法反汇编中的 SS:
只是提醒您寻址模式隐含的默认段。
如果出于某种奇怪的原因,您确实想要在机器代码中使用冗余的 SS 前缀,您可以手动发出带有 .byte 0x36 的
指令。汇编器不会修改原始字节。SS:
前缀
主流 32 位操作系统使用平面内存模型,其中所有段基数均为 0,因此无论如何都没关系;这就是为什么您可以将 ESP 复制到另一个寄存器(例如 EAX)以获取堆栈变量的地址,并使用 (%eax)
又名 %ds:(%eax)
取消引用它仍然寻址相同的堆栈内存。这就是为什么编译器不需要知道指针来自哪里,也不需要使用 %ss:(%eax)
。
如果您不使用非平面内存模式编写自己的操作系统,则只有 FS 或 GS 段覆盖(用于线程本地存储)在普通代码中才有用。
关于assembly - 如何使用 AT&T 汇编语法在前面添加 `SS:` 或 `ES:`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3433916/