assembly - 如何使用 AT&T 汇编语法在前面添加 `SS:` 或 `ES:`

标签 assembly x86 att memory-segmentation

如何使用 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:

最佳答案

ESPEBP 寄存器一起使用时,不需要 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/

相关文章:

assembly - 如何在 NASM 中创建第二个堆栈

c - 在 32 位 WinXP 下使用 64 位数字

c# - 为什么 32 位可执行文件不能在 WoW64 下运行?

c - _mm_lfence() 时间开销是不确定的?

assembly - 如果函数相等则 NASM 程序集跳转

assembly - 为什么取消引用 `Arc<T> where T : MyTrait` 对齐到 0x10?

assembly - 如何在x86汇编中获得没有堆栈的eip

程序集:用于自定义操作系统键盘支持的引导加载程序

assembly - x86 汇编中的 mov 指令