如何在不添加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:
如何在不添加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:
与and寄存器一起使用SS:
时不需要前缀。对于那些作为基础的寄存器,已经是默认段了。ESP
EBP
ss
这可能是汇编器为了节省空间而简单地省略它的原因。
您不希望或不需要机器代码中的实际 SS 前缀(除非您出于对齐/填充原因使指令更长)。Intel-syntax 反汇编中的SS:
只是为了提醒您寻址模式隐含的默认段。
如果出于某种奇怪的原因,您确实需要在机器代码中使用冗余 SS 前缀,则可以使用指令手动发出SS:
前缀。.byte 0x36
汇编器不会修改原始字节。
主流 32 位操作系统使用平面内存模型,其中所有段基数均为 0,因此无论如何都没关系;这就是为什么您可以将 ESP 复制到另一个寄存器(如 EAX)以获取堆栈变量的地址,并使用(%eax)
aka取消引用它%ds:(%eax)
以仍然寻址相同的堆栈内存。这就是为什么编译器不需要知道指针来自哪里,也不需要使用%ss:(%eax)
.
如果您不使用非平面内存模式编写自己的操作系统,则只有 FS 或 GS 段覆盖(用于线程本地存储)在普通代码中有用。