鱼C论坛

 找回密码
 立即注册
查看: 1281|回复: 2

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

[复制链接]
发表于 2013-12-12 22:42:34 | 显示全部楼层 |阅读模式

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

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

x
; 子程序描述:
; 名称: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:[si]
            jcxz op
            
            ; 存字符串
            mov es:[di], cl
            add si, 2
            inc di
            
            ; 存颜色代码
            pop cx
            mov es:[di], cl
            push cx
            inc di
            
            jmp short s2
            op:ret
            
codesg ends
end tt

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-13 09:34:39 | 显示全部楼层
这么长程序,真心看不下去,你能找到关键出错点在哪里才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-13 12:02:42 | 显示全部楼层

花了不少时间写出来这个玩意
(@﹏@)~
在网上也没有什么针对的答案
看了一个什么 DS:DX对应缓存之类的没看懂,
照猫画虎在代码段加了一个 mov dx,0  字符倒是可以输出正确了, 但是颜色不对、、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 15:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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