HTT_音乐 发表于 2014-6-25 10:17:41

实验10.3

本帖最后由 HTT_音乐 于 2014-6-25 10:18 编辑

assume cs:code

data segment
      db 30H, 31H, 32H, 33H, 34H, 35H, 36H, 0
      db 10 dup(0)
data ends

code segment
start:
      mov ax, 12666
      mov bx, data
      mov ds, bx
      mov si, 0
      call dtoc

      mov dh, 8
      mov dl, 3
      mov cl, 2
      call show_str

      mov ax, 4C00H
      int 21H

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

s1:      mov cx, 10
      call divdw
      add cl, 30H
      mov ds:, cl
      inc si

      mov cx, ax
      add cx, dx
      jcxz short ok1

      jmp s1

ok1:mov ds:, cl
      pop si
      pop cx
      pop dx
      pop ax
      ret

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

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

      ret

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

      mov ax, 0B800H                ; 显存区开始地址
      mov es, ax
      
      mov al, 160                        ; 计算在显存区的打印位置
      mul dh
      mov si, ax
      mov al, 2
      mul dl
      add si, ax

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

      mov bx, 0
      mov ch, 0
s:      mov cl, ds:
      jcxz short ok
      mov es:, cl                ; 偶数位置存储ASCII编码
      mov es:, al      ; 奇数位置存储颜色
      inc bx
      add si, 2
      jmp s

ok:      pop si                              ; 按顺序释放保存的寄存器
      pop es
      pop dx
      pop cx
      pop bx
      pop ax
      ret
code ends

end start
我自己写的代码,debug查看内存中的数据是 66621.(倒序排列的勿怪)。可是最后为什么在显存中会显示不正确呢?

xiaosawanjava 发表于 2014-6-25 15:50:52

帮你啾啾            

xiaosawanjava 发表于 2014-6-25 15:58:37

呵呵,我找出来了,你粗心了,

HTT_音乐 发表于 2014-6-26 10:11:26

xiaosawanjava 发表于 2014-6-25 15:58 static/image/common/back.gif
呵呵,我找出来了,你粗心了,

真是太感谢了,真的是这里的问题啊!!(就这一个我弄了两天,最后还是没好:dizzy:)
不过为什么我单步调试debug的时候是好的呢?执行就明显不对了。

xiaosawanjava 发表于 2014-6-26 11:04:33

HTT_音乐 发表于 2014-6-26 10:11 static/image/common/back.gif
真是太感谢了,真的是这里的问题啊!!(就这一个我弄了两天,最后还是没好)
不过为什么我单步调 ...

debug调试我没试过,等下有时间帮你看下。你单步调试结果截图来看看。
页: [1]
查看完整版本: 实验10.3