汇编语言-子程序调用

ret与ref指令

ret

ret == pop IP

ret指令用栈中的数据,修改IP的内容,从而实现近转移;

功能介绍

retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移
CPU执行ret指令时,进行下面两步操作:

(1)(IP) = ((ss) * 16 + (sp))(2)(sp) = (sp) + 2

相当于进行:

pop IP

retf

retf == pop IP + POP CS

功能介绍

CPU执行retf指令时,进行下面两步操作:

(1)(IP) = ((ss) * 16 + (sp))
(2)(sp) = (sp) + 2
(3)(CS) = ((ss) * 16 + (sp))
(4)(sp) = (sp) + 2

相当于进行:

pop IP
pop CS

call指令

call 标号

功能介绍

(把当前IP压栈后, 转到标号处执行指令)

a. (SP) = (SP) - 2((SS) * 16 + SP) = (IP)
b. (IP) = (IP) + 16位位移

相当于:

push IP
jmp near ptr 标号
  • 16位位移 = “标号”处的地址 - call指令后的第一个字节的地址;
  • 16位位移的范围 -32768—-32767, 用补码表示;
  • 16位位移由编译程序在编译时算出;

call far ptr 标号

功能介绍

(把当前CS,IP压栈后, 转到标号处执行指令)

a. (SP) = (SP) - 2((SS) * 16 + SP) = (CS)
b. (SP) = (SP) - 2((SS) * 16 + SP) = (IP)
c. (CS) = 标号所在段的段地址(IP) = 标号在段中的偏移地址

相当于:

push CS
push IP
jmp par ptr 标号

call 16位寄存器

功能介绍

(sp) = (sp) – 2
((ss) * 16 + (sp)) = (IP)
(IP) = (16位寄存器) 

相当于:

push IP
jmp 16位寄存器

call word ptr 内存单元地址

功能介绍

push IP
jmp word ptr 内存单元地址

实例展示

mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
call word ptr ds:[0]
执行后,(IP)=0123H,(sp)=0EH

call dword ptr 内存单元地址

功能介绍

push CS
push IP
jmp dword ptr 内存单元地址

实例展示

mov sp, 10h
mov ax, 0123h
mov ds:[0], ax
mov word ptr ds:[2], 0
call dword ptr ds:[0]
执行后,(CS)=0,(IP)=0123H,(sp)=0CH
((IP)= ds:[0], (CS) = ds:[2])

子程序调用

通过上面介绍的两个指令,我们可以完成子程序的调用。简单调用程序如下:

assume cs:codecode segment
start:  mov ax,1mov cx,3call smov bx, axmov ax,4c00Hint 21Hs:  add ax,axloop sretcode ends
end start

子程序调用-传递参数问题

我们在写c语言或者其他高级语言的时候,要经常用到函数之间的参数传递这一个概念。那么在汇编语言中,我们怎么做到总程序和子程序之间的参数传递呢?

寄存器存放法

首先可以考虑在寄存器中,存放数据,比如a存放在ax中,b存放在bx中。

mov ax,a
mov bx,b

这种方式可以在参数比较少的时候使用,但是参数多了呢?那么那么多的寄存器给你存放。因此这种方式不是长久之计。

内存存放法

我们想到了一个比较好的思路,就是将参数保存到内存中,然后在寄存器中存放这些参数的首地址,通过首地址访问一系列的参数。这种方式,显然可以存放更多的数据,并且没有数量上的限制。

;参数存放段
data segmentdb 'aaaaa',0db 'aaaaa',0db 'aaaaa',0
data endscode segment ......mov ax,datamov es,axmov si,0call sub1......sub1:   mov ax,es[si]......retcode ends

这里还是存在一个问题,如果在主程序中用到了一个xx寄存器,然后在子程序中也用到了这个xx寄存器,那么当子程序返回到主程序的时,主程序中存放参数的内存地址已经没有记录了,程序出错。

内存存放法(改进)

为了解决这个问题,我们需要每次进入子程序时,将子程序中的需要用到的寄存器,push到栈中,每次退出子程序时,将相应寄存器pop出来。

子程序都应遵循下面的模式:

capital:push cxpush sichange:mov cl,[si]mov ch,0jcxz okand byte ptr[si],11011111Binc sijmp short changeok: pop sipop cxret

转载于:https://www.cnblogs.com/AbeDay/p/5026848.html

汇编语言-子程序调用相关推荐

  1. 汇编语言——子程序调用

    主程序与子程序 调用语句CALL CALL指令分成4种类型 CALL子程序名 ;段内直接调用 CALL far ptr子程序名; 段间直接调用 不是很常用的 CALL r16 CALL WORD PT ...

  2. 子程序调用与宏定义的异同_冒泡排序_汇编语言的子程序调用与宏定义实现

    1 子程序 ;环境为ADS 子程序调用 AREA MAIN,CODE,READONLY ENTRY CODE32 start BL MAOPAO stop MOV R0,#0x18 LDR R1,=0 ...

  3. ARM中C语言和汇编语言互相调用以及实例

    1.内联汇编 在C语言中内嵌汇编注意事项: 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令 在使用物理寄存器时,不要使用过于复杂的C表达式(比如ADD y,R0 ,x/y(无形中就是c语言表达 ...

  4. 子程序调用与宏定义的异同_微机原理 宏指令及子程序设计实验:宏指令和子程序的区别...

    西安邮电学院 微机原理实验报告 题 目: 宏指令及子程序设计实验 院系名称: 班 级: 学生姓名: 学号(8位): 指导教师: 2.5 宏令及子程序设计实验 2.5.1 实验目的 1.熟悉宏指令.宏定 ...

  5. 子程序调用与宏定义的异同_宏指令及子程序设计实验

    一.实验目的及实验环境 实验环境: 1.熟悉宏指令.宏定义.宏调用以及宏展开的概念:掌握宏指令的定义与调用 的方法. 2.掌握子程序的定义.调用以及调用程序与子程序之间参数的传递方法. 3.了解宏指令 ...

  6. C语言与汇编语言相互调用原理以及实例

    下面两个分别是一个foo.asm(汇编语言文件),bar.c(c语言文件) 首先来了解C语言为什么能调用汇编语言,以及汇编语言为什么能调用C语言.其实不管是C语言还是汇编语言想要执行都是最终编译链接成 ...

  7. for循环10000次花多长时间_我的三菱FX PLC学习之子程序调用与循环

    戳上方蓝字 "技成电工课堂" 关注我们哦! 上次,我们学习了程序流程转移中的条件跳转CJ,这次,我们接着向子程序调用CALL和FOR循环发起进攻吧! 显然,子程序调用CALL和FO ...

  8. 汇编语言---子程序设计举例(两组数据相加)

    汇编语言---子程序设计举例(两组数据相加) 配置环境 要求 编辑程序 运行程序 后续 配置环境 首先双击下载程序进行下载.(没有安装程序的,可以下载我为大家准备的安装文件.) 不会安装的可以看一下文 ...

  9. LC-3 子程序调用与模拟栈调用递归函数

    目录 TRAP机制调用子程序 TRAP调用 TRAP返回 例子 TRAP x21 (系统函数)输出字符源码 模拟栈 方法介绍 栈指针 存取数据 函数栈帧结构 一次递归调用需要的语句 汇编代码 运行结果 ...

最新文章

  1. 图解二叉树的先中后序遍历
  2. 双指针 - 长按键入
  3. hadoop的安装-配置文件修改
  4. 各类木材强度_凯狄解析各类抽芯铆钉的工作原理
  5. mysql怎么分组查询所有数据库_Mysql-4 分组查询与子查询
  6. 如何更好地优化大数据分析
  7. 作用域和请求参数传递
  8. HTTP代理服务器 - CONNECT SSL/TLS 原理
  9. 微信小程序如何上传图片
  10. 华南联络易-管理培训老师的神助手
  11. 毕业论文的奋斗记(一)
  12. 学系统集成项目管理工程师(中项)系列15_质量管理
  13. 【洛谷 P5149】 会议座位【归并排序】
  14. HTML5+CSS3小实例:有趣的沙漏加载动画
  15. SQL CASE语句的使用
  16. PyQt5_pyqtgraph股票SAR指标
  17. Linux 防火墙策略——APF
  18. Git-Gitlab中如何删除项目
  19. 1.27 Watermelon
  20. [转] 程序员也要养生

热门文章

  1. Android利用百度地图定位
  2. linux下mysql设置关联_Linux下mysql安装与配置
  3. 时间同步失败_关于同步、异常处理的思考
  4. 分析原因型思维模型框架_分析营销型网站优化效果不佳的主要原因
  5. qlv视频转换器免费版_迅捷视频转换器无法转换腾讯视频怎么办?亲测操作快速转换...
  6. 处理minist数据集,把网络和数据都放在gpu上面。
  7. Java课程烧CPU吗_java程序员:完了!CPU一味求快出事儿了!
  8. idata界面_iData手持终端常见问题集,持续更新中...
  9. 微服务架构的优缺点_微服务架构DNS服务注册与发现实现原理
  10. 算法提高 陶陶摘苹果(java)