主程序与子程序

调用语句CALL

  • CALL指令分成4种类型

      1. CALL子程序名 ;段内直接调用
      1. CALL far ptr子程序名; 段间直接调用
  • 不是很常用的

      1. CALL r16
        CALL WORD PTR m16;段内间接调用(IP发生改变)
      1. CALL DWORD ptr mem;段间间接调用(存储器)
  • CALL指令需要保存返回地址:

    • 段内调用——在同一代码段内进行, 也称近调用偏移地址IP入栈
      SP←SP- 2, SS:[SP]←IP
    • 段间调用——在不同代码段之间进行,也称远调用
      段地址CS和偏移地址IP和入栈
      SP←SP- 2, SS:[SP]←CS
      SP←SP- 2, SS:[SP]←IP

返回指令RET

子程序返回指令

  • 功能:弹出堆栈中由CALL指令压入的返回地址值,迫使CPU返回到主程序中CALL指令的下一条指令去继续执行,该指令常放在子程序的最后
  • 说明:根据段内和段间、有无参数,具体分成4种情况
    (1) RET ;无参数返回
    (2) RET n ;有参数返回 n参数的作用
    需要弹出CALL指令压入堆栈的返回地址
    (3)段内返回——偏移地址IP出栈
    IP←SS:[SP], SP←SP+2
    (4)段间返回——偏移地址IP和段地址CS出栈
    IP←SS:[SP], SP←SP+2
    CS←SS:[SP], SP←SP+2

子程序的定义

使用过程定义语句:
过程名 PROC

过程名 ENDP

子程序结构

  • 调用指令的执行过程
    1、保护断点
    将调用指令的下一条地址(断点)压入堆栈(CS,IP)
    2、获得子程序的入口地址(label)
    子程序第一条指令地址
    3、执行子程序(程序员完成)
    功能实现,参数的保存和恢复(CS,IP)
    4、恢复断点
    将断点的偏移地址弹出。
  • 子程序(过程)调用应处理好三个问题
    1、保护断点(CS,IP入栈及出栈)
    2、保护现场:子程序中用到寄存器/存储器需要保护
    3参数传递:
    寄存器传递:速度快,参数少(寄存器就在CUP内部)
    存储器传输(可存放的数据多)
    堆栈传递

用寄存器传递参数

例:用子程序计算数组元素累加和
入口参数:CX=元素个数,BX=元素的偏移地址 DS:BX=数组的段地址:偏移地址
出口参数:AL=累加和

  • 把参数存于约定的寄存器中,可以传值,也可以传址。
    子程序对带有出口参数的寄存器不能保护和恢复(主程序视具体情况进行保护)
    子程序对带有入口参数的寄存器可以保护,也可以不保护;但最好一致
  • 使用寄存器传递参数时
    带有入口参数的寄存器可以保护,也可以不保护;
    带有出口参数的寄存器则一定不可保护和恢复;
    其他与出口参数无关、而子程序中使用 的寄存器,子程序开始处应该保护,子程序结束、返回主程序之前应该恢复。

用变量传递参数

主程序和子程序直接采用同一个变量名共享同一个变量,实现参数的传递.不同模块间共享时,需要声明

Data segment
COUNT   EQU 5
ARRAY   DB 12H,25H,0F0H,0A3H,03
RESULT  DB ?
Data endsCode segmentassume cs:code, ds: datastart:mov ax,datamov ds,axCALL CHECK
Code ends
End startCHECK PROC……LEA BX,ARRAY
……
CHECK ENDP

用堆栈传递参数

主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数
子程序将出口参数压入堆栈,主程序弹出堆栈取得它们
多用于数组操作

例子

  • 存储器传递参数
    将一个字节BCD码(十进制数)转换成二进制数
    ;使用寄存器:CX
    ;入口参数: AL存放两位BCD
    ;出口参数: AL存放二进制数
    ;调用其它子程序:无
BCD2BIN PROC FARPUSH CXMOV CH,ALAND CH,0FHMOV CL,4 SHR AL,CLMOV CL,10MUL CLADD AL,CHPOP CXRET
BCD2BIN ENDP

数据段定义两个字型数组,编程序实现数组分别求和(不计溢出),要求用子程序实现求和。
解:

DATA SEGMENT
ARY1 DW 100 DUP(?) ; 定义数组1
SUM1 DW ?;和
ARY2 DW 100 DUP(?) ;定义数组2
SUM2 DW ?;和
DATA ENDSCODE   SEGMENT ASSUME   CS:CODE,DS:DATA
START: MOV AX, DATA MOV DS, AXLEA  SI, ARY1           ;数组1首地址,入口参数 MOV  CX, (SUM1-ARY1)/2  ;数组1加操作次数,入口参数(数组1的长度即length ARY1。/2因为DW)CALL SUB_SUM            ;调用求和子程序 MOV  SUM1,AX            ;数组1之和送SUM1 LEA  SI, ARY2           ;数组2首地址,入口参数 MOV  CX, (SUM2-ARY2)/2  ;数组2加操作次数,入口参数 CALL SUB_SUM            ;调用求和子程序 MOV  SUM2,AX            ;数组2之和送SUM2 MOV  AH, 4CH INT  21H
;子程序名 SUB_SUM
;功能:完成一个数组中元素的相加
;入口参数:数组首地址SI,数组元素相加的次数CX
;出口参数:相加结果存在AX中
;占用寄存器:AX
SUB_SUM  PROC   NEAR           ;子程序 XOR   AX, AX            ;AX清0 L1: ADD   AX, WORD PTR[SI]  ;加数组元素 INC   SIINC   SI ;以字为地址,SI要加2LOOP  L1 ;cx-1RET                     ;子程序返回
SUB_SUM   ENDP
CODE      ENDS END   START

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

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

    汇编语言-子程序调用 ret与ref指令 ret ret == pop IP ret指令用栈中的数据,修改IP的内容,从而实现近转移: 功能介绍 retf指令用栈中的数据,修改CS和IP的内容,从而实 ...

  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. python 结构风险与经验风险 VC维 SRM SVM
  2. c++Hash Search哈希搜索的实现算法(附完整源码)
  3. C++课程设计,12306模拟写起来就是这么粗暴
  4. eshop截取字符串长度 和去掉省略号
  5. leetcode - 764. 最大加号标志
  6. 现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞后?
  7. 磁盘IO性能监控(Linux 和 Windows)
  8. [python 笔记]:序列详解:字符串,列表,元组,range对象
  9. Study 7 —— CSS美化背景和边框
  10. 【 地图系列 】 世界地图和主要国家的 JSON 文件
  11. matlab中fic算法,基于MatLab的三种群Volterra模型数值求解.pdf
  12. java newline_Java BufferedWriter newLine()方法
  13. Three.js坐标系与变换矩阵快速入门
  14. 解决Post请求中文乱码问题
  15. 又一个阿里离职的 P10 大佬
  16. 晨风机器人安卓版_晨风qq机器人
  17. 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放
  18. 《宏景国际教育》会计工作:刚刚拿到德勤 Offer,和大家分享一下求职经历
  19. android开发笔记之APK大小优化
  20. 安装Ubuntu 14.10后要做的事(下)—— 开发工具篇

热门文章

  1. web3py 环境搭建
  2. Linux部署Jaeger
  3. 映美Jolimark BP-900K(医疗版) 打印机驱动
  4. php 时间戳 精确到秒,时间戳与时间相互转换(php .net精确到毫秒)
  5. MongoDB + PostgreSQL中文社区 南京技术大会
  6. [Swift]LeetCode832. 翻转图像 | Flipping an Image
  7. 知客CRM,管理软件优质选择
  8. 解决多卡加载预训练模型时,卡0总会比其他卡多占用显存,多卡占用显存不均
  9. VMware虚拟机对外暴露ip的操作
  10. mysql 分区表 限制_MySQL分区表的局限和限制-阿里云开发者社区