汇编语言与接口技术课件 h3-4 子程序设计_第1页
汇编语言与接口技术课件 h3-4 子程序设计_第2页
汇编语言与接口技术课件 h3-4 子程序设计_第3页
汇编语言与接口技术课件 h3-4 子程序设计_第4页
汇编语言与接口技术课件 h3-4 子程序设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、13 34 4 子程序设计子程序设计 将程序中经常出现或者具有通用性的某一段指令组定义为子程序,可以缩短程序长度,节省内存空间,在80 x86汇编程序中,子程序常常以过程的形式出现(过程的定义与调用)。 3 34 41 1 过程定义过程定义 格式: 过程名 PROC TYPEUSES REG 过程体 RET n n 过程名 ENDP TYPE:为过程类型,分为近程NEAR(本段调用)和远程FAR(跨段调用)。 USES REG:规定需要保护的通用寄存器(过程开始入栈,返回之前再出栈恢复)。2例3.36 定义一个过程名为SUB1的近程过程。 SUBl PROC NEAR ADD AX,BX MO

2、V SI,CX MOV AX,DX RET SUB1 ENDP3例3.37 定义一个过程名为SUB2的远程过程。 SUB2 PROC FAR MOV BX,AXMOV CL,3SHL BX,CL ADD AX,BX RET SUB2 ENDP4342 调用指令(调用指令(直接调用和间接调用) 1段内直接调用段内直接调用 格式:CALL NEAR PTR PROC NAME 功能:将当前IP/EIP寄存器内容进栈(即保存CALL下一条指令的偏移地址)。 将过程名为PROC NAME的16位/32位偏移地址和当前IP/EIP值相加后,送IP/EIP寄存器中,采用相对寻址控制程序转移到过程。在16位

3、模式下,转移位移量为2152151字节内。在32位模式下,转移位移量为2312311字节内。 例3.38 CALL SUB1 ;NEAR可以省略。 5 2段内间接调用段内间接调用 格式1:CALL NEAR PTRREG 格式2:CALL REG 功能:将当前IP/EIP寄存器内容进栈(即保存CALL的下一条指令的偏移地址)。 将过程的入口偏移地址送IP/EIP寄存器中,在寄存器寻址方式下,偏移地址在16位或32位REG中。在存储器寻址方式下,间接给出存放在数据段的偏移地址。 例3.39 CALL NEAR PTRBX CALL EBX6 3段间直接调用段间直接调用 格式:CALL FAR P

4、TR PROC NAME 功能:将当前CS、IP/EIP寄存器内容进栈(即保存CALL的下一条指令的偏移地址)。 将过程名为PROC NAME的段基址或段选择符送CS,16位或32位偏移地址送IP/EIP寄存器中。 例3.40 CALL FAR PTR SUB2 7 4段间间接调用段间间接调用 格式:CALL FAR PTRREG 功能:当前CS、IP/EIP寄存器内容进栈(即保存CALL指令下一条指令的偏移地址)。 指令以存储器间接寻址方式给出过程的偏移地址、段基址或段选择符,将段基址或段选择符和偏移地址取出送CS 及IP/EIP寄存器中。 85返回指令返回指令 格式1:RET 格式2:RE

5、T OPR ; OPR为偶数 功能:根据过程类型( NEAR、 FAR)确定返回类型。 近程返回是从堆栈弹出调用时保存的偏移地址送IP/EIP。 远程返回是从堆栈弹出调用时保存的偏移地址送IP/EIP,再弹出段基址或段选择符送CS,控制程序返回。 指定OPR的作用:完成RET操作后根据OPR的值修改堆栈指针SP/ESP,用于清除过程调用时入栈的参数。9 344 子程序设计子程序设计 1过程属性的确定(段内:NAER、段间:FAR) 2过程的调用和返回(CALL、RET) 过程中堆栈的使用,应该保证执行RET指令时,出栈内容为CALL指令保存的调用点地址,否则会导致程序运行出错。 3寄存器的保护

6、和恢复( PUSH和POP、 USES REG伪指令) 为简化主程序的工作,对寄存器的保护与恢复工作一般在子程序中进行(只保存和恢复过程中使用的寄存器)。10例3.43 保存和恢复寄存器保存和恢复寄存器 SUB1 PROC PUSH AX ;保护寄存器 PUSH BX PUSH CX PUSH DX 过程体 POP DX ;恢复寄存器 POP CX POP BX POP AX RET SUB1 ENDP SUB2 PROC USES AX,BX,CX,DX 过程体 RET SUB2 ENDP11 4主程序与子程序之间的参数传递(入口参数和出口参数) 入口参数:主程序传送给子程序的参数。 出口参

7、数:子程序执行完时,传送回主程序的结果。 参数传递的3种形式: 1通过寄存器传送参数; 2通过地址表传送参数; 3通过堆栈传送参数或参数地址。12 例3.44 将BUF缓冲区数据( 099 )转换为十进制数据在屏幕上显示。 MODEL SMALL DATA ;数据段开始 BUF DB ? ;存放待显示数据 CODE ;代码段开始 STARTUP ;程序开始 MOV AL,BUF ;待显示数据 送AL中 CALL DISP ;调用DISP显示 十进制数 EXIT ;返回DOS将存在AL中数(099)按十进制数方式显示DISP PROC NEAR PUSH DX ;保存DX MOV AH,0 ;清

8、除AH寄存器 AAM ;将AL中内容转化成 BCD码存入AX中 (AL/10,商AH,余AL) ADD AH,20H CMP AH,20H ;判定是否以0开头 JE DISP1 ;起始为0,显示空格 ADD AH,10H ;转换成ASCII码DISP1:MOV DL,AH ;显示第一个数字 MOV AH,6 ;6号功能调用, 从标准I/O设备 输入或输出字符 PUSH AX INT 21H POP AX MOV DL,AL ADD DL,30H ;将第二个数字转 换成ASCII码 MOV AH,6 ;显示第二个数字 INT 21H POP DX ;恢复DX RETDISP ENDP END ;

9、文件 13 DISP PROC NEAR USES DX,CX,BX MOV CX,0 ;位数计数器清0 MOV BX,10 LP1: MOV DX,0 DIV BX ;DX:AX除以10 PUSH DX ;保存余数 INC CX ;计数器加1 OR AX,AX ;检测商是否为0 JNZ LP1 ;商不为0则继续执 行除以10的操作 LP2: POP DX ;取余数 MOV AH,6 ;使用06H号功能 调用 ADD DL,30H ;将DL中内容转换 成ASCII码 INT 21H ;显示该位数值 LOOP LP2 ;重复执行直到显 示完全部数据 RET DISPX ENDP END 例3.4

10、5 对任意二进制数转换成十进制数在屏幕上显示。 算法:除10取余。不断除10,依次得到个位、十位、百位,直到商为0。 编程实现:用循环结构。循环结束条件:商为0。 MODEL SMALL DATA BUF DW ? CODE ;代码段开始 STARTUP ;程序开始 MOV AX,BUF ;待显示数据 装入AX中 CALL DISP ;按十进制数 显示AX中内容 EXIT ;返回DOS14INCHAR PROC MOV BL,0 MOV CH,2 LPl: MOV AH,1 ;接收键入字符 INT 21H CMP AL,30H ;输入字符和0 比较 JB DONE ;低于0则转 CMP AL,

11、39H ;输入字符和9 比较 JA DONE ;高于9则转 AND AL,0FH ;将 ASCII码转 换为十进制数 XCHG AL,BL MOV CL,0AH MUL CL XCHG AL,BL ADD BL,AL DEC CH JNZ LP1 ;输入字符不够两 位则转 JMP KKKDONE: MOV AH,1 ;置非法字符标志 KKK: RET INCHAR ENDP 例3.46 将键盘键入的2位十进制数转换为十六进制数,并且显示输出。 算法:十位数10个位数 MODEL TINY CODE 586 STARTUP RPE:CALL INCHAR ;接收十进制数 CALL OUTCHAR

12、 ;转换为十六 进制数并显示 CALL DIS ;回车换行 JMP RPE 15OUTCHAR PROC TEST AH,1 JNZ PPP ;非法字符转 MOV DL,20H MOV AH,2 ;显示空格 INT 21H MOV CX,2 ;进行2位十六 进制转换 LP2:ROR BL,4 MOV AL,BL AND AL,0FH OR AL,30H CMP AL,39H JNA LP3 ADD AL,7 LP3:MOV DL,AL MOV AH,2 ;显示输出 INT 21H LOOP LP2 PPP: RETOUTCHAR ENDP DIS PROC MOV DL,0DH ;回车 MOV

13、 AH,2 INT 21H MOV DL,0AH ;换行 MOV AH,2 INT 21H RET DIS ENDP EXIT END 该程序原则上能将n位十进制数转换为十六进制,只需 ALAX BLBX nCH 例:3246= BL和AH:子程序INCHAR的输出参数,又是子程序OUTCHAR的输入参数 通过寄存器传递参数 。 16 例3.47 编写一个测量字符串长度的程序。设字符串以0为结束标志,利用堆栈传递参数。 利用堆栈传递参数可以不占用寄存器,也无需使用额外的存储单元。 通常利用堆栈传递入口参数,而利用寄存器传递出口参数。 MODEL SMALL STACK 100H DATABUF

14、 DB AFE36TY78,0LEN DB ? CODE ;代码段开始 STARTUP ;程序开始 MOV BX,OFFSET BUF ;把入口参数(字符串起始地址)压入堆栈 PUSH BX CALL SLEN ;调用子程序, 执行调用指令后堆栈如图3.15(b) MOV LEN, AX ;保存字符串长度值 EXIT ;从子程序返回后堆栈如图3.15(d) 17SLEN PROC USES BP,DI MOV BP,SP ;执行此指令后的堆栈如图3.15 (c)所示 MOV DI, BP+6 ;取入口参数(BP寻址时默认的段寄存器是SS ) MOV AL, 0 ;置要找的结束标志值 LP1: CMP AL, DI ;判是否为字符串尾 JZ LP2 ;是字符串尾则转 INC DI JMP LP1 ;继续 LP2: MOV AX, DI SUB AX, BP+6 ;计算字符串长度 RET 2 ;恢复寄存器内容并清除堆栈中无用工作区 (堆栈传递的串偏移地址)SLEN ENDP END 18 例3.41 通过堆栈向过程传送参数通过堆栈向过程传送参数 MODEL SMALL STACK 100 DA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论