|
主题 : : 实验10.3 [待解决] |
回复[ 6次 ]
点击[ 1445次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2009-03-11 21:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:5
信誉值:3
注册日期:2009-03-05 20:41 |
谁能提点意见 帮我看看 运行后结果显示框一闪而过 怎么回事??show_str子程序前面已经用过了 没问题 可能就是dtoc子程序有问题 但自己找了好久 没找出来 自己的错误自己可能难找 但旁观者清。
assume cs:code,ss:satck,ds:data
data segment
db 10 (0)
data ends
satck segment
dw 16 (0)
satck ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov bx,satck
mov ss,bx
mov sp,32
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push dx
push ax
push bx
push cx
push si
mov cx,0
s1: mov dx,0
mov bx,0ah
div bx
push dx
inc cx
mov bx,cx
mov cx,ax
jcxz ok1
mov cx,bx
jmp s1
ok1:inc cx
pop [si]
inc si
loop ok1
pop si
pop cx
pop bx
pop ax
pop dx
ret
show_str:push ax
push dx
push bx
push si
push cx
mov ax,0b800h
mov es,ax
mov al,160
mul dh
add dl,dl
mov dh,0
add ax,dx
mov bx,ax
mov al,cl
s:mov cl,[si]
mov ch,0
jcxz ok
mov es:[bx],cl
mov byte ptr es:[bx+1],al
inc si
add bx,2
jmp short s
ok:pop cx
pop si
pop bx
pop dx
pop ax
ret
code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2009-03-12 18:29 ]
[引用]
[回复]
[ top ] | |
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07 |
show_str子程序前面已经用过了 没问题 可能就是dtoc子程序有问题 但自己找了好久 没找出来 自己的错误自己可能难找 但旁观者清。
------------------
如果把show_str注释了,还出现错误,就说明不是show_str的问题。“前面已经用过了 没问题”这未必准确,可能是你已经用的时候没有除法程序的错误。
执行完dtoc后肯定会把结果存好让show_str去调用的,debug跟踪查下就知道dtoc是否正确了。
据我的经历,“旁观者清”在学习计算机不太使用,试想你写了N行的代码,让旁观者给你找出错误?!!感叹一下旁观着怎么去“旁观者清”吧~ 对于程序的逻辑错误倒是可以讨论一下。
谁能提点意见 帮我看看 运行后结果显示框一闪而过 怎么回事??
--------------------
楼主运行后能“结果显示框一闪而过”,我运行怎么直接就死循环了呢?
dtoc子程序起码需要实现:1.除法,得到余数 2,将得到的余数,也就是拆分之后的整数存入相应位置
-d ss:0 1f
0B66:0000 00 00 00 00 3F 00 67 0B-66 05 01 00 02 00 06 00 ....?.g.f.......
0B66:0010 06 00 06 00 00 00 9B 00-66 0B 7A 31 00 00 16 00 ........f.z1....
这是执行第一部分得到的“栈中的结果”,可以看到这部分是正确的。
而到了第二部分就出现问题了:如果楼主自己debug就会发现了,只执行了一次pop,紧接着就ret,不过后面的指令就不知道是什么了,显然不是楼主程序里面的。原因:call压入的数据,没有在ret中正确读出来。
问题已经找到了,解决方法楼主自己想想吧,如果前面是按照书上的要求自己学下来的话,分析到这里程序已经很容易调试正确了。
如果程序出错,不能一眼就看出逻辑错误的话,debug慢慢跟踪、分析是必经的方法,谁都是一样。对于学到好的人只是第一步“一眼看出错误”做的好,第二步debug更加熟练而已了。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2009-03-12 22:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:5
信誉值:3
注册日期:2009-03-05 20:41 |
我找到错误了。这一段
jcxz ok1
mov cx,bx
jmp s1
ok1:inc cx
pop [si] 改为
jcxz ok2
mov cx,bx
jmp s1
ok2: mov cx,bx
ok1: pop [si]
inc si 就好了,前面用来计数的CX 因为mov cx,bx 被前面的jcxz ok1 跳过而没有执行,所以执行下面时CX=0了 下面的循环也就不能执行了,出栈就混乱了。 而且后面我还忘了将取出来的数加上30H,太粗心大意了。 谢谢abob了 听了你上面的一席话 受益匪浅,花了一个晚上DEGUG终于将问题找出来了。也提高了我用DEGUG差错的能力。。呵呵 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-05-25 08:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:5
注册日期:2009-03-25 17:31 |
|
|
|
|
|
[第4楼]
[ 回复时间:2010-08-26 10:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2010-07-31 15:39 |
我做的部分修改
assume cs:code,ss:satck,ds:data
data segment
db 10 (0)
data ends
satck segment
dw 16 (0)
satck ends
code segment
start: mov ax,12666
mov bx,data
mov ds,bx
mov si,0
mov bx,satck
mov ss,bx
mov sp,32
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:push dx
push ax
push bx
push cx
push si
push di
mov di,0 ;di用来记数
mov cx,0 ;将cx清零,作为余数,判断结束
s1: mov dx,0
mov bx,0ah
div bx
mov cx,dx
jcxz ok1
push dx
inc di
jmp s1
ok1:mov cx,di ;记录循环次数
OK2:
pop [si]
add byte ptr [si],30h
inc si
loop ok2
pop di
pop si
pop cx
pop bx
pop ax
pop dx
ret
show_str:push ax
push dx
push bx
push si
push cx
mov ax,0b800h | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-01-19 19:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-15 15:20 |
好像是商在AX里不再dx所以应该是mov cx,ax 然后再jcxz ok1 | | |
|
|
|
|
[第6楼]
[ 回复时间:2022-01-24 22:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2022-01-04 14:28 |
|
|