Assembly IA32程序集远调用和段偏移量大小
我不熟悉组装。几天前,我读到了关于IA32体系结构中内存分段/分页的内容,现在我正在研究汇编远调用 好的,对于IA32段,有一个16位段寄存器和一个32位段偏移量。它们一起构成逻辑地址/远指针(带分页的分段)或线性地址(不带分页的分段)。 关于远调用,我现在读到的是段寄存器(CS)和16位偏移量在跳转之前被推送 问题:为什么偏移量是16位长?它是段的内部选择器,而不是用于计算线性/逻辑地址的偏移量吗 操作模式是否与远端呼叫有关Assembly IA32程序集远调用和段偏移量大小,assembly,x86,Assembly,X86,我不熟悉组装。几天前,我读到了关于IA32体系结构中内存分段/分页的内容,现在我正在研究汇编远调用 好的,对于IA32段,有一个16位段寄存器和一个32位段偏移量。它们一起构成逻辑地址/远指针(带分页的分段)或线性地址(不带分页的分段)。 关于远调用,我现在读到的是段寄存器(CS)和16位偏移量在跳转之前被推送 问题:为什么偏移量是16位长?它是段的内部选择器,而不是用于计算线性/逻辑地址的偏移量吗 操作模式是否与远端呼叫有关 感谢您的建议。您应该首先编程到ELF或Windows 32位平面用户
感谢您的建议。您应该首先编程到ELF或Windows 32位平面用户空间模型,其中:
- 进程可用的所有RAM都映射到4GB(232字节)线性地址空间。(并非所有的地址空间都必须可供您的程序使用,并且您必须使用操作系统/C库接口,例如,
,以获得比开始时更多的地址空间。)内存以页的形式分配,每个页有4096字节(很少有例外),可以是可读、可写和可执行的任意组合;32位指针可以指向任何页面上的任何字节malloc
- 只有一种绝对调用指令,它可以到达任何地址
- 实际上,段和段寄存器并不存在。1
- 有八个整数寄存器(
,%eax
,%ebx
,%ecx
,%edx
,%esi
,%edi
和%ebp
),它们都是32位宽的,可以保存地址%esp
保留用作堆栈指针,其他指针可用于任何您喜欢的用途;但是,您应该阅读操作系统定义的C调用约定,这样您就知道哪些寄存器被调用关闭,哪些被调用保存(Windows和非Windows是不同的,所以我不能只告诉您)%esp
%fs
和/或%gs
作为具有非常特定函数的附加指针,但它们不能用于任何您喜欢的用途%cs
、%ds
、%es
和%ss
完全不能在平面用户空间模型中使用(更准确地说,设置平面模型需要将它们设置为固定值,然后再也不能更改)。关于远端调用,我现在读到的是段寄存器(cs)16位偏移量在跳转之前被推送。”
这是不正确的:如果当前CS段描述符指定32位段,则16位段寄存器和32位偏移量被推送到堆栈上。如果当前CS段描述符指定16位段,则偏移量为16位
摘自《英特尔64和IA-32体系结构软件开发人员手册》
3.3.5 32位和16位地址和操作数大小
使用32位寻址时,逻辑地址(或远指针)
由16位段选择器和32位偏移组成
... 当前执行的代码段的段描述符定义默认地址和操作数大小
7.3.15.2远程控制传输指令
JMP和呼叫说明(见第7.3.8节“控制转移
指令“)都接受远指针作为指向的源操作数
将程序控制转移到当前段以外的段
由CS寄存器指向。当使用
调用指令时,EIP和CS寄存器的当前值为
两个人都推了推堆栈
我认为提到16位偏移量的参考实际上是指8086,而不是ia-32。