【问题标题】:How can I prepend a `SS:` or `ES:` using AT&T Assembly Syntax如何使用 AT&T 汇编语法添加 `SS:` 或 `ES:`
【发布时间】:2011-03-26 22:09:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: assembly x86 att memory-segmentation


    【解决方案1】:

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

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

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

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


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

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

    【讨论】:

    • 哦,我不知道!虽然 MSVC 汇编器似乎添加了它...但是 movl $foo, %ss:0x10(%esp) 是添加它的正确方法吗?
    • 好的,刚查了一下,是的
    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多