单步运行和直接运行输出不一样。。
; 子程序描述:; 名称: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 static/image/common/back.gif
这么长程序,真心看不下去,你能找到关键出错点在哪里才行
花了不少时间写出来这个玩意
(@﹏@)~
在网上也没有什么针对的答案
看了一个什么 DS:DX对应缓存之类的没看懂,
照猫画虎在代码段加了一个 mov dx,0字符倒是可以输出正确了, 但是颜色不对、、
页:
[1]