错了一题:想来是下面这个错了。
对下列程序说法正确的是__。
assume cs:codesg
stack segment
dw 10 dup (0)
stack ends
codesg segment
mov ax,4c00h
int 21h
start: mov ax,stack
mov ss,ax
mov sp,20
mov ax,0
push cs
push ax
mov bx,0
retf
codesg ends
end start
1、 程序中start之后的汇编指令不能得到执行。
2、 程序加载后stack段在内存中实际占用的内存空间是20b。
3、 程序的每一条指令都能获得执行,但不能正常返回。
4、 指令retf可替换为ret,并能够正常返回。
----------------
我选择了3为答案,但是这个答案本身就是错的。因为如果每一条殾能执行,必会返回。因为程序开始执行位置决定了。
所以。。。
再看看,最有可能是4答案正确。
分析一下,不知对否:
retf和ret的区别:
retf会执行类似pop cs的动作,而ret不会。
那执行retf之前,的两个push动作一定会影响结果,决定是否能返回到程序开始处执行。
push cs这句保存了cs内容
push ax这句把0压入栈,
结果导致,retf返回时:ip=0;cs=[cs];程序可以返回到mov ah,4c00h语句执行。故可以正常返回。
那么ret替换可不可以呢?应该可以,因为ret相当于执行pop ip,而此时最后压入栈的是ax,而ax值恰好为0。
故,答案应该为4.
- [sbjcm33] 原来你是把实验1和2放一起的,好办法,我怎么没想到呢,把它们分成了两个程序。 具体的内容我就不看了 12/06 01:34
- [rotapple] 却没有放入段地址,而此处要明确的是:seg code 的含义是指段地址 ============= 06/23 16:56
- [Wednesday] 分析透彻,收藏!哈哈 11/09 17:26
- [Wednesday] 公布答案了,哈哈。 11/05 23:03
- [mqmelon] 不用客气,共同进步! 11/02 10:03
- [feemess] 谢谢指点.我的下一次答题要在32个小时之后了.一直都认为第一题没错.看来.要认真看书才是 10/28 00:08
- [mqmelon] 谢谢,我会努力去做. 10/27 23:18
- [游客] mqmelon同学,你能有这样的认识首先说明你的学习态度是对的,只要有正确的学习态度,就能够学好,以 10/25 11:56
- [sunshine] 呵呵 10/25 09:49
- [mqmelon] 谢谢,十分谢谢。 10/24 17:10