1. 程式人生 > 其它 >組合語言(第3版,王爽著):實驗10-3 編寫子程式 數值顯示

組合語言(第3版,王爽著):實驗10-3 編寫子程式 數值顯示

  • 思路:
  1. 根據第 10 章的第 9 小結,也就是 10.9 模組化程式設計的方法:將程式分為兩部分 數值的轉換數值的顯示
  2. 因為 數值的顯示實驗10-1 已經實現了 show_str,因此我們先將 數值的轉換 除錯好,再將 show_str 的程式引入進來
  3. 因為不斷的取餘,所以取得餘數的結果為 6、6、6、2、1,數值是逆著來的,我們可以將它們入棧
  4. 等到取餘過程結束,再將餘數出棧,放置到 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
  • 程式執行效果: