汇编网首页登录博客注册
study_soft的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2008-02-26 11:00] 一个关于debug调试call的疑问请指教

下面的程序执行完add ax,5时,ax中的数值为多少____ 3 
    assume cs:code  
    stack segment  
    dw 8 dup(0)  
    stack ends  
    code segment  
    start: mov ax,stack  
    mov ss,ax  
    mov sp,16  
    mov ds,ax  
    mov ax,0  
    call word ptr ds:[0EH]  
    add ax,2  
    inc ax  
    add ax,5  
    mov ax,4c00H  
    int 21H  
    code ends  
    end start  
 1、 3  
 2、 8  
 3、 0  
 4、 4c00H  

这个题的原理想通了,但是debug调试call语句还是不会,请指教.
用debug调时,call word ptr ds:[0EH]处有问题: 
用P调,执行这句之后,不进入add ax,2,而是SBB AX,0CE8,很纳闷.
评论次数(6)  |  浏览次数(773)  |  类型(汇编作业) |  收藏此文  | 

[  sysnap   发表于  2008-02-26 11:20  ]

这个题怎么会选3呢,博主再好好看看吧。

在检测点10.5中有个提示:用call指令的原理来分析,不要再debug中单步跟踪来验证你的结论,对于此程序...

[  sysnap   发表于  2008-02-26 11:32  ]

至于原理我也很疑惑,debug加载这个程序后,如果在设置栈段之前用‘g’命令,程序可以正常返回,否则就会非正常退出。

我猜测这个问题是这样子的,debug实现t和p或是g命令都用到了栈来保存现场,而call指令也同样使用了栈。在debug调试下,两者发生了混乱而导致错误。

[  wdm   发表于  2008-02-26 17:21  ]

楼上说的很有道理!
其实就是看看call的调用过程就明白了。书上将的比较清楚。
博主学要在高一下撒!

[  study_soft   发表于  2008-02-26 23:01  ]

歉意, 答案不是3,我第一次做错时写的.被系统打叉之后,想明白了原理,只是不会对它用debug.

[  study_soft   发表于  2008-02-26 23:06  ]

sysnap,能否说详尽些,call指令在debug状态下,怎么调试? 我又看了书的第十章,没找到答案.

[  hunterit   发表于  2009-02-23 10:07  ]

这个题非常有意思,答案应该是8.
仔细分析了下,注意把call word ptr ds:[0EH] 指令分解:
push IP   ;此时ds段和ss段[0EH]的数值就改变了
jmp word ptr ds:[0EH] ;将会jmp到IP所指内存单元了

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码