鱼C论坛

 找回密码
 立即注册
查看: 3414|回复: 4

[汇编作业] 实验10的三个小程序

[复制链接]
发表于 2020-4-10 13:19:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 何足道 于 2020-4-10 13:25 编辑

初学者写了几个小时才调试通过,第三个小程序包括前两个,所以就发第三个吧。
编写过程没看甲鱼哥和任何答案,所以思路和一些细节可能和别人不一样,欢迎大家批评指正。
  1. assume cs:code,ds:data
  2. data segment
  3.         db 10 dup (0)
  4. data ends

  5. code segment
  6. start:
  7.         mov ax,data
  8.         mov ds,ax
  9.         mov si,0                                        ;data字符串首地址为ds:si
  10.         
  11.         mov ax,12666
  12.         call dtoc        
  13.         
  14.         mov dh,8                                        ;行号为8(0~24)
  15.         mov dl,3                                        ;列号为3(0~79)
  16.         mov cl,2                                        ;绿色 (绿字00000010b; 绿底红字:00100100b; 白底蓝字:01110001b)        
  17.         call show_str
  18.         
  19.        mov ax,4c00H
  20.        int 21h

  21. ;数值显示
  22. ;功能: 将word型数据转变为十进制的字符串,字符串以0为结尾符。
  23. ;参数: (ax)=word型数据; ds:si指向字符串首地址
  24. ;返回: 无
  25. dtoc:
  26.         push cx
  27.         push bx
  28.         push dx        
  29.         push ax
  30.         push di
  31.         push si
  32.         
  33.         mov di,0                                        ;di记录位数        
  34. d:     mov cx,10
  35.         mov dx,0                                        ;初始化divdw的参数
  36.         call divdw                                        ;(ax)=int,(cx)=rem
  37.         inc di                                        ;位数++        
  38.         add cx,30h                                ;余数+30h转为ASCII码串
  39.         push cx                                        ;将各位对应的ASCII码串倒序入栈
  40.         mov cx,ax
  41.         jcxz ok1                                        ;商为0则结束
  42.         jmp short d
  43.         
  44.         ok1:        mov cx,di        
  45.                         s:      pop ax                ;循环di次,顺序出栈
  46.                                 mov [si],al
  47.                                 inc si
  48.                                 loop s
  49.                         mov byte ptr [si],0        ;字符串结尾补0
  50.                         
  51.                         pop si
  52.                         pop di
  53.                         pop ax                        
  54.                         pop dx
  55.                         pop bx
  56.                         pop cx
  57.                         ret

  58. ;显示字符串
  59. ;功能: 在指定位置用指定颜色显示一个用0结束的字符串
  60. ;参数: (dh)=行号(0~24),(dl)=列号(0~79),(cl)=颜色,ds:si指向字符串首地址        
  61. ;返回: 无
  62. show_str:        
  63.         push ax
  64.         push es
  65.         push di
  66.         push cx
  67.         
  68.         mov ax,0B800H
  69.         mov es,ax                                 ;显示位置为es:di
  70.         mov al,160                                ;di=160*(dh-1)+2*(dl-1)=160*dh+2*dl-162
  71.         mul dh
  72.         mov di,ax
  73.         mov al,2
  74.         mul dl
  75.         add di,ax
  76.         sub di,162        ;根据公式得到di
  77.         
  78.         show:        mov cl,[si]
  79.                         mov ch,0
  80.                         jcxz ok                        ;判断字符是否为0
  81.                         
  82.                         mov al,[si]
  83.                         mov es:[di],al                ;写入字符
  84.                         inc si
  85.                         inc di
  86.                         
  87.                         pop cx
  88.                         mov byte ptr es:[di],cl        ;写入字符属性(颜色)
  89.                         push cx
  90.                         
  91.                         inc di
  92.                         jmp short show
  93.                         
  94.         ok:           pop cx
  95.                         pop di
  96.                         pop es
  97.                         pop ax
  98.                         ret        

  99. ;解决除法溢出的问题
  100. ;功能: 进行不会溢出的除法运算,被除数dword型,除数word型,结果dword型
  101. ;参数: (dx)=被除数高16位,(ax)=被除数低16位,(cx)=除数
  102. ;返回: (dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
  103. divdw:
  104.         push bx
  105.         push bp
  106.         mov bx,dx        ;bx暂存高16位
  107.         mov bp,ax        ;bp暂存低16位
  108.         
  109.         mov dx,0
  110.         mov ax,bx
  111.         div cx        
  112.         push ax                ;(ax)=int(H/N),(dx)=rem(H/N)
  113.         
  114.         mov ax,bp
  115.         div cx
  116.         mov cx,dx        ;rem(X/N)
  117.         pop dx                ;将int(H/N)给dx
  118.                
  119.         pop bp
  120.         pop bx
  121.         ret
  122.         
  123. code ends
  124. end start
复制代码

                               
登录/注册后可看大图


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-10 13:20:57 | 显示全部楼层
图片补充:

                               
登录/注册后可看大图


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-10 13:22:10 | 显示全部楼层

                               
登录/注册后可看大图

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-10 13:24:10 | 显示全部楼层

看不到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-10 13:27:49 | 显示全部楼层

我也不知道为什么看不到,系统显示在审核,发图片好麻烦。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 04:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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