鱼C论坛

 找回密码
 立即注册
查看: 987|回复: 0

[汇编作业] 实验10 3.数值显示

[复制链接]
发表于 2023-2-17 23:14:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 拖着拖把去拖鞋 于 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:              mov  ax,data
                        mov  ds,ax
                        mov  si,0                         ; 记录当前字符串的写入位置
                        mov  bp,32                        ; 需要转换的数据的位置
                        mov  ax,stack
                        mov  ss,ax
                        mov  sp,32

                        mov  cx,6
    l0:                 push cx
                        mov  ax,ds:[bp]
                        call change_to_dec_init
                        add  bp,2
                        pop  cx
                        loop l0

                        mov  si,0                         ; 用于定位字符串数据
                        mov  di,0                         ; 用于定位显存位置
                        mov  dh,23                        ; 行号
                        mov  dl,30                        ; 列号
                        mov  bl,2                         ; 颜色
                        call show_str_init
                        mov  cx,6
    l1:                 push cx
                        call show_str_start
                        pop  cx
                        loop l1

                        mov  ax,4c00h
                        int  21h

    ; 名称: change_to_dec
    ; 功能: 将word型数据转变为表示十进制数的字符串,字符串以0结尾
    ; 参数: ax=wrod型数据
    ;      ds:si指向字符串首地址
    ; 返回: 无
    change_to_dec_init: mov  cx,0
                        push cx                           ; 作为结尾
    change_to_dec_start:mov  bx,10
                        mov  dx,0                         ; 避免参与除法计算
                        div  bx                           ; 除10得最后一位的值
                        mov  cx,dx                        ; 存入求出的十进制数
                        jcxz change_to_dec_ok
                        add  cx,30h                       ; 算出ASCII码中对应的十进制数
                        push cx                           ; 由于先算出来的是最后一位,先入栈暂存
                        jmp  short change_to_dec_start
    change_to_dec_ok:   pop  cx
                        mov  ds:[si],cl
                        inc  si
                        jcxz change_to_dec_end
                        jmp  short 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:      mov  ax,0b800h                    ; 显示区域的开头
                        mov  es,ax
                        mov  ch,0
                        mov  cl,dh
    ssil0:              add  di,160                       ; 计算跳到指定行的字节数
                        loop ssil0
                        mov  cl,dl
    ssil1:              add  di,2                         ; 计算跳到指定列的字节数
                        loop ssil1
                        ret
    show_str_start:     mov  ch,0
                        mov  cl,ds:[si]
                        jcxz show_str_ok
                        mov  es:[di],cl                   ; 存放需要显示的字符
                        mov  es:[di+1],bl                 ; 存放需要显示的颜色
                        inc  si
                        add  di,2
                        jmp  short show_str_start
    show_str_ok:        mov  byte ptr es:[di],0           ; 增加一个字符串之间的间隔
                        mov  byte ptr es:[di+1],0
                        add  di,2
                        inc  si                           ; 跳过字符串结尾的‘0’
                        ret
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 11:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表