組合語言(第3版,王爽著):實驗10-3 編寫子程式 數值顯示
阿新 • • 發佈:2022-05-26
- 思路:
- 根據第 10 章的第 9 小結,也就是 10.9 模組化程式設計的方法:將程式分為兩部分 數值的轉換 和 數值的顯示
- 因為 數值的顯示 在 實驗10-1 已經實現了 show_str,因此我們先將 數值的轉換 除錯好,再將 show_str 的程式引入進來
- 因為不斷的取餘,所以取得餘數的結果為 6、6、6、2、1,數值是逆著來的,我們可以將它們入棧
- 等到取餘過程結束,再將餘數出棧,放置到 data 段中
- 程式碼實現:
assume cs:code data segment db 10 dup (0) data ends code segment start: mov ax, 12666 mov bx, data mov ds, bx mov si, 0 call dtoc mov dh, 8 mov dl, 3 mov cl, 2 call show_str mov ax, 4c00h int 21h ; 數值的轉換 dtoc: ; 將 word 型資料轉變為十進位制的字串,字串以 0 位結尾符 push si push di push ax push bx push cx push dx ; 子程式中使用的暫存器入棧 remainder: mov dx, 0 mov di, 10 div di mov bx, 30H add bx, dx ; 餘數加上 30H push bx ; 將數值入棧 6 6 6 2 1 inc si mov cx, ax ; 將商放入 cx 中,用於判斷數值是否已經除盡 jcxz dtoc_ok jmp short remainder dtoc_ok: mov cx, si ; 將 6 6 6 2 1 出棧 mov si, 0 s: pop bx mov ds:[si], bl inc si loop s mov byte ptr ds:[si], 0 ; 雖然 data 段初始化的值都是 0,但是作為一個完整的子函式,還是需要在 12666 後面加 0 的 pop dx pop cx pop bx pop ax pop di pop si ; 子程式中使用的暫存器出棧 ret ; 數值的顯示 show_str: push ax push cx push dx push si push di push es ; 將子程式中使用的暫存器入棧 mov ax, 0b800h ; 視訊記憶體的起始地址 mov es, ax mov di, 0 mov al, 160 mul dh add di, ax ; 計算顯示的位置 mov ax, 2 mul dl add di, ax ; 計算顯示的位置 mov al, cl ; 字元的屬性值 change: mov ch, 0 mov cl, ds:[si] jcxz show_str_ok ; 條件轉移,如果 cx 為 0 則跳轉 mov es:[di], cl mov es:[di + 1], al inc si add di, 2 jmp short change show_str_ok: pop es pop di pop si pop dx pop cx pop ax ; 將子程式中使用的暫存器出棧 ret code ends end start
- 程式執行效果: