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