寄存器的保护与恢复与相关子程序的书写

子程序为了完成一些功能,通常要使用一些寄存器来存放内容,有时候还要使用一些存储单元来存放内容,也就是说,在子程序运行时通常会破坏一些寄存器原有的内容,如果不采取措施,在调用子程序之后,主程序就无法在使用存放在这些寄存器或者存储单元的原有内容了,这常常会导致主程序错误,为此,要对有关的寄存器或存储单元进行保护和恢复

寄存器的保护和恢复的方法有两种

【1】把需要保护的寄存器的内容,在主程序中压入堆栈和弹出堆栈,这种方法的优点是在每次调用子程序的时候,只要把主程序所关心的寄存器压入堆栈即可,但是缺点是在主程序中使用压入和弹出堆栈操作会使得主程序不容易理解,如果要多次调用子函数,常常会忘记把某个寄存器压入堆栈

【2】在子程序一开始就把子程序中要改变的寄存器内容压入堆栈,在返回之前在恢复这些寄存器的内容这是一种常用的方法

子程序的书写举例

例题1,写一个把ASCII码则表示的两位十进制数转换为对应二进制数的子程序

 1 ;入口参数:DH = 十位数ASCII码,DL = 个位数ASCII码
 2 ;出口参数AL = 对应二进制数
 3 SUBR        PROC
 4                     MOV     AL,DH
 5                     AND AL,0FH
 6                     MOV AH,10
 7                     MUL AH
 8                     MOV AH,DL
 9                     AND AH,0FH
10                     ADD AL,AH
11                     RET
12 SUBR         ENDP
View Code

例题2:写一个把16位二进制数转换为4位十六进制数ASCII码的子程序

 1 ;入口参数:DX= 欲转换的二进制数
 2 ;                            DS:BX = 存放转换所得ASCII码串的缓冲区首地址
 3 ;出口函数:十六进制数ASCII码串按照高位到低位的顺序存放在指定的缓冲区中
 4 HTASCS            PROC
 5                 MOV         CX,4
 6 HTASCS1:ROL DX,1
 7                     ROL  DX,1
 8                     ROL  DX,1
 9                     ROL  DX,1
10                     MOV AL,DL
11                     CALL HTOASC
12                     MOV [BX],AL
13                     INC BX
14                     LOOP HTASCS1
15                     RET
16 HTASCS        ENDP
View Code

版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3705228.html

原文地址:https://www.cnblogs.com/fengdashen/p/3705228.html