拖着拖把去拖鞋 发表于 2023-2-17 23:14:38

实验10 3.数值显示

本帖最后由 拖着拖把去拖鞋 于 2023-2-20 21:56 编辑

按照题目要求, 写了两个子程序解决, 目前想到的最优解, 欢迎各位指导
; 将data段中的数据以十进制的形式显示出来
assume cs:code

data segment
         db 32 dup (0)
         dw 123,12666,1,8,3,38
data ends

stack segment
          dd 32 dup (0)
stack ends

code segment
    start:            movax,data
                        movds,ax
                        movsi,0                         ; 记录当前字符串的写入位置
                        movbp,32                        ; 需要转换的数据的位置
                        movax,stack
                        movss,ax
                        movsp,32

                        movcx,6
    l0:               push cx
                        movax,ds:
                        call change_to_dec_init
                        addbp,2
                        popcx
                        loop l0

                        movsi,0                         ; 用于定位字符串数据
                        movdi,0                         ; 用于定位显存位置
                        movdh,23                        ; 行号
                        movdl,30                        ; 列号
                        movbl,2                         ; 颜色
                        call show_str_init
                        movcx,6
    l1:               push cx
                        call show_str_start
                        popcx
                        loop l1

                        movax,4c00h
                        int21h

    ; 名称: change_to_dec
    ; 功能: 将word型数据转变为表示十进制数的字符串,字符串以0结尾
    ; 参数: ax=wrod型数据
    ;      ds:si指向字符串首地址
    ; 返回: 无
    change_to_dec_init: movcx,0
                        push cx                           ; 作为结尾
    change_to_dec_start:movbx,10
                        movdx,0                         ; 避免参与除法计算
                        divbx                           ; 除10得最后一位的值
                        movcx,dx                        ; 存入求出的十进制数
                        jcxz change_to_dec_ok
                        addcx,30h                     ; 算出ASCII码中对应的十进制数
                        push cx                           ; 由于先算出来的是最后一位,先入栈暂存
                        jmpshort change_to_dec_start
    change_to_dec_ok:   popcx
                        movds:,cl
                        incsi
                        jcxz change_to_dec_end
                        jmpshort change_to_dec_ok
    change_to_dec_end:ret

    ; 名称: show_str
    ; 功能: 在指定的位置,用指定的颜色,显示一个0结尾的字符串
    ; 参数: dh=行号(取值范围0~24)
    ;      dl=列号(取值范围0~79)
    ;      cl=颜色
    ;      ds:si指向字符串首地址
    ;      ds:di指向当前显示位置
    ; 返回: 无
    show_str_init:      movax,0b800h                  ; 显示区域的开头
                        moves,ax
                        movch,0
                        movcl,dh
    ssil0:            adddi,160                     ; 计算跳到指定行的字节数
                        loop ssil0
                        movcl,dl
    ssil1:            adddi,2                         ; 计算跳到指定列的字节数
                        loop ssil1
                        ret
    show_str_start:   movch,0
                        movcl,ds:
                        jcxz show_str_ok
                        moves:,cl                   ; 存放需要显示的字符
                        moves:,bl               ; 存放需要显示的颜色
                        incsi
                        adddi,2
                        jmpshort show_str_start
    show_str_ok:      movbyte ptr es:,0         ; 增加一个字符串之间的间隔
                        movbyte ptr es:,0
                        adddi,2
                        incsi                           ; 跳过字符串结尾的‘0’
                        ret
code ends

end start
页: [1]
查看完整版本: 实验10 3.数值显示