茗艹莜主 发表于 2014-1-20 22:31:42

第四章实验3(3)的问题

首先上代码然后是题目:用DEBUG跟踪t1.exe的执行过程,写出第一步执行后,相关寄存器的内容和栈顶内容。我自己做先运行了一下,在运行途中我没有使用别的命令了,一直是用T执行的。AX,BX途中一直是0,最后的结果也是0。但是当我看了答案以后,按照答案上面的运行了一下,结果和之前的完全不一样了,答案上面是在运行POP AX之前查看了一下栈的内存情况,然后结果就不一样了。就算答案变了,可是我不明白运行POP AX以后AX的值为毛会成0C79,而不是2000?

skyonline 发表于 2014-1-20 22:31:43

因为单步跟踪的时候每两步之间会有CS:IP入栈的过程,你仔细看看你的2000:0-2000:10是0B 00 0C 79正好是你之前的cs:ip。这个问题来源于debug的运作模式,在单步跟踪的时候由于cpu需要暂时保存原来正在执行的代码然后跳转去执行单步跟踪的程序,所以这是先要保存cs:ip。
类似的问题有王爽汇编语言第三章最后一个实验。
这两个问题都是单步跟踪的原理导致的,参考后续章节可得到你要的结果,要完全理解需要有标志寄存器的知识。简单来说就是,cs:ip入栈后其他堆栈内容的改变是中断处理程序执行过程中改变的,然后你又把这个入栈了……:sweat:

吉他、G弦 发表于 2014-1-20 23:47:21

..........

茗艹莜主 发表于 2014-1-21 11:43:01

skyonline 发表于 2014-1-20 23:08 static/image/common/back.gif
因为单步跟踪的时候每两步之间会有CS:IP入栈的过程,你仔细看看你的2000:0-2000:10是0B 00 0C 79正好是你 ...

好吧,大致的明白你的意思了。现在说不清,继续往后听会明白的。
页: [1]
查看完整版本: 第四章实验3(3)的问题