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