8086匯編語言程序設計——子程序與模塊化


標准的子程序結構

利用跳轉可以實現子程序調用。所謂調用,實際上就是程序轉移到該標號去繼續執行。。這種方式雖然簡便,但是在模塊化程序結構設計中,是不規范的。尤其是其它模塊中的某個程序想要調用這個子程序時,還需要指明該子程序標號是在哪個模塊、哪個代碼段的哪個程序中。

標准的用法是用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM