![学习动态](images/model1/b8.gif)
![最新评论](images/model1/b1.gif)
- [hunterit] 这个题非常有意思,答案应该是8. 仔细分析了下,注意把call word ptr ds:[0EH] 02/23 10:07
- [游客] 在有问题的基础上改进的: 关键是要知道如何调试,就比较容易解决问题 assume cs:co 09/13 16:39
- [wdm] 确实是中断的原因,t命令就是一个大不中断。中断过程中,会使用但前栈来存放一些数据。这个在中断那个章节 03/14 12:50
- [游客] 谢谢xiaochong 02/27 18:00
- [xiaochong] 博主看看 勘误区中关于此检测点的介绍 http://www.asmedu.net/bbs/pa 02/27 16:11
- [study_soft] 能否请martian说多点? 第一个问题我做的时候也纳闷,似乎该在0000:0010处找4号中断源 02/26 23:12
- [study_soft] sysnap,能否说详尽些,call指令在debug状态下,怎么调试? 我又看了书的第十章,没找到答 02/26 23:06
- [study_soft] 歉意, 答案不是3,我第一次做错时写的.被系统打叉之后,想明白了原理,只是不会对它用debug. 02/26 23:01
- [study_soft] 谢谢游客提示,实验时想到这个代码里不定义堆栈段应该也可以,把相应代码屏蔽之后的确可以正确运行. 02/26 22:56
- [martian] 楼主的第一个问题的答案有问题,再仔细考虑下。 第二个检测问题没有问题 02/26 18:41
[2008-02-26 11:00] 一个关于debug调试call的疑问请指教
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,很纳闷.
[ 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所指内存单元了