总结:汇编语言(第3版)--第十章 CALL 和 RET 指令

第十章  CALL 和 RET 指令

call 和 ret 指令都是转移指令,它们都修改 IP ,或同时修改 CS 和 IP 。它们经常被共同用来实现子程序的设计。

  • ret 和 retf :ret 指令用栈中的数据,修改 IP 的内容,从而实现近转移;retf 指令用栈中的数据,修改 CS 和 IP 的内容,从而实现远转移。
  • call 指令 :CPU 执行 call 指令是,进行两步操作,首先将当前的 IP 或 CS 和 IP 压入栈中,然后转移。
  • 依据位移进行转移的 call 指令 :利用执行 “call 标号” 来执行转移。
  • 转移的目的的地址在指令中的 call 指令 :前面讲的 call 指令,其对应的机器指令中并没有转移的目的地址,而是相对于当前 IP 的转移位移。“call far ptr 标号” 实现的是段间转移。
  • 转移地址在寄存器中的 call 指令: 用汇编语言来解释此种格式的 call 指令, CPU 执行 “call 16 位 reg” 时,相当于进行:push IP    jmp 16 位 reg 
  • 转移地址在内存中的 call 指令: 转移地址在内存中的 call 指令有两种格式:call word ptr 内存单元地址 和 call dword ptr 内存单元地址。
  • call 和 ret 的配合使用: 以上分别学习了 ret 和 call 指令原理,这一部分主要是将它们配合使用来实现子程序的机制。
  • mul 指令: mul 是乘法指令,使用 mul 做乘法主要要注意两点,分别是两个相乘的数 和 结果。
  • 模块化程序设计: 利用 call 和 ret  指令,我们可以用简捷的方法,实现多个相互联系、功能独立的子程序来解决一个复杂的问题。
  • 参数和结果传递的问题: 参数和返回值传递的问题,实际上就是探讨,应该如何存储子程序需要的参数和产生的返回值。
  • 批量数据的传递: 批量数据放在内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。
  • 寄存器冲突的问题: 解决这个问题简捷的方法是,在子程序的开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。可以用栈来保存寄存器中的内容。

希望我的总结可以帮助大家,感谢阅读我的博客!

猜你喜欢

转载自blog.csdn.net/weixin_42558631/article/details/81138784