汇编语言子程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.2.1 子程序调用指令
段内直接调用
段内调用
第7章 子程序设计
汇 编 语 言 程 序 设 计
格式: CALL DST/NEAR PTR DST 功能:(1)SP←SP-2 (SP)←IP (2)IP←IP+D16
类 型
格式: CALL DST/WORD 例:CALL MULLPTR DST 段内间接调用 功能 :(1)SP←SP 主程序和子程序处在同一代码段 ,只改变 IP值 -2 (SP)←IP (2)IP←(EA) 格式 : CALL 例: CALLFAR BX PTR DST 段间直接调用 功能:(1) SP← SP-2(SP)← CS CALL WORD PTR [SI] SP← SP-2(SP)← IP (2) IP←子程序偏移地址 CS←子程序段地址 段间调用 格式 :例: CALL DWORD DST 主程序和子程序处不在同一代码段 ,既改变 CALL IP 值也改变 FARPTR PTR CS 值 MULL 段间直接调用 功能:(1) SP← SP-2(SP)← CS SP← SP-2(SP)← IP (2) IP←(EA) CS←(EA+2) 例:CALL DWORD PTR [BX]
第7章 子程序设计
本章主要教学内容
1.子程序调用与返回指令。 2.子程序设计的基本过程和设计方法。
汇 编 语 言 程 序 设 计
本章主要教学目的及要求
1.理解掌握子程序调用与返回指令;
2.掌握子程序设计的基本过程和设计方法;
3.能熟练设计子支程序。
第7章 子程序设计
7.1 概述
7.1.1 子程序设计的概念
汇 编 语 言 程 序 设 计
第7章 子程序设计 【例7-4】将给定的一组字数据X、Y代入Z=((X+Y)×2-X)×4公式中,计算 相应的Z值
汇 编 语 言 程 序 设 计
开始
取数据区X、Y、Z的首地址分别 送SI、DI、BX,数据个数送CX AX=[SI],DX=[DI] 调SUBR子程序 开始 保护BX、CX寄存器内容 BX=AX AX=((AX+DX)*2-BX)*4 恢复CX、BX寄存器内容 返回 (b)子程序框图
汇 编 语 言 程 序 设 计
第7章 子程序设计
7.Hale Waihona Puke Baidu 子程序的参数传递方法
入口参数:主程序调用子程序前,把要加工的数据传给子程序,这
些数据称为入口参数 出口参数:子程序执行完后,要把执行结果传回主程序,这些数据
汇 编 语 言 程 序 设 计
称为出口参数
参数传递方式:寄存器传递、堆栈传递和存储单元传递
(3)可浮动性
(4)可递归和可重入性
7.1.3 子程序的优点
(1)简化了程序设计过程,使程序设计时间大量节省。 (2)缩短了程序的长度,节省了计算机汇编源程序的时间和程序的 存储空间。 (3)增加了程序的可读性,便于对程序的修改、调试。 (4)方便了程序的模块化、结构化和自顶向下的程序设计。
7.2 子程序调用和返回指令
第7章 子程序设计
通过寄存器传递参数应用举例
【例7-3】以BCDBUF为首地址的内存中存放着若干单元的用BCD码表示的十进制 数,每一个单元中存放两位BCD码,要求把它们分别转换为ASCII码,存放在 ASCBUF为首地址的单元中,且高4位BCD码转换成得ASCII码放在地址较高的单
汇 编 语 言 程 序 设 计
7.2.2 返回指令
含义:实现子程序执行完后要返回主程序的指令 功能:从堆栈的栈顶弹出数据作为返回地址 分类:段内返回和段间返回
第7章 子程序设计
汇 编 语 言 程 序 设 计
格式: RET 从栈顶弹出一个字数据送入 从栈顶弹出两个字数据分别送入 IP IP和CS 功能: IP←(SP) SP ←SP+2 段内返回
汇 编 语 言 程 序 设 计
;子程序功能段 ;现场恢复
4.子程序的设计方法
第7章 子程序设计
汇 编 语 言 程 序 设 计
(1)利用过程定义伪指令声明; (2)利用RET指令返回主程序; (3)对堆栈的压入和弹出操作要成对使用; (4)现场保护和现场恢复; (5)应安排在代码段的主程序之外,也可以放在主程序开始之前; (6)允许嵌套和递归; (7)可以与主程序共用一个数据段,也可以使用不同的数据段; (8)编写可以很灵活,但一定要保证堆栈操作的正确性; (9)处理好子程序和主程序间的参数传递问题(见7.4节); (10)提供必要的子程序说明信息。
;返回主程序
7.3.2子程序的调用与返回
调用子程序指令:CALL
第7章 子程序设计
汇 编 语 言 程 序 设 计
返回主程序指令:RET
【例7-2】以下程序用于计算=m!/(n!*(m-n)!)的值(m、n为自然数,且m>n)。 (假设阶乘乘积大小不超过两个字节)
开始 N送CX SUB1子程序开始 1送AX AX*CX送AX CX—1送AX N CX=0 Y 返回 调用SUB1子程序 AX(即n!)送BX M送CX
7.4.1 通过寄存器传递参数
第7章 子程序设计
汇 编 语 言 程 序 设 计
含义:主程序把入口参数送入某些寄存器,然后调用子程序,子程序中 直接使用存放入口参数的寄存器进行处理。子程序处理完数据, 将执行结果作为出口参数存入寄存器中,回到主程序,主程序对 存放在寄存器中的出口参数进行相应处理 特点:方便、直观,适于参数较少的情况 注意:用于传递出口参数的寄存器不能进行现场保护和恢复
元。并且要求边转换边显示这些ASCII码
第7章 子程序设计
DATA SEGMENT BCDBUF DB 12H,24H,96H,87H,71H,79H,56H,34H,63H,45H COUNT EQU $-BCDBUF ASCBUF DB 20 DUP(?) DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ STAPN DB 100 DUP (?) TOP EQU LENGTH STAPN STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV SI,OFFSET BCDBUF;BCD码的内存区首地址 MOV DI,OFFSET ASCBUF;ASCII码的内存区首地址 MOV CX,COUNT ;组合BCD码个数 CLD ;DF=0,按地址递增方式 LP:LODSB ;取一个组合BCD码 MOV BL,AL ;暂存 AND AL,0FH ;屏蔽高4位 OR AL,30H ;BCD码低位转换为ASCII码 MOV DL,AL ;存入DL STOSB ;存入ASCII码存储区 CALL DISP ;调用显示子程序 MOV AL,BL ;取回BCD码 PUSH CX ;保存计数值 MOV CL,4 SHR AL,CL ;取BCD码高4位 OR AL,30H ;BCD码高位转为ASC码 MOV DL,AL ;存入DL STOSB ;存入ASCII码存储区 CALL DISP ;调用显示子程序 POP CX ;弹出计数值 LOOP LP ;计数不为0则继续 MOV AH,4CH;为0则返回DOS INT 21H ;子程序名:DISP ;功能:显示ASCII码字符 ;入口参数:ASCII码在DL中 DISP PROC ;子程序定义开始 MOV AH,2 ;显示ASCII码 INT 21H MOV DL,’ ’ MOV AH,2 INT 21H RET ;返回主程序 DISP ENDP CODE ENDS END START
[BX]=AX,SI=SI=2,DI=DI+2 BX=BX+2,CX=CX-1
子程序清单: MOV AX,BX MCDST PROC NEAR/FAR MOV BX,DX PUSH AX ;保护现场 JMP AGAIN PUSH BX EXIT:MOV CX,BX PUSH DX POP DX POP BX AGAIN:XOR DX,DX ;AX值扩展到DXAX中 POP AX DIV BX ;商存入AX,余数存入DX AND DX,DX RET MCDST ENDP JZ EXIT ;余数为0转EXIT ;余数不为0更新被除数 ;更新除数 ;继续循环 ;最大公约数存入CX ;恢复现场
RET
RET n
类 型
段间返回
格式: RET n 功能:IP←(SP) SP ← SP+2 SP ← SP+n
格式: RET 功能:IP ←(SP) SP ← SP+2 CS ←(SP) SP ← SP+2 RET n 格式: RET n 功能:IP ←(SP) SP ← SP+2 CS ←(SP) SP ← SP+2 SP ← SP+n
含义:被独立出来的程序段称为子程序或过程
主程序与子程序之间的关系
主程序 CALL SUB1 (断点1:) 子程序 SUB1:
汇 编 语 言 程 序 设 计
RET
CALL SUB2 (断点2:)
SUB2:
HTL
RET
7.1.2 子程序的特性
(1)功能独立 (2)通用性
第7章 子程序设计
汇 编 语 言 程 序 设 计
第7章 子程序设计
2.子程序调用方法说明 包括: (1)子程序名; (2)子程序功能; (3)占用寄存器; (4)入口参数; (5)输出参数; (6)子程序调用示例。
汇 编 语 言 程 序 设 计
第7章 子程序设计
3.现场保护和现场恢复 现场保护:在子程序的功能实现前把将要用到的寄存器中的原有内 容保存起来 现场恢复:子程序的功能实现后,将数据取出再送回原来的寄存器中
子程序定义应用举例 【例7-1】求两个数的最大公约数子程序
第7章 子程序设计
汇 编 语 言 程 序 设 计
子程序调用方法说明: ;子程序名:MCDST ;功 能:求两个正整数的最大公约数; ;入口参数:AX和BX中存放两个正整数; ;出口参数:CX中存放求得的最大公约数; ;寄存器占用:使用AX、BX、CX、DX寄存器,CX中内容被改变, AX、BX、DX中的内容保持不变。
例:子程序SUB1中用到了寄存器AX、BX、CX、DX, 注意:现场保护应与现场恢复的顺序正好相反。 则可能的现场保护和现场恢复如下: SUB1 PROC PUSH AX PUSH BX PUSH CX PUSH DX ┆ POP DX POP CX POP BX POP AX RET SUB1 ENDP ;现场保护
调用SUB1子程序
AX/BX(即m!/n!)送BX
m—n送CX
调用SUB1子程序 AX(即(m—n)!)送BX AX/BX(即m!/n!/ (m—n)!)送AX
存储AX 结束
第7章 子程序设计
DATA SEGMENT M EQU 8 N EQU 3 RES DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,N CALL SUB1 ;调子程序计算n! MOV BX,AX MOV CX,M CALL SUB1 ;调子程序计算m! DIV BX ;m!/n!送 AX MOV BX,AX MOV CX,M SUB CX,N CALL SUB1 ;调用子程序,计算(m-n)! XCHG BX,AX DIV BX ;m!/n!/ (m-n)! 送AX MOV RES,AX MOV AH,4CH INT 21H SUB1 PROC ;计算阶乘的子程序 MOV AX,1 NEXT:MUL AX,CX LOOP NEXT RET SUB1 ENDP CODE ENDS END START
RET
7.3 子程序的定义、调用和返回
7.3.1 子程序定义
1.子程序定义伪指令 格式: 〈子程序名〉 PROC NEAR/FAR ┆ ┆ RET 〈子程序名〉 ENDP
第7章 子程序设计
汇 编 语 言 程 序 设 计
说明: (1)主程序和子程序在同一代码段中,定义为NEAR型。 (2)主程序和子程序不在同一代码段中,定义为FAR型。 (3)可将主程序定义为FAR型,看作是DOS调用的一个过程。
相关文档
最新文档