Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly IA32程序集远调用和段偏移量大小_Assembly_X86 - Fatal编程技术网

Assembly IA32程序集远调用和段偏移量大小

Assembly IA32程序集远调用和段偏移量大小,assembly,x86,Assembly,X86,我不熟悉组装。几天前,我读到了关于IA32体系结构中内存分段/分页的内容,现在我正在研究汇编远调用 好的,对于IA32段,有一个16位段寄存器和一个32位段偏移量。它们一起构成逻辑地址/远指针(带分页的分段)或线性地址(不带分页的分段)。 关于远调用,我现在读到的是段寄存器(CS)和16位偏移量在跳转之前被推送 问题:为什么偏移量是16位长?它是段的内部选择器,而不是用于计算线性/逻辑地址的偏移量吗 操作模式是否与远端呼叫有关 感谢您的建议。您应该首先编程到ELF或Windows 32位平面用户

我不熟悉组装。几天前,我读到了关于IA32体系结构中内存分段/分页的内容,现在我正在研究汇编远调用

好的,对于IA32段,有一个16位段寄存器和一个32位段偏移量。它们一起构成逻辑地址/远指针(带分页的分段)或线性地址(不带分页的分段)。 关于远调用,我现在读到的是段寄存器(CS)和16位偏移量在跳转之前被推送

问题:为什么偏移量是16位长?它是段的内部选择器,而不是用于计算线性/逻辑地址的偏移量吗

操作模式是否与远端呼叫有关


感谢您的建议。

您应该首先编程到ELF或Windows 32位平面用户空间模型,其中:

  • 进程可用的所有RAM都映射到4GB(232字节)线性地址空间。(并非所有的地址空间都必须可供您的程序使用,并且您必须使用操作系统/C库接口,例如,
    malloc
    ,以获得比开始时更多的地址空间。)内存以页的形式分配,每个页有4096字节(很少有例外),可以是可读、可写和可执行的任意组合;32位指针可以指向任何页面上的任何字节
  • 只有一种绝对调用指令,它可以到达任何地址
  • 实际上,段和段寄存器并不存在。1
  • 有八个整数寄存器(
    %eax
    %ebx
    %ecx
    %edx
    %esi
    %edi
    %ebp
    %esp
    ),它们都是32位宽的,可以保存地址
    %esp
    保留用作堆栈指针,其他指针可用于任何您喜欢的用途;但是,您应该阅读操作系统定义的C调用约定,这样您就知道哪些寄存器被调用关闭,哪些被调用保存(Windows和非Windows是不同的,所以我不能只告诉您)
如果愿意,也可以从64位平面用户空间模型开始;重要的区别在于,现在有16个整数寄存器,它们都是64位宽的,调用约定更复杂,RAM现在映射到248字节的线性地址空间

只有在您完全掌握了CPU在此模式下的功能之后,您才应该考虑学习保护模式内核编程(在保护模式内核编程中,您必须了解段和段寄存器,但仅作为虚拟内存如何工作的细节)或16位编程(在保护模式内核编程中,段实际上很重要). 就我个人而言,我不会为16位模式而烦恼;它唯一的用途就是几乎没有足够的引导加载程序代码来脱离16位模式

1 C库和操作系统可能会巧妙地利用
%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。