第六章子程序结构 过程定义伪操作 子程序的调用与返回 保存与恢复寄存器 子程序的参数传送 子程序的嵌套与递归
1 第六章 子程序结构 • 过程定义伪操作 • 子程序的调用与返回 • 保存与恢复寄存器 • 子程序的参数传送 • 子程序的嵌套与递归
1.过程定义伪操作 过程名 PROC NEAR(FAR) 过程名ENDP (1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用)
2 1. 过程定义伪操作 过程名 PROC NEAR ( FAR ) 过程名 ENDP (1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用) . .
code segment segx segment subt proc far main proc far ret call subr1 subt endp ret call subt main endp segx ends subl proc near segy segment ret subl endp call subt code ends segy ends
3 code segment main proc far …… call subr1 …… ret main endp subr1 proc near …… ret subr1 endp code ends segx segment subt proc far …… ret subt endp …… call subt …… segx ends segy segment …… call subt …… segy ends
2.子程序的调用与返回 子程序调用:隐含使用堆栈保存返回地址 call near ptr subp (1)保存返回地址 2)转子程序 sP)→(IP) call far ptr subp (1)保存返回地址 (2)转子程序 sP)→(工P) (CS) 子程序返回:ret
4 子程序调用:隐含使用堆栈保存返回地址 call near ptr subp (1) 保存返回地址 (2) 转子程序 call far ptr subp (1) 保存返回地址 (2) 转子程序 子程序返回:ret 2. 子程序的调用与返回 (SP)→ (IP) (IP) (CS) (SP)→
3.保存与恢复寄存器 subt proc far push ax push bx push CX push d 面面面面面面 pop dx pop CX pop bx pop ret subt endp 5
5 3. 保存与恢复寄存器 subt proc far push ax push bx push cx push dx …… …… pop dx pop cx pop bx pop ax ret subt endp
4.子程序的参数传送 (1)通过寄存器传送参数 (2)通过存储器传送参数 (3)通过地址表传送参数地址 (4)通过堆栈传送参数或参数地址 (5)多个模块之间的参数传送
6 (1) 通过寄存器传送参数 (2) 通过存储器传送参数 (3) 通过地址表传送参数地址 (4) 通过堆栈传送参数或参数地址 (5) 多个模块之间的参数传送 4. 子程序的参数传送
例:十进制到十六进制的转换(通过寄存器传送参数) decihex segment ;10>16 assume cs: decihex main proc far push d: sub axax push ax repeat: call decibin ;10→>2 call crlf ;回车换行 call binhex ;2→>16 call crlf Jmp epeat ret main ndp decitex ends end main 7
7 例:十进制到十六进制的转换(通过寄存器传送参数) decihex segment ; 10→16 assume cs: decihex main proc far push ds sub ax, ax push ax repeat: call decibin ; 10→2 call crlf ; 回车换行 call binihex ; 2→16 call crlf jmp repeat ret main endp …… …… …… decihex ends end main
decibin proc near binhex proc near moy bx 0 moV newchar: mov ah, 1 rotate: mov int 21h rol bx. Cl sub al, 30h mov a 1,0fh cmp al, 9 dd al, 3oh Jg exIt cmp 3ah cbw println xchg moV CX. dd al. 7 i printit: mov d, al CX mov an, xchg ax, bx int 21h add bx, ax dec ch jmp newchar nz rotat exit: ret ret decibin endp binhex end crlf proc near d. odh moy ah 2 int 21h mov d. oah mov ah. 2 int 21h t crlf end
8 decibin proc near mov bx, 0 newchar: mov ah, 1 int 21h sub al, 30h jl exit cmp al, 9 jg exit cbw xchg ax, bx mov cx, 10 mul cx xchg ax, bx add bx, ax jmp newchar exit: ret decibin endp binihex proc near mov ch, 4 rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h cmp al, 3ah jl printit add al, 7 printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate ret binihex endp crlf proc near mov dl, 0dh mov ah, 2 int 21h mov dl, 0ah mov ah, 2 int 21h ret crlf endp
例:十六进制到十进制的转换(通过寄存器传送参数) hexidec segment 16→>10 assume cs: hexidec main proc f start: push ds sub axax push ax repeat cal hexibin ;16>2 call crlf call binded 2→>10 call crlf ]mp repeat ret maIn endp hexidec ends end start
9 例:十六进制到十进制的转换(通过寄存器传送参数) hexidec segment ; 16→10 assume cs: hexidec main proc far start: push ds sub ax, ax push ax repeat: call hexibin ; 16→2 call crlf call binidec ; 2→10 call crlf jmp repeat ret main endp …… …… …… hexidec ends end start
binidec proc near hexibin proc mov Cx. 10000d moy bx. 0 call dec di newchar mov Cx, 1000d moV call dec div Int b al. 3oh mov cx. 100d exl t call dec div cmp a 10 mov cx. 10d add to call dec div ub al 27h cmp al, Oah mov cx. 1d exit call dec div cmp al, 10h ret ]ge exIt add to moV C binidec endp shi bx. Cl mov al dec_div proc near add ax moy ax. bx jmp newchar mov dx. 0 exit hexibin endp div Cx moy bx dx moy d al add d 30h moy ah. 2 int 21h ret d d ec a7 v endp 10
10 hexibin proc near mov bx, 0 newchar: mov ah, 1 int 21h sub al, 30h jl exit cmp al, 10 jl add_to sub al, 27h cmp al, 0ah jl exit cmp al, 10h jge exit add_to: mov cl, 4 shl bx, cl mov ah, 0 add bx, ax jmp newchar exit: ret hexibin endp binidec proc near mov cx, 10000d call dec_div mov cx, 1000d call dec_div mov cx, 100d call dec_div mov cx, 10d call dec_div mov cx, 1d call dec_div ret binidec endp dec_div proc near mov ax, bx mov dx, 0 div cx mov bx, dx mov dl, al add dl, 30h mov ah, 2 int 21h ret dec_div endp