標准的子程序結構
利用跳轉可以實現子程序調用。所謂調用,實際上就是程序轉移到該標號去繼續執行。。這種方式雖然簡便,但是在模塊化程序結構設計中,是不規范的。尤其是其它模塊中的某個程序想要調用這個子程序時,還需要指明該子程序標號是在哪個模塊、哪個代碼段的哪個程序中。
標准的用法是用8086匯編語言提供的過程定義偽指令PROC來定義子程序。
示例 從鍵盤鍵入一個多位十進制數X,回車結束輸入。按十進制位相加后顯示十進制結果Y。
設計思路:
(1) 主程序分別調用三個子程序。
(2) 子程序SUBR1為鍵盤輸入多位十進制數且直接保存到X,輸入的位數在BX;
(3) 子程序SUBR2將保存的X去掉ASCII碼,按位相加,相加的結果在BX中;
(4) 子程序SUBR3將BX中的數用十進制顯示;
(5) 采用將結果除以10保存余數的方法將BX中的數轉換為十進制數,並用十進制數的ASCII碼顯示結果。
(6) 傳參寄存器為BX。
代碼:
1 ;a.asm 鍵入一個十進制數x,按位相加后顯示十進制結果y。 2 data segment 3 infor1 db 0ah,0dh,'x=$' 4 infor2 db 0ah,0dh,'y=$' 5 x db 20 dup(?) 6 data ends 7 code segment 8 assume cs:code,ds:data 9 start: mov ax,data 10 mov ds,ax 11 ;主程序 12 main proc far ;主程序定義,遠程的 13 mov x,0 14 mov dx,offset infor1 ;顯示提示1 15 mov ah,9 16 int 21h 17 mov bx,0 ;傳參寄存器bx清0 18 call subr1 ;調子程序1 19 mov cx,bx ;保存x的位數 20 mov ax,0 21 mov bx,0 22 call subr2 ;調子程序2 23 mov dx,offset infor2 ;顯示提示2 24 mov ah,9 25 int 21h 26 call subr3 ;調子程序3 27 jmp main 28 out1: mov ah,4ch 29 int 21h 30 main endp 31 ;子程序1:鍵盤輸入、保存 32 subr1 proc near ;定義子程序1,近程的 33 mov ah,1 ;鍵盤輸入十進制數 34 int 21h 35 cmp al,0dh ;回車? 36 jz exit 37 cmp al,'0' ;其它非法字符? 38 jl out1 ;是轉out1,直接退出 39 cmp al,'9' 40 jg out1 41 mov x[bx],al ;保存鍵入的數碼 42 inc bx ;BX=數碼個數 43 jmp subr1 44 exit: cmp bx,0 ;第一鍵就是回車 45 jz out1 46 ret ;返回主程序 47 subr1 endp 48 ;子程序2,按位相加 49 subr2 proc near ;定義子程序2,近程的 50 mov ah,x[bx] ;取出鍵入的數碼 51 and ah,0fh ;去掉ASCII碼 52 add al,ah ;按位相加 53 inc bx 54 loop subr2 ;循環累加 55 mov ah,0 56 mov bx,ax ;相加結果→bx傳參寄存器 57 ret ;返回主程序 58 subr2 endp 59 ;子程序3,將bx中的數顯示為十進制數 60 subr3 proc near ;定義子程序3,近程的 61 mov ax,bx ;bx為傳參寄存器 62 mov cx,0 63 mov bx,10 64 let1: ;將ax變為十進制數 65 mov dx,0 ;字除法的高字清0 66 inc cx ;統計余數個數 67 div bx ;除以10,商在AX,余數在DX 68 push dx ;保存余數 69 cmp ax,0 70 jnz let1 71 let2: ;循環顯示余數,循環次數在cx中 72 pop ax ;將余數彈入ax 73 add ax,0030h ;調整為ASCII碼 74 mov dl,al ;2號功能顯示 75 mov ah,2 76 int 21h 77 loop let2 78 ret ;返回主程序 79 subr3 endp 80 code ends 81 end start
