汇编语言(第3版,王爽著):实验10-3 编写子程序 数值显示

实验10-3 编写子程序-数值显示

1. 思路:

  1. 根据第 10 章的第 9 小结,也就是 10.9 模块化程序设计的方法:将程序分为两部分 数值的转换数值的显示
  2. 因为 数值的显示实验10-1 已经实现了 show_str,因此我们先将 数值的转换 调试好,再将 show_str 的程序引入进来
  3. 因为不断的取余,所以取得余数的结果为 6、6、6、2、1,数值是逆着来的,我们可以将它们入栈
  4. 等到取余过程结束,再将余数出栈,放置到 data 段中

2. 代码实现:

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

3. 程序运行效果:

实验10_3 程序运行效果 1

实验10_3 程序运行效果 2

posted @ 2022-05-26 13:03  夏夜星空晚风  阅读(124)  评论(0编辑  收藏  举报