笔记目录

  • call指令和ret指令【笔记】
    • 1 引子
    • 2 call和ret的简单运用
    • 3 call指令本质含义详解
    • 4 ret指令
    • 5 总结及汇编环境资源

call指令和ret指令【笔记】

1 引子

   在高级语言中,常有主程序调用其他子程序,子程序还可以调用子程序…,比如在C语言中,在main主函数里调用cube函数,该函数被执行完后返回main函数,然后程序继续往下执行,如下:

#include <stdio.h>
int main(){int cube();//函数的声明int a = cube();//调用函数...return 0;
}
//定义函数
int cube(){printf("hello");return 10;
}

  在汇编语言中也有类似的这种机制,能实现主程序调用子程序。这就要使用call和ret汇编指令

2 call和ret的简单运用

2.1功能简述
  call指令可以实现调用一个子程序,在子程序里使用ret指令结束子程序的执行并返回主程序(类比C语言中的main函数调用cube函数进行理解),主程序继续往下执行。

2.2指令格式

  • call 标号 或者call far 标号
  • ret 或者 ret n

2.3标号位数

  • 16位位移=”标号所在偏移地址“ - call指令的下一条指令的偏移地址
  • 16位位移的范围"-32768~32767",补码表示

2.4示例:(”;“符号是8086汇编的注释符)

...
mov ax,0
call s     ;s是标号,执行call后,执行s标号所在的子程序
mov ax,4c00h
int 21hs:add ax,1             ;标号所在子程序mov bx,10ret                        ;子程序执行完后,返回主程序

3 call指令本质含义详解

3.1实质:call指令是一个流程转移指令,就是让程序执行的顺序发生短暂的改变,去执行别处地址上的指令,遇到ret指令后再回到原来的地方继续往下顺序执行,本质和jmp大同小异,区别是在jmp基础上增加了程序回到原来跳转处的功能。

3.2call执行步骤:(cpu执行call指令)

  • 第一步:将当前的ip或者cs和ip压入栈中。即跳转前保存call指令的下一条指令的首地址
  • 第二步:转移到标号处执行子程序。即修改ip或者cs和ip里的内容(对比jmp详解篇理解)

第一步分析
先看一个汇编源程序

assume cs:code,ss:stack
stack segmentdb 8 dup (0)
stack ends
code segment
start:  mov ax,stackmov ss,axmov sp,8call smov ax,0mov ax,4c00hint 21hs:    mov bx,0add bx,1ret
code ends
end start

编译后对应的机器码和汇编指令

知道call指令的下一条指令的偏移地址是000B,即取call指令完后ip的内容就为000B,紧接着执行call指令,由第一步知晓执行call指令时,当前的ip或者cs和ip压入栈中。
(备注:cpu执行一条指令分为两步(t命令):1.取指令、2.执行指令)
我们再来看一下执行call指令之前栈段里的内存情况

此时栈里发现有数据(p指针左边的一个字的数据是”01A3“,这个数当作随机数处理)先不管这些数据,我们看到ip的值为”0008“,到目前为止只是执行call指令之前的代码,并未对栈里添加数据。接下来我们执行call指令,然后再观察栈顶数据,如下

发现栈顶的数据已经变为000B(这地址是call指令的下一条指令首地址,上文提到过),可能会想入栈的数据不是执行call指令时,当前的ip(图2中绿色划线)或者cs:ip(这里不讨论该种情况)的内容吗?,但别忘了,执行一条指令后,本该就要执行下一条指令(即ip=ip+指令长度,所对应的指令的,它就是call的下一条指令,因此ip变为000B),ip自增后发现执行的是call指令,然后进行第一步的入栈操作。(call指令还未完全执行)

接着分析第二步
  此时ip=000B,按理来说要执行ip=000B处的指令,但call指令的目的不就是使指令跳转吗,因此它还要修改ip为目的地的偏移地址,所以ip=0013(标号或目的地所在的偏移地址)。从而call指令实现,当前地址的保存(实质是下一条指令的首地址入栈)和程序的跳转。

4 ret指令

  理解call指令,ret指令就很容易明白,执行ret指令时,会把栈中原先存入的地址出栈,并送入到ip寄存器里,ret指令等价于”pop ip“的效果(没有pop ip这样的指令,是非法的

5 总结及汇编环境资源

指令格式 示例
call 标号 -仅仅修改ip,修改范围一个字
call 16位寄存器 -等价于call 标号
call far ptr 标号 -同时修改cs和ip,段间转移(调用子程序),先把cs入栈再把ip入栈
call word ptr 内存单元地址 -仅修改ip,段内转移,例如:… ptr ds:[idata]
call dword ptr 内存单元地址 -同时修改cs和ip,段间转移,先把cs入栈再把ip入栈,例如:…ptr ds:[idata]会把以idata为起始地址,长度为两个字的内存单元取出来,低地址的字单元存放偏移地址,高地址的字单元存放段地址。
ret -把原先压入栈的ip内容进行出栈,并送入ip中,等价于pop ip
retf -把原先压入栈的cs和ip出栈,同时修改ip和cs,先修改出栈ip再出栈cs,等价于:
– pop ip
– pop cs
ret n - n是任意取的数字,一般n为栈中除开ip或者cs和ip数据外的其他数据占用的字节单元数,表示忽略栈中的数据,把栈顶指针移动到栈底。

备注:没有pop ip这样的指令,是非法的,笔记中仅是为了方便理解而使用

8086汇编环境资源免费获取【DOSBox】
链接:https://pan.baidu.com/s/1aRv4k6DVlJtGkHQDB6WjrA
提取码:8086

call指令和ret指令【笔记+详解】相关推荐

  1. 西门子S7-1200PLC PID功能指令介绍及组态步骤详解

    西门子S7-1200PLC PID功能指令介绍及组态步骤详解 S7-1200 PID Compact V2 指令介绍 PID 指令块的参数分为两部分,输入参数与输出参数.其指令块的视图分为扩展视图与集 ...

  2. call指令和ret指令的配合使用

    call指令和ret指令的配合使用 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846633.html

  3. Call指令和Ret指令讲解

    Call指令和Ret指令讲解 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846630.html

  4. python线程池(threadpool)模块使用笔记详解

    这篇文章主要介绍了python线程池(threadpool)模块使用笔记详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近在做一个视频设备管理的项目,设备包括(摄像 ...

  5. 零、RISC-V SoC软核代码笔记详解——前言

    目录 0 RISC-V SoC注解系列文章目录 1 前言(手绘RISC-V SoC内核RTL试图): 2. 开源工程tinyriscv使用教程: 3. 开源工程tinyriscv下载地址: 4. 开源 ...

  6. linux中top指令,Linux下top命令详解

    原标题:Linux下top命令详解 1.简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top显示系统当前的进程和其他状况 ...

  7. JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet

    详解Set集合中实现类:LinkedHashSet以及TreeSet 1.LinkedHashSet概述 2.TreeSet概述 2.1 自然排序 2.1.1 TreeSet存储常见引用数据类型 2. ...

  8. 数字IC笔记-详解建立时间和保持时间

    详解建立时间和保持时间 1.定义: 建立时间和保持时间是数字电路-触发器(flip-flop)的一个概念. 建立时间指时钟上升沿来临之前信号保持稳定的最小时间. 保持时间指时钟上升沿来临之后信号保持稳 ...

  9. CTF PWN基础知识(寄存器、栈、汇编指令、标志位)详解

    本文中寄存器缩写都有标注上中文含义,方便初学者理解记忆. 寄存器: 寄存器是计算机暂存指令.数据和地址的地方. 常用寄存器及其功能整理: RIP:程序计数寄存器,来存放下一条即将用来执行的指令的地址, ...

最新文章

  1. Android EditView 软键盘把布局顶上去的处理方法
  2. 数据结构-算法: 分配排序(基数分配排序法)
  3. int能表示的数据范围(在VS2017下,int和long都是32位)
  4. Python selenium —— 用chrome的Mobile emulation模拟手机浏览器测试手机网页
  5. 搭建高可用的redis集群,避免standalone模式带给你的苦难
  6. java 大流量高并发_【BAT面试题】如何应对大流量、高并发??
  7. 年轻人选择创业时,最好避开门槛低的行业
  8. caas k8s主控节点如何查询_k8s中部署prometheus监控告警系统prometheus系列文章第一篇...
  9. VMware 虚拟机桥接网络设置
  10. 【HTML】【简易电子相册】超链接
  11. hadoop 虚拟化基础
  12. Communication(Floyed+并查集 || Trajan)
  13. select下拉框如何显示提示语,不要出现下拉选项中
  14. U盘写保护的解决办法,亲自实践,原创!
  15. switch 贯穿的妙用
  16. 地图中的矢量POI兴趣点
  17. 查看电脑使用了多长时间
  18. Linux 下安装java环境
  19. airsim 安装指导(无人机、无人车视觉导航仿真平台)
  20. 使用Matlab对矩阵元素进行大小排序(开源)

热门文章

  1. 小清新风格的微信公众号图文这样排版,看过的都说好。
  2. 机器人李继红_李继宏
  3. RSA加密算法讲解及C++实现
  4. Linux下文件重命名、创建、删除、修改及保存文件
  5. Oracle数据库视频教程 28讲高清视频
  6. js 获取系统时间
  7. 计算机传奇人物之詹姆斯·高斯林
  8. chtMultiRegionFoam求解器及算例分析
  9. C语言 正序分解整数
  10. HTML5 APP开发环境的框架搭建