|
主题 : : 关于dword型数转换为十进制数的字符串的子程序,有一点小问题,望高手指点。 [已解决] |
回复[ 3次 ]
点击[ 280次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-04-18 16:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-01 10:19 |
assume cs:code,ss:stack,ds:data
data segment
db 16 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov si,0
mov ax,0cff5h
mov dx,0ff1bh ;十进制数为4280012789
call dtoc ;调用转换字符串子程序
mov dh,8 ;设置显示字符串的位置及显示的颜色
mov dl,3
mov bp,0
mov cl,10101100b
mov ax,0
call show_str ;调用显示字符串的子程序
mov ax,4c00h
int 21h
dtoc: push bx
dtoc1: mov cx,10 ;设除数
call divdw ;调用32位除法子程序
add cx,30h ;将余数转换为字符串形式
mov [si],cl ;将结果存入数据段中
inc si
mov cx,ax ;判断字符串是否转换完毕
jcxz ok
jmp short dtoc1
ok: pop bx
ret
divdw: push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
pop bx
ret
show_str:
push bx
push cx
push si
push di
mov ax,0b800h ;将显示区的段地址送入es段寄存器中
mov es,ax
mov ax,0a0h ;显示的行
mul dh
mov bx,ax
mov ax,2 ;显示的列
mul dl
mov di,ax
mov ah,cl
s: sub si,1
mov cl,[si]
mov ch,0
jcxz ok1
mov al,[si]
mov es:[bx+di],ax
add di,2
jmp short s
ok1: pop di
pop si
pop cx
pop bx
ret
code ends
end start
程序如上 ,但是执行程序后,屏幕上显示的为 12位,多出两位,前十位是4280012789,但是后两位却是两个符号。各位看官运行一下程序便知! | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-04-18 22:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28 |
1. 就告诉你问题出在哪,自己改下
2. 问题点
s: sub si,1
mov cl,[si]
mov ch,0
jcxz ok1
3. DEBUG描述
C:\>debug cc.exe
-g 6f
AX=AC06 BX=0500 CX=00AC DX=0803 SP=0006 BP=0000 SI=000A DI=0006
DS=0C0A ES=B800 SS=0C0B CS=0C0C IP=006F NV UP EI PL NZ NA PE NC
0C0C:006F 4E DEC SI
-d ds:0
0C0A:0000 39 38 37 32 31 30 30 38-32 34 00 00 00 00 00 00 9872100824......
4. 分析
从si为1开始[si从A~2略]
sub si,1 => si = 0
mov cl,[si] => cl = ds:[0] = 39
mov ch,0 => ch = 0
jcxz ok1 => 为0跳转到ok1,cx=39h不成立,继续走
..........略
jmp short s
s: sub si,1 => si = 0 - 1 = FFFF
mov cl,[si] => cl = ds:[FFFF] = ?
mov ch,0 => ch = 0
jcxz ok1 => 未定义
..........略
..........直到cx遇见0为止
ok1:
..........
5. 自己用DEBUG分析会更快 | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-04-20 09:51 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-01 10:19 |
|
|
|
|
|
[第3楼]
[ 回复时间:2011-04-20 09:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-01 10:19 |
此贴由 贴主 于 [ 2011-04-20 09:52 ] 结贴。 结贴原因:问题已解决 | | |
|