|
主题 : : 大家帮我看看我实在是找不到原因了,为什么结果不是12666?? [待解决] |
回复[ 5次 ]
点击[ 468次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-02-02 05:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start: mov bx,data
mov ax,12666
mov ds,bx
mov ss,bx
mov sp,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc: push di
push si
push bx
push cx
a: mov cx,dx
jcxz goon ;判断dx高位是否为0
mov cx,0ah
call div_str
push cx
inc si
jmp short a
goon:mov cx,ax
jcxz re_num
mov cx,0ah
call div_str
push cx
inc si
jmp short goon
re_num: mov cx,si
s: pop ax
mov bx,30h
add ax,bx
mov ds:[di],ax
inc di
loop s
pop cx
pop bx
pop si
pop di
ret
div_str:push bx
push ax
mov ax,dx
div cl
mov bx,ax
mov ah,0
mov dx,ax
pop ax
push dx
mov dx,bx
mov dl,dh
mov dh,0
div cx
mov cx,dx
pop dx
pop bx
ret
show_str: push di
push si
push bx
push es ;注意ss:sp指向长度
dec dh ;送入变量dh行号,dl为排号注意寄存器的使用cl为颜色
dec dl
mov ax,0
mov al,dh
mov bx,0
mov bl,10
mul bl
mov bx,ax
mov ax,0b800h
add ax,bx
mov es,ax
mov ax,0
mov al,dl
add al,dl
mov bx,ax
mov di,0
mov ch,cl
ok: mov cl,[si]
push cx
mov ch,0
jcxz return
pop cx
mov es:[bx+di],cx
add di,2
inc si
jmp short ok
return: pop cx
pop es
pop bx
pop si
pop di
ret
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-02-03 10:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48 |
用debug调试很奇怪,运行正常。但是直接运行exe显示错误。
单独测试show_str,能正常显示字符串,锁定错误出现在dtoc子程序。
dtoc: push di
push si
push bx
push cx
a: mov cx,dx ---问题1:传入dtoc的dx值的含义是什么,程序并没有对dx设置,只能依靠系统(debug下查看都是0)。
jcxz goon
mov cx,0ah
call div_str
push cx
inc si ---问题2:传入dtoc的si值的含义是什么,程序并没有对si设置,也只能依靠系统。
jmp short a
------------------
在标号a前增加 mov si,0 和mov dx,0,程序能正常显示了。
dtoc这个子程序楼主应该在重新想想实现方法。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-02-03 22:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
回楼上的其实我也debug很多次了!!都没有找到原因,在整个程序的最后也就是在mov ax,4c00 int 21h之前debug -q 时已经能返回1266了只是当执行这两条语句之后就出现问题了,我在想是不是真的是哪里出问题了,好矛盾呢!!对与inc si的问题,si是一个计数器用下存储call div_str的反回值cx,因为12666除以0ah之后余数被返回到了CX中我当然要把它储存起来啊,因为12666中的尾数6会被先存储起来所以要用计数器si来数12666有几位,然后再进行pop程序是先进行push cx 5次然后再pop ax5次释放栈空间,这样设计应该是没有问题的,在debug过程中应该可以看得到,我的原理就是子程序用的空间要释放出来 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-02-03 23:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
mov cx,dx的意思是先判断被除数是否为0因为被数有可能是0f0000h这种情况,所要来再这里先加一个判断,之后再进行cx的判断值到被除数为0,没有判断的时候遇到这种特殊的数字进行处理的时候就会产生问题,我也是看了书上的提示之后想到的!! | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-02-04 00:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
忘了谢谢楼主了,要是没有楼主的好心帮助我还直找不出来问题的原因,只是有一点我不是很理解si和di默认情况下下不是0吗?感觉怪怪的,可能是自已还没有完全理解计算机的工作过程吧,以后注意子程序的调用吧,一定要先声明,不能想当然,必意CPU没那么陪明它并不能判断si和di在初始情况下就是0 | | |
|
|
|
|
[第5楼]
[ 回复时间:2010-02-04 00:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2009-10-07 14:18 |
还有一点对mess的解说很到位有思路有点评大家磁到类似的问题可以参考一下真的很有用,高手!! | | |
|