鱼C论坛

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

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

[复制链接]
发表于 2020-3-17 17:39:21 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 雪球丶 于 2020-3-17 22:46 编辑
  1. assume cs:code,ss:stack

  2. data segment
  3.         db 10 dup(0)
  4. data ends

  5. stack segment
  6.         db 128 dup(0)
  7. stack ends

  8. ;将12666以十进制的形式在屏幕的8行3列用绿色显示出来
  9. code segment
  10. start:
  11.                 mov ax,stack
  12.                 mov ss,ax
  13.                 mov sp,128
  14.                
  15.                 mov ax,12666  ;12666=317AH
  16.                 mov dx,0H
  17.                 mov bx,data
  18.                 mov ds,bx
  19.                 mov si,0
  20.                 call dtoc
  21.                
  22.                 mov dh,8
  23.                 mov dl,3
  24.                 mov cl,2
  25.                 call show_str
  26.                
  27.                 mov ax,4C00H
  28.                 int 21H


  29. ;将word(16位)型数据转变位标识十进制数的字符串,字符串以0结尾,存放在ds处
  30. ;输入参数:
  31. ;                (ax)=word型数据
  32. ;                ds:si指向字符串首地址
  33. ;返回值: 无
  34. ;32位除法所需的寄存器:DX被除数的高16位,AX被除数的低16位,reg,除数(这里是cx)结果:AX商,DX余数
  35. dtoc:        ;mov dx,0000H
  36.                 mov di,si
  37.                 mov bx,0        ;字符长度计数
  38.                 ;输入参数:
  39.                 ;        (ax)=dword型数据的低16位
  40.                 ;        (dx)=dowrd型数据的高16位
  41.                 ;        (cx)=除数
  42.                 ;返回值:
  43.                 ;        (dx)=结果的高16位,(ax)=结果的低16位
  44.                 ;        (cx)=余数
  45.         s0:        mov cx,0AH
  46.                 push bx                                ;divdw函数内部会改变bx的值,把bx暂存起来
  47.                 push si
  48.                 call divdw
  49.                 pop si
  50.                 pop bx
  51.                 push cx                                ;数据入栈,因为算出来的顺序是反的,所以用栈来倒一下;
  52.                 inc bx
  53.                 ;检查商是否为0,为0则计算结束,跳出循环
  54.                 push ax                                ;ax寄存器的值后面还有用,先保存起来
  55.                 or ax,dx
  56.                 mov cx,ax
  57.                 pop ax
  58.                 jcxz s1
  59.                 inc di
  60.                 mov cx,2
  61.                 loop s0
  62.         s1:        mov di,si
  63.                 mov cx,bx
  64.         ens:
  65.                 pop ax
  66.                 add ax,30H                        ;转换为ASCII
  67.                 mov ds:[di],al
  68.                 inc di
  69.                 loop ens
  70.                 mov cl,0                        ;末尾写入0
  71.                 mov ds:[di],cl
  72.                 ret
  73.                
  74. show_str:
  75.                 mov ax,0b800H        ;显存地址
  76.                 mov es,ax
  77.                 ;计算像素点索引 8行3列  像素点索引=8*160+3*2
  78.                 add dl,dl
  79.                 mov al,dh
  80.                 mov bl,160
  81.                 mul bl                        ;计算出来的行号存储在ax中
  82.                
  83.                 mov dh,0
  84.                 add ax,dx               
  85.                 mov di,ax                ;像素写索引
  86.                 mov dh,cl                ;先用dl记录下颜色值,后面直接用dx寄存器写显存;CX寄存器在循环中会被用到,释放cl
  87.         ws:                                        ;写显存
  88.                 mov dl,ds:[si]
  89.                 mov es:[di],dx
  90.                 inc si
  91.                 add di,2
  92.                 ;查看下一位是否为0
  93.                 mov cx,0
  94.                 mov cl,ds:[si]
  95.                 jcxz wd                        ;若下一位为0,则跳转到wd处
  96.                 mov cx,2                ;给CX赋值,如果程序走到这里说明下一位不为0就让其不断循环继续往下写
  97.                 loop ws
  98.         wd:        ret

  99. divdw:
  100.                 mov si,ax        ;低16位暂存在si中
  101.                 ;计算高16位,将16位计算转化为32位计算
  102.                 mov ax,dx
  103.                 mov dx,0
  104.                 div cx
  105.                 mov bx,ax         ;H/N存放在BX中
  106.                 ;计算低16位
  107.                 mov ax,si
  108.                 div cx
  109.                
  110.                 mov cx,dx
  111.                 mov dx,bx
  112.                 ret
  113.                
  114.        
  115. code ends
  116. end start
复制代码
10-3.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 12:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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