汇编语言设计实践:第6部分 子程序设计

上传人:博****1 文档编号:569793047 上传时间:2024-07-31 格式:PPT 页数:25 大小:447.50KB
返回 下载 相关 举报
汇编语言设计实践:第6部分 子程序设计_第1页
第1页 / 共25页
汇编语言设计实践:第6部分 子程序设计_第2页
第2页 / 共25页
汇编语言设计实践:第6部分 子程序设计_第3页
第3页 / 共25页
汇编语言设计实践:第6部分 子程序设计_第4页
第4页 / 共25页
汇编语言设计实践:第6部分 子程序设计_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《汇编语言设计实践:第6部分 子程序设计》由会员分享,可在线阅读,更多相关《汇编语言设计实践:第6部分 子程序设计(25页珍藏版)》请在金锄头文库上搜索。

1、1子程序子程序在一个程序的不同的地方需要多次使用的某在一个程序的不同的地方需要多次使用的某个程序段,将其进行独立编制。个程序段,将其进行独立编制。调用与返回:调用与返回:在主程序中需要使用该功能时,就转移到在主程序中需要使用该功能时,就转移到子程序执行,执行完后又返回原程序继续执行。子程序执行,执行完后又返回原程序继续执行。一、调用与返回指令一、调用与返回指令1、子程序的调用与返回、子程序的调用与返回 在汇编语言中,子程序是以在汇编语言中,子程序是以“过程过程”的形式表示。的形式表示。第第6章章 子程序设计子程序设计2PROC_NAME PROC NEAR/FAR . RET .PROC_NA

2、ME ENDP子程序的定义格式子程序的定义格式3主程序与子程序同在一个段内。这时,子程序的调用与返主程序与子程序同在一个段内。这时,子程序的调用与返回只需修改指令指针回只需修改指令指针IP。CODEA SEGMENT . CALL PROCAAAA: . .PROCA PROC near . RET .PROCA ENDP .CODEA ENDS(1)段内调用与返回)段内调用与返回 右图中指令右图中指令CALL PROCA就是段内调用。就是段内调用。4下面下面CODEB段中的段中的CALL FAR PTR PROCB就是段就是段间调用。间调用。CODEA SEGMENT CODEB SEGME

3、NT . .PROCB PROC . CALL FAR PTR PROCB . BBB: . RETPROCB ENDP CODEB ENDS .CODEA ENDS(2)段间调用与返回)段间调用与返回调用指令与子程序分别在不同的段,这时,需要同调用指令与子程序分别在不同的段,这时,需要同时修改时修改CS和和IP。5 两者都是无条件转移到目标单元,但两者都是无条件转移到目标单元,但CALL指指令要保存令要保存“断点断点”,而,而JMP指令不保存断点。指令不保存断点。(3)子程序调用指令与转移指令)子程序调用指令与转移指令JMP的区别的区别断点是调用子程序指令断点是调用子程序指令CALL的下一条

4、指令的地的下一条指令的地址。址。前述程序结构图中,前述程序结构图中,AAA和和BBB就是两条调用就是两条调用子程序指令的断点。子程序指令的断点。6 执行执行CALL指令时,先将断点压入堆栈中保存,指令时,先将断点压入堆栈中保存,然后转移到目标单元。然后转移到目标单元。 CALL指令的执行对各标志位无影响。指令的执行对各标志位无影响。CALL 过程名过程名2、调用指令、调用指令指令格式:指令格式:CALL 过程名过程名(1)段内调用)段内调用 (a) 段内直接调用段内直接调用例如:例如:CALL SUB17例如:例如:CALL BX CALL CX CALL WORD PTR 30HBXSI(b

5、)段内间接调用)段内间接调用 CALL 16位通用寄存器名称位通用寄存器名称 CALL 字类型的内存单元字类型的内存单元 8 调用指令提供一个双字存储单元的地址,它所指向的双调用指令提供一个双字存储单元的地址,它所指向的双字存储单元内容为被调用过程的起始地址。其中,两个低字存储单元内容为被调用过程的起始地址。其中,两个低字节存放偏移量,两个高字节存放段基值。字节存放偏移量,两个高字节存放段基值。(b) 段间间接调用段间间接调用例如:例如:CALL DWORD PTR DISPBXDI 由于在定义过程时,对提供段间调用的过程,已经由于在定义过程时,对提供段间调用的过程,已经说明其属性为说明其属性

6、为FAR。因此调用时,在。因此调用时,在CALL后直接书写后直接书写过程名,也可以在过程名前面加过程名,也可以在过程名前面加FAR属性修饰。属性修饰。(2)段间调用)段间调用(a)段间直接调用)段间直接调用例如:例如: CALL PROC_NAME CALL FAR PTR PROC_NAME93、返回指令、返回指令(2)段间返回)段间返回RET/RETF 执行该指令,将从堆栈顶部弹出两个字分别送执行该指令,将从堆栈顶部弹出两个字分别送IP和和CS中。中。 根据子程序的类型属性,返回指令也分为段内返回根据子程序的类型属性,返回指令也分为段内返回和段间返回。和段间返回。(1)段内返回)段内返回R

7、ET/RETN 执行该指令,将从堆栈顶部弹出一个字送入执行该指令,将从堆栈顶部弹出一个字送入IP。10段内返回段内返回 : RET N / RETN N 段间返回:段间返回:RET N / RETF N 其中其中N为一个立即数,且必须是一个偶数。为一个立即数,且必须是一个偶数。(1)从堆栈弹出)从堆栈弹出1个字送个字送IP(段内返回)或(段内返回)或2个字送个字送IP和和CS;(2)执行)执行 SP=(SP)+n 。将堆栈中已经用过的参数。将堆栈中已经用过的参数(n个字节个字节)弹出舍去弹出舍去.指令执行过程:指令执行过程:(3)带弹出值的返回指令)带弹出值的返回指令11二、编制子程序的基本规

8、范二、编制子程序的基本规范1、具有通用性和独立性、具有通用性和独立性2、选择适当的参数传递方法、选择适当的参数传递方法在主程序与子程序之间传递参数,可以选择的方法有:在主程序与子程序之间传递参数,可以选择的方法有: A、寄存器传递、寄存器传递 B、指定的存储单元传递、指定的存储单元传递 C、堆栈传递、堆栈传递12A、在主程序中保存子程序中将要使用的一些寄存器的、在主程序中保存子程序中将要使用的一些寄存器的内容内容.PUSH CXPUSHFCALL SUB1POPFPOP CX.3、子程序的现场保护、子程序的现场保护 现场保护可以有两种方法:现场保护可以有两种方法:13 B、在子程序中保存将要使

9、用的一些寄存器的内容、在子程序中保存将要使用的一些寄存器的内容SUB1 PROC PUSH CX PUSHF . ; 完成子程序功能指令序列完成子程序功能指令序列 POPF POP CX RETSUB1 ENDP4、正确使用堆栈、正确使用堆栈 由于堆栈中保存着主程序调用子程序时的断点地址。由于堆栈中保存着主程序调用子程序时的断点地址。若在子程序中也使用了堆栈,注意对各个数据压栈和出若在子程序中也使用了堆栈,注意对各个数据压栈和出栈的顺序不能错误,否则将导致数据的错误使用和子程栈的顺序不能错误,否则将导致数据的错误使用和子程序返回的地址错误。序返回的地址错误。14三、子程序设计举例三、子程序设计

10、举例例例 将两个给定的二进制数将两个给定的二进制数(8位和位和16位位)转换为转换为ASCII码字符码字符串。串。 主程序中提供被转换主程序中提供被转换的数据和转换后的的数据和转换后的ASCII码码字符串的存储区的首地址字符串的存储区的首地址开始开始取出待转换数据取出待转换数据给出存放结果首址给出存放结果首址给出转换的位数给出转换的位数调用转换子程序调用转换子程序取出待转换数据取出待转换数据给出存放结果首址给出存放结果首址给出转换的位数给出转换的位数调用转换子程序调用转换子程序结束结束主程序框图主程序框图15 子程序完成二进制数与子程序完成二进制数与ASCII码字符串的转换。子码字符串的转换。

11、子程序的入口参量有:被转换程序的入口参量有:被转换的数据、存储的数据、存储ASCII码字符码字符串的首址和转换的位数。无串的首址和转换的位数。无出口参量。出口参量。BINASC待转换的一位二进制数待转换的一位二进制数送送AL的第的第0位位DX= 待转换数据待转换数据DI=存放存放ASCII码首址码首址CX=转换的位数转换的位数AL= (AL) 01HAL= (AL)+30H存存ASCII码:码:(DI)= (AL)修改指针:修改指针:DI= (DI)+1计数:计数:CX= (CX)-1(CX)=0?返返 回回NY子程序框图:子程序框图:0的的ASCII码为码为30H,1的的ASCII码为码为3

12、1H。16源程序的数据段和堆栈安排如下:源程序的数据段和堆栈安排如下:DATA SEGMENTBIN1 DB 35HBIN2 DW 0AB48HASCBUF DB 20H DUP(?)DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS*用寄存器传递参量用寄存器传递参量*用堆栈传递参量用堆栈传递参量*用地址表传递参量用地址表传递参量 由于参量的传递方式有多种形式,其相应地在子程序由于参量的传递方式有多种形式,其相应地在子程序中取入口参量的方法也有所不同。下面介绍三种参量的传中取入口参量的方法也有所不同。下面介绍三种参量的传递方法

13、:递方法:171、用寄存器传递参量、用寄存器传递参量 设调用子程序时,入口参量为:被转换的数在设调用子程序时,入口参量为:被转换的数在DX中,若数位中,若数位16,则从高到低地存放则从高到低地存放,转换后的转换后的ASCII码的存放首址在码的存放首址在DI中。信息的保存由中。信息的保存由主程序完成。主程序完成。COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX XOR DX,DX LEA DI,ASCBUF;存放存放ASCII码的单元首址送码的单元首址送DI MOV DH,BIN1 ;待转换的第

14、待转换的第1个数据送个数据送DH MOV AX,8 ;待转换的二进制数的位数待转换的二进制数的位数 PUSH DI ;保护信息保护信息 CALL BINASC ;调用转换子程序调用转换子程序 POP DI ;恢复信息恢复信息 MOV DX,BIN2 ;待转换的第二个数据送待转换的第二个数据送DX MOV AX, 16 ADD DI,8 ;设置下一个数的存放首址设置下一个数的存放首址 CALL BINASC MOV AH,4CH INT 21H主程序主程序18BINASC PROC MOV CX,AXLOP: ROL DX,1 ;最高位移入最低位;最高位移入最低位 MOV AL,DL AND A

15、L,1 ;保留最低位,屏蔽其它位;保留最低位,屏蔽其它位 ADD AL,30H ;AL中即为该数字符(中即为该数字符(0或或1)的)的ASCII码码 MOV DI,AL ;存结果;存结果 INC DI ;修改地址指针;修改地址指针 LOOP LOP RETBINASC ENDPCOSEG ENDS END START 转换子程序转换子程序192、用堆栈传递参量、用堆栈传递参量(2)在子程序中保存)在子程序中保存CPU现场。现场。如果使用堆栈传递参量,一般应包括:如果使用堆栈传递参量,一般应包括:(1)在主程序中,将待转换的数据、存放)在主程序中,将待转换的数据、存放ASCII码的首址和转换的位

16、数压入堆栈;码的首址和转换的位数压入堆栈;20;主程序;主程序COSEG SEGMENTASSUME CS:COSEG,DS:DATA,SS:STACK1BEGIN:MOV AX,DATA MOV DS,AX MOV AH,BIN1 PUSH AX ;待转换数据压栈;待转换数据压栈 MOV AX,8 PUSH AX ;转换位数压栈;转换位数压栈 LEA DI,ASCBUF PUSH DI ;存放;存放ASCII码的首址压栈码的首址压栈 CALL BINASC ;调用转换子程序;调用转换子程序 MOV AX,BIN2 PUSH AX MOV AX,10H PUSH AX ADD DI,8 PUS

17、H DI CALL BINASC MOV AH,4CH INT 21HASCII码首址码首址位数位数待转换数据待转换数据执行执行CALL指令指令前堆栈情况前堆栈情况SP+2SP+4SP执行执行CALL指令指令后堆栈情况后堆栈情况SP+2SP+4SP待转换数据待转换数据位数位数ASCII码首址码首址返回地址返回地址SP+621;转换子程序;转换子程序BINASC PROC PUSH AX PUSH CX PUSH DX PUSH DI MOV BP,SP MOV DI,BP+10 ;从堆栈取入口参数从堆栈取入口参数 MOV CX,BP+12 MOV DX,BP+14;LOP: ROL DX,1

18、MOV AL,DL AND AL,1 ADD AL,30H MOV DI,AL INC DI LOOP LOP POP DI POP DX POP CX POP AXBP(DI)(DX)(CX)(AX)返回地址返回地址ASCII码首址码首址位数位数待转换数据待转换数据子程序中保存信息并子程序中保存信息并执行执行MOV BP,SP后后SPSP+2SP+4SP+6SP+822 RET 6 ;返回并从堆栈中弹出返回并从堆栈中弹出6个字节个字节BINASC ENDPCOSEG ENDS END BEGIN(DI)(DX)(CX)(AX)返回地址返回地址ASCII码首址码首址位数位数待转换数据待转换数据

19、执行执行RET 6前前SP(DI)(DX)(CX)(AX)返回地址返回地址ASCII码首址码首址位数位数待转换数据待转换数据执行执行RET 6后后SP233、用地址表传递参量、用地址表传递参量在调用子程序前,将所有参量的地址依次存放在一个在调用子程序前,将所有参量的地址依次存放在一个地址表中,将该表的首地址传送给子程序。地址表中,将该表的首地址传送给子程序。数据段部分改为:数据段部分改为:DATA SEGMENT BIN1 DB 35H BIN2 DW 0AB48H CUNT DB 8, 16 ASCBUP DB 20H DUP(?) ADR_TAB DW 3 DUP(0) ;存放参量地址表存

20、放参量地址表DATA ENDS传递参数也可以采用传递参量的地址来实现。传递参数也可以采用传递参量的地址来实现。24主程序中有关指令序列修改为:主程序中有关指令序列修改为:.MOV ADR_TAB,OFFSET BIN1 ;存参量地址存参量地址MOV ADR_TAB+2,OFFSET CUNTMOV ADR_TAB+4,OFFSET ASCBUPMOV BX,OFFSET ADR_TAB ;传表首址传表首址CALL BINASC8MOV ADR_TAB,OFFSET BIN2MOV ADR_TAB+2,OFFSET CUNT+1MOV ADR_TAB+4,OFFSET ASCBUP+8MOV B

21、X,OFFSET ADR_TAB ;传表首址传表首址CALL BINASC16.25BINASC PROCBINASC8: MOV DI,BX;取待转换;取待转换8位数据位数据 MOV DH,DI JMP TRANBINASC16: MOV DI,BX ;取待转换取待转换16位数据位数据 MOV DX,DITRAN: MOV DI,BX+2 ;取待转换数据位数取待转换数据位数 MOV CL,DI XOR CH,CH MOV DI,BX+4;取存取存ASCII码首址码首址LOP: ROL DX,1 MOV AL,DL ;待转换的待转换的1位送到位送到AL中转换中转换 AND AL,1 ADD AL,30H ;构成相应的构成相应的ASCII码码 MOV DI,AL ;存结果存结果 INC DI LOOP LOP RETBINASC ENDP转换子程序设置两个入口,一个是转换转换子程序设置两个入口,一个是转换8位数据的入口位数据的入口BINASC8,另一个,另一个是转换是转换16位数据的入口位数据的入口BINASC16。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号