T_未命名 发表于 2013-12-12 22:42:34

单步运行和直接运行输出不一样。。

; 子程序描述:
; 名称:dtoc
; 功能:将word型数据转变为表示十进制数的字符串,字符串以 0 为结尾符。
; 参数:(ax)= word型数据
; ds:si 指向字符串的首地址
; 返回:无

; 实现:将数据 12666(317AH) 以十进制的形式在屏幕的 8 行 3 列显示。

assume cs:codesg, ss:stack

stack segment
    db 32 dup(0)
stack ends

codesg segment
    tt:    mov ax, stack    ; 栈
      mov ss, ax
      mov sp, 1eh      ; 留出两位存 0
      mov ax, 317ah    ; 要转换的值
    ;    mov dx, 0   
      
      ; 进行转换, 并将数据入栈
    s1:    mov cx ,ax
      jcxz ok
      mov cx, 0ah      ; CX作为除数 16进制的A 即10进制的10
      
      call divdw
      
      mov dx, 0      ; DX清零
      add bx, 30h      ; 余数加 30H, 转换成对应的ASCII码
      push bx            ; 字符进栈
      jmp short s1
   
      ; 数据显示      
    ok:    mov ax, ss
      mov ds, ax
      mov si, sp    ; 取字符位置
      
      mov dh, 8    ; 行号
      mov dl, 3    ; 列数
      mov cl, 2    ; 颜色
      push cx

      call show_str
            
      mov ax, 4c00H
      int 21H   
      
   
; 子程序 取余 参数设置:
;(ax)= dword 型数据的低 16 位
;(dx)= dword 型数据的高 16 位
;(cx)= 除数      
; 结果:BX为余数
divdw:    push ax      ; push (ax)=4240h

      ; 高16位进行运算
      mov ax, dx    ; 高16位作为被除数进行8位除法
      div cl      ; 结果商在AL, 余数在AH
      
      ; 低16位进行运算: AX存低位, DX存高位, 进行16位除法
      ; 商存在了AX, 余数存在了DX
      mov dh, 0    ; 高16位值保存至DX
      mov dl, al
      mov bx, dx    ; 结果高16位值, 暂存在BX
      mov dl, ah    ; 之前除法的余数作为此次除法的高16位
      pop ax
      div cx
      
      ; 求余数
      mov bx, dx
      
      mov dx, bx    ; 取回结果高16位值
      ret   
               
               
; 子程序 显示字符串
;
show_str:    mov ax, 0a0h    ; 160字节一行
            mul    dh
            mov ch, 10h      ; 偏移地址转换成段地址
            div ch
            add ax, 0b800h    ; 显示缓存区,目标行数段地址
            mov es, ax      ; 存储段地址:ES
            mov dh, 0
            mov ax, dx      ; 计算列数偏移, 偶数为字符
            mov ch, 2
            mul ch
            mov di, ax      ; 显示缓存区,偏移地址 用 AX存储

      s2:    mov ch, 0
            mov cl, ds:
            jcxz op
            
            ; 存字符串
            mov es:, cl
            add si, 2
            inc di
            
            ; 存颜色代码
            pop cx
            mov es:, cl
            push cx
            inc di
            
            jmp short s2
            op:ret
            
codesg ends
end tt

这个程序用DEBUG单步运行输出结果是正确的
但是用CMD直接运行CMD结果却是另外一个数
求大神帮忙解答一下。。
最近才学的汇 编写得不好求不喷。。。

~逆天~ 发表于 2013-12-13 09:34:39

这么长程序,真心看不下去,你能找到关键出错点在哪里才行

T_未命名 发表于 2013-12-13 12:02:42

~逆天~ 发表于 2013-12-13 09:34 static/image/common/back.gif
这么长程序,真心看不下去,你能找到关键出错点在哪里才行

花了不少时间写出来这个玩意
(@﹏@)~
在网上也没有什么针对的答案
看了一个什么 DS:DX对应缓存之类的没看懂,
照猫画虎在代码段加了一个 mov dx,0字符倒是可以输出正确了, 但是颜色不对、、
页: [1]
查看完整版本: 单步运行和直接运行输出不一样。。