|
主题 : : 关于141页问题7.7的调试问题 [已解决] |
回复[ 10次 ]
点击[ 731次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-07-31 19:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
用Debug调试的时候,查看到mov ax,4c00H存放在001f单元,但是每次用 g 001f的时候就好久没有响应,好像死机了一样,请问是怎么回事?有没有遇到相同问题的朋友?
谢谢! | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-07-31 20:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23 |
什么程序,程序多大?
不会是程序运行消耗的时间长吧?
我没有遇到过. | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-07-31 20:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
程序如下:
assume cs:codesg, ds:datasg;
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
mov ax, datasg
mov ds, ax
mov bx, 0H
;mov si, 0H
mov cx, 4H
big_line:
mov si, 0H
mov cx, 3H
big_row:
mov al, [bx+si]
and al, 11011111B
mov [bx+si], al
inc si
loop big_row
add bx, 10H
loop big_line
mov ax, 4C00H
int 21H
codesg ends
end start
一共12个循环,不可能耗时很长啊。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-07-31 22:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23 |
程序逻辑有问题,造成了死循环,所以好久没有响应,好像死机了一样.
检查一下程序吧.不是系统或者debug的问题. | | |
|
|
|
|
[第4楼]
[ 回复时间:2008-07-31 22:11 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
我看后面的问题7.8想到,是不是此时的程序里,内层的循环计数器cx覆盖了外层的cx的值,所以此时的程序还不完整,或者说不正确,造成了死循环? | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-07-31 22:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
回复:[第3楼]
程序逻辑有问题,造成了死循环,所以好久没有响应,好像死机了一样.
检查一下程序吧.不是系统或者debug的问题.
------------------
果然啊!当时只看了7.7,然后就验证程序是否正确,后来看7.8的时候才发现cx的问题。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-07-31 22:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23 |
|
|
|
|
|
[第7楼]
[ 回复时间:2008-07-31 23:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
但是我有个问题,既然内层的cx=3覆盖了外层的cx=4,那内层循环结束后cx不是为0吗?
当cx=0时,那外层循环不是应该结束,然后执行mov ax, 4C00H吗?怎么会成为死循环呢? | | |
|
|
|
|
[第8楼]
[ 回复时间:2008-08-01 09:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
但是我有个问题,既然内层的cx=3覆盖了外层的cx=4,那内层循环结束后cx不是为0吗?
当cx=0时,那外层循环不是应该结束,然后执行mov ax, 4C00H吗?怎么会成为死循环呢?
-----------------------------
说明楼主没有对loop指令掌握好,建议楼主再看一下loop指令的执行过程啊! | | |
|
|
|
|
[第9楼]
[ 回复时间:2008-08-02 18:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
终于明白了!用Emu8086调试的时候才发现,当内层循环结束后,外层循环的cx要减1,但此时外层的cx已被内层的cx覆盖,变为0,所以减1后外层的cx=FFFFH,不为0,又进入内层循环,然后内层的cx又被赋值为3,循环结束后外层的cx又变为FFFFH,永远不可能为0,所以形成了死循环!而如果使用栈保存外层循环的cx,则每次内层循环结束后,外层的cx可以得到正常的循环计数,cx可以正常的减为0,所以程序可以得到有效的执行。
终于明白了,谢谢楼上各位了! | | |
|
|
|
|
[第10楼]
[ 回复时间:2008-08-10 21:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22 |
此贴由 贴主 于 [ 2008-08-10 21:58 ] 结贴。 结贴原因:问题已解决 | | |