鱼C论坛

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

实验10.3

[复制链接]
发表于 2014-6-25 10:17:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 HTT_音乐 于 2014-6-25 10:18 编辑
  1. assume cs:code

  2. data segment
  3.         db 30H, 31H, 32H, 33H, 34H, 35H, 36H, 0
  4.         db 10 dup(0)
  5. data ends

  6. code segment
  7. start:
  8.         mov ax, 12666
  9.         mov bx, data
  10.         mov ds, bx
  11.         mov si, 0
  12.         call dtoc

  13.         mov dh, 8
  14.         mov dl, 3
  15.         mov cl, 2
  16.         call show_str

  17.         mov ax, 4C00H
  18.         int 21H

  19.         ; 名称:dtoc
  20.         ; 功能:将word型数据转变为表示十进制数的字符串,字符串以0位结尾符
  21.         ; 参数:(ax)=wrod型数据
  22.         ;                ds:si指向字符串的首地址
  23.         ; 返回:无
  24.         ; 应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
  25. dtoc:
  26.         push ax
  27.         push dx
  28.         push cx
  29.         push si

  30. s1:        mov cx, 10
  31.         call divdw
  32.         add cl, 30H
  33.         mov ds:[si], cl
  34.         inc si

  35.         mov cx, ax
  36.         add cx, dx
  37.         jcxz short ok1

  38.         jmp s1

  39. ok1:mov ds:[si], cl
  40.         pop si
  41.         pop cx
  42.         pop dx
  43.         pop ax
  44.         ret

  45.         ; 名称:divdw
  46.         ; 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
  47.         ; 参数:(ax)=dword型数据的低16位
  48.         ;                (dx)=dword型数据的高16位
  49.         ;                (cx)=除数
  50.         ; 返回:(dx)=结果的高16位,(ax)=结果的低16位
  51.         ;                (cx)=余数
  52.         ; 应用举例:计算 1000000/10(F4240H/0AH)
  53. divdw:
  54.         push ax                        ; 把低16位数据存入栈空间
  55.         mov ax, dx                ; 把高16位数据放入ax寄存器
  56.         mov dx, 0                ; 把高16位寄存器dx置为0
  57.         div cx                        ; 除数cx是16位,所以被除数为32位,dx为高位,ax为低位
  58.                                         ; 由于高16位放入低16位,所以得到的商时高16位的数据
  59.                                         ; 除法规则余数必定小于除数,所以高位的余数会被除掉

  60.         mov bx, ax                ; 把高16位数据的商存入bx寄存器
  61.         pop ax                        ; 取出栈空间的低16数据置入低16位
  62.         div cx                        ; 高16位的余数和低16位的数一起相除
  63.         mov cx, dx                ; 把高16位获得的余数赋给cx(余数必定小于除数)
  64.         mov dx, bx                ; 把存入bx中的高16位的商还给高16位dx

  65.         ret

  66.         ; 名称:show_str
  67.         ; 在指定的位置,用指定的颜色,显示一个用0结束的字符串。
  68.         ; (dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)
  69.         ; (cl)=颜色,ds:si制定字符串的首地址
  70.         ; 返回:无
  71.         ; 应用举例:在屏幕的8行2列,用绿色显示data段中的字符串
  72. show_str:
  73.         push ax                                ; 保存子程序中用到的寄存器
  74.         push bx
  75.         push cx
  76.         push dx
  77.         push es
  78.         push si

  79.         mov ax, 0B800H                ; 显存区开始地址
  80.         mov es, ax
  81.         
  82.         mov al, 160                        ; 计算在显存区的打印位置
  83.         mul dh
  84.         mov si, ax
  85.         mov al, 2
  86.         mul dl
  87.         add si, ax

  88.         mov al, cl                        ; 复制显存区的颜色

  89.         mov bx, 0
  90.         mov ch, 0
  91. s:        mov cl, ds:[bx]
  92.         jcxz short ok
  93.         mov es:[si], cl                ; 偶数位置存储ASCII编码
  94.         mov es:[si+1], al        ; 奇数位置存储颜色
  95.         inc bx
  96.         add si, 2
  97.         jmp s

  98. ok:        pop si                                ; 按顺序释放保存的寄存器
  99.         pop es
  100.         pop dx
  101.         pop cx
  102.         pop bx
  103.         pop ax
  104.         ret
  105. code ends

  106. end start
复制代码
2014-06-25 10:15:17 的屏幕截图.png
我自己写的代码,debug查看内存中的数据是 66621.(倒序排列的勿怪)。可是最后为什么在显存中会显示不正确呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-6-25 15:50:52 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2014-6-25 15:58:37 | 显示全部楼层
  呵呵,我找出来了,你粗心了, 22222.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-26 10:11:26 | 显示全部楼层

真是太感谢了,真的是这里的问题啊!!(就这一个我弄了两天,最后还是没好:dizzy:)
不过为什么我单步调试debug的时候是好的呢?执行就明显不对了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-6-26 11:04:33 | 显示全部楼层
HTT_音乐 发表于 2014-6-26 10:11
真是太感谢了,真的是这里的问题啊!!(就这一个我弄了两天,最后还是没好)
不过为什么我单步调 ...

debug调试我没试过,等下有时间帮你看下。你单步调试结果截图来看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 12:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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