鱼C论坛

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

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

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

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

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

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

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

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

  7. stack segment
  8.           dd 32 dup (0)
  9. stack ends

  10. code segment
  11.     start:              mov  ax,data
  12.                         mov  ds,ax
  13.                         mov  si,0                         ; 记录当前字符串的写入位置
  14.                         mov  bp,32                        ; 需要转换的数据的位置
  15.                         mov  ax,stack
  16.                         mov  ss,ax
  17.                         mov  sp,32

  18.                         mov  cx,6
  19.     l0:                 push cx
  20.                         mov  ax,ds:[bp]
  21.                         call change_to_dec_init
  22.                         add  bp,2
  23.                         pop  cx
  24.                         loop l0

  25.                         mov  si,0                         ; 用于定位字符串数据
  26.                         mov  di,0                         ; 用于定位显存位置
  27.                         mov  dh,23                        ; 行号
  28.                         mov  dl,30                        ; 列号
  29.                         mov  bl,2                         ; 颜色
  30.                         call show_str_init
  31.                         mov  cx,6
  32.     l1:                 push cx
  33.                         call show_str_start
  34.                         pop  cx
  35.                         loop l1

  36.                         mov  ax,4c00h
  37.                         int  21h

  38.     ; 名称: change_to_dec
  39.     ; 功能: 将word型数据转变为表示十进制数的字符串,字符串以0结尾
  40.     ; 参数: ax=wrod型数据
  41.     ;      ds:si指向字符串首地址
  42.     ; 返回: 无
  43.     change_to_dec_init: mov  cx,0
  44.                         push cx                           ; 作为结尾
  45.     change_to_dec_start:mov  bx,10
  46.                         mov  dx,0                         ; 避免参与除法计算
  47.                         div  bx                           ; 除10得最后一位的值
  48.                         mov  cx,dx                        ; 存入求出的十进制数
  49.                         jcxz change_to_dec_ok
  50.                         add  cx,30h                       ; 算出ASCII码中对应的十进制数
  51.                         push cx                           ; 由于先算出来的是最后一位,先入栈暂存
  52.                         jmp  short change_to_dec_start
  53.     change_to_dec_ok:   pop  cx
  54.                         mov  ds:[si],cl
  55.                         inc  si
  56.                         jcxz change_to_dec_end
  57.                         jmp  short change_to_dec_ok
  58.     change_to_dec_end:  ret

  59.     ; 名称: show_str
  60.     ; 功能: 在指定的位置,用指定的颜色,显示一个0结尾的字符串
  61.     ; 参数: dh=行号(取值范围0~24)
  62.     ;      dl=列号(取值范围0~79)
  63.     ;      cl=颜色
  64.     ;      ds:si指向字符串首地址
  65.     ;      ds:di指向当前显示位置
  66.     ; 返回: 无
  67.     show_str_init:      mov  ax,0b800h                    ; 显示区域的开头
  68.                         mov  es,ax
  69.                         mov  ch,0
  70.                         mov  cl,dh
  71.     ssil0:              add  di,160                       ; 计算跳到指定行的字节数
  72.                         loop ssil0
  73.                         mov  cl,dl
  74.     ssil1:              add  di,2                         ; 计算跳到指定列的字节数
  75.                         loop ssil1
  76.                         ret
  77.     show_str_start:     mov  ch,0
  78.                         mov  cl,ds:[si]
  79.                         jcxz show_str_ok
  80.                         mov  es:[di],cl                   ; 存放需要显示的字符
  81.                         mov  es:[di+1],bl                 ; 存放需要显示的颜色
  82.                         inc  si
  83.                         add  di,2
  84.                         jmp  short show_str_start
  85.     show_str_ok:        mov  byte ptr es:[di],0           ; 增加一个字符串之间的间隔
  86.                         mov  byte ptr es:[di+1],0
  87.                         add  di,2
  88.                         inc  si                           ; 跳过字符串结尾的‘0’
  89.                         ret
  90. code ends

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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