操作系统真相还原笔记第三章-------内存汇编部分

1)地址、section、vstart
地址只是数字,描述各种符号在源程序中的位置,它是源代码文件中各符号偏移文件开头的距离。本质上,程序中各种数据结构的访问,就是通过“该数据结构的起始地址+该数据结构所占内存的大小”来实现的 。编译器给程序中各符号(变量名或函数名等)分配的地址,就是各符号相对于文件开头的偏移量。
在这里插入图片描述
编译器提供的关键宇 Section 只是为了让程序员在逻辑上将程序划分成几个部分,因为它是伪指令,程序员自己知道在哪个 section 中是什么就行啦。一般 section的应用场所是根据不同的属性人为地将程序划分几部分,如数据放在一个 section 中,指令放在另一个section 中,这样程序员便将指令和数据分开了,使代码结构清晰明了,更易于维护。程序如何划分,这个没有规定,完全是看程序员自己的风格喜好,甚至可以利用 section 把程序切得零碎不堪,所以你懂了,nasm 根本没必要知道你的 section 中到底是啥。
在这里插入图片描述
在这里插入图片描述
在 section 中添加了 vstart,这个参数是让编译器将 section 中的数据的地址以 vstart 的值
为起始,不再从整个程序开头算起。只有以程序开头。算起的地址才是真实存在的,在这个地址上能访问到相应的符号,所以不以程序开头算起的地址,必然在程序内部不存在,是虚拟的。vstart的作用是让程序加载时可以加载到相应的物理内存地址中。

2)实模式
实模式就是20位地址模式,访问的内存空间为1M。采用cs:ip的方式访问。
实模式下的ret指令:是在call调用函数之后,会把下一个要执行的ip值压入栈中,在函数执行之后,调用ret之后,会将栈中的数据弹出,置给ip回到之前的执行的地方。
ret (return )指令的功能是在楼顶(寄存器 SS: Sp 所指向的地址)弹出 2 字节的内容来替换 IP 寄存器,注意,我这里说的是“内容“,ret 指令不管里面的内容是不是地址,它只负责把当前栈顶处的内容弹出,并用它为 IP 寄存器赋值 。 至于内容的正确性应该由程序员自己控制。 ret 只置换了 IP 寄存器,也就是说,不用换段基址,属于近返回 。 既然我们称之为弹出钱,也就是说 ret 指令也要负责维护战顶指针,由于栈是从高地址往低地址发展,所以被回收的栈顶空间应该是使 sp 指针值变大,故 ret 指令会使 sp 指针+2 。
retf ( return far)是从栈顶取得 4 字节,栈顶处的 2 字节用来替换IP 寄存器,另外的 2 宇节用来替换cs 寄存器。同样, retf 也不会去检查从栈顶往上的 4 字节内容是不是偏移地址和段基址,它只负责弹出它们,并将它们分别载入代码段寄存器 cs 和指令指针寄存器 IP,由程序员负责战中数据的正确性。换句话说,在用 ret 或 retf 之前,程序员应该知道此时枝顶中的数据是什么,能不能用作返回地址。段寄存器都换了,说明这属于远返回 。 retf 指令也要负责维护栈顶指针,所以 retf 指令会使 sp 指针+4 。小结一下, ret 和 retf 的区别便是 ret 用于近返回, retf 用于远返回。
call 和 ret 是一对配合,用于近调用和近返回, call far 和 retf 是一对配合,用于远调用和远返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值