. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->更灵活的定位内存地址的方法
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于141页问题7.7的调试问题  [已解决] 回复[ 10次 ]   点击[ 731次 ]  
fontomas
[帖 主]   [ 发表时间:2008-07-31 19:46 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22
用Debug调试的时候,查看到mov ax,4c00H存放在001f单元,但是每次用 g 001f的时候就好久没有响应,好像死机了一样,请问是怎么回事?有没有遇到相同问题的朋友?
谢谢!
ppt
[第1楼]   [ 回复时间:2008-07-31 20:26 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23
什么程序,程序多大?
不会是程序运行消耗的时间长吧?
我没有遇到过.
fontomas
[第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个循环,不可能耗时很长啊。
ppt
[第3楼]   [ 回复时间:2008-07-31 22:10 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23
程序逻辑有问题,造成了死循环,所以好久没有响应,好像死机了一样.
检查一下程序吧.不是系统或者debug的问题.
fontomas
[第4楼]   [ 回复时间:2008-07-31 22:11 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22
我看后面的问题7.8想到,是不是此时的程序里,内层的循环计数器cx覆盖了外层的cx的值,所以此时的程序还不完整,或者说不正确,造成了死循环?
fontomas
[第5楼]   [ 回复时间:2008-07-31 22:12 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22
回复:[第3楼]
程序逻辑有问题,造成了死循环,所以好久没有响应,好像死机了一样.
检查一下程序吧.不是系统或者debug的问题.
------------------
果然啊!当时只看了7.7,然后就验证程序是否正确,后来看7.8的时候才发现cx的问题。
ppt
[第6楼]   [ 回复时间:2008-07-31 22:14 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23
呵呵,说对了.
fontomas
[第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吗?怎么会成为死循环呢?
tomato
[第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指令的执行过程啊!
fontomas
[第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,所以程序可以得到有效的执行。
终于明白了,谢谢楼上各位了!
fontomas
[第10楼]   [ 回复时间:2008-08-10 21:58 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2007-08-08 14:22
此贴由 贴主 于 [ 2008-08-10 21:58 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved