汇编语言程序设计(十)call和ret指令

引言

  • call和ret都是转移指令,它们都修改IP,或者同时修改CS和IP

ret和retf指令

  • ret和retf都是利用栈中数据来重新填充IP(CS)。

ret指令

  • ret指令利用栈中的内容,修改IP的内容,从而实现近转移
  • cpu执行ret指令时,进行两步操作,即先用栈顶的数据来修改IP,然后将栈顶元素出栈。

retf指令

  • retf指令用栈中的数据,同时修改CS和IP,从而实现远转移
  • cpu执行retf指令时,进行四步操作:

call指令

  • call指令通常跟ret指令配合使用,CPU执行call指令,进行两步操作:
    ** 一,将当前的IP或 CS与IP压入栈中
    ** 二、转移,jmp
  • call指令实现原理和jmp一样,但是call指令不能实现短转移,至少是近转移或段间转移,

用法:call 标号

  • call 标号,将当前的IP压栈后,转移到标号处执行指令,即如下两步操作:
  • 其中跳转那一步相当于 call near ptr 标号的意思

call far ptr 标号

  • call标号实现的是近转移,call far ptr 标号实现段间转移,其原理如下:

call 16位寄存器

  • 本质是用16位寄存器给出了要跳转的偏移地址,即先把当前ip入栈,然后用寄存器给出的数据重新赋值ip

转移地址在内存中call指令

call word ptr 内存地址单元

  • 单字16位,因此只在段内跳转,call word ptr 内存地址单元 用汇编语言解释原理类似下边:

call dword ptr 内存地址单元

  • 双字32位,因此同时修改CS和IP,汇编语言解释如下:

mul指令

  • 乘法命令,相乘的两个数位数要相同
  • mul指令的结果,如果乘数都是8位的,则结果存放在AX中,如果乘数都是16位的,则结果的高位存放在DX中,低位存放在AX中。
  • mul指令格式,mul reg 或 mul 内存单元,之所以只给出一个乘数,是因为另一个乘数默认存在AL中或AX中。

call与ret联合使用

  • call和ret联合使用可以实现过程,即函数。通常我们将调用函数时候的参数放到一个参数寄存器中,将子函数要返回的结果放到一个结果寄存器中。

批量数据的传递

  • 如果子程序只有少量参数需要传递,那么用寄存器来传递即可,但是如果由很多个参数呢?返回值也有可能很多个?在这种时候,需要将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序,对于返回值也可以用这种方法。
  • 除了寄存器,内存传递参数外,还有一种通用的方法,即使用栈来传递参数。

寄存器冲突的问题

  • 不看了
posted @   肖肖凯  阅读(763)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示