王爽汇编语言检测点10.5(1):
下面的程序执行后,ax中的数值为多少?
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] ;
inc ax
inc ax
inc ax
mov ax,4c00h
int 21h
code ends
end start
答案:ax=3
分析:
1、本题stack段用 dw 8 dup
(0)定义了16字节内存为0的栈段,所以ds:[0]~ds:[f]的内存单元全部为0,当然,ds:[0E]单元的内存自然就为0了!
2、本题ds=ss,也即数据段与栈段于同一段内,sp=16,指向栈顶,当指令执行到call word ptr
ds:[0eh]这条指令的时候,相当于进行了:(1)PUSH IP(此时IP的值为CALL语句下一条语句的偏移地址,也就是INC AX的偏移地址),由于初始栈顶指针指向16,所以push
ip执行时,先将指针进行了(sp)=(sp)-2的操作,使sp指向14,也就是ss:[0eh],再将call word ptr
ds:[0eh]的下一条指令INC AX的偏移地址入栈到ss:[oeh]处 ,而ds=ss,因此此时ds:[0eh]处存放着的已经是INC AX的偏移地址了;(2)JMP WORD PTR ds:[OEH],因为 SS:[0EH]的值为0,所以跳转到CS:0处开始执行,也就是程序的第一条语句MOV AX;(3)当程序再一次执行到call word ptr ds:[0EH]时,指针将跳转到ds:[0eh]
,而此时的:[0eh]处的值已经不是0了,它已变成上次执行call时被压栈的INC AX处的偏移地址,它使执行call
word ptr ds:[0eh]的跳转直接跳到指令inc,ax处,连续3次inc 后,AX的值为3.
其实,检测点10.5(2)与此题一致,无非是压栈时多压入了一个cs的值!
以下内容补充于2017年6月4日,说明咱们还是认真对待学习的问题的 http://www/uc/myshow/blog/misc/gif/E___6725EN00SIGG.gif
因为求ax的值不方便验证咱们的想法,因此我们改为求dx的值,且涉及到的语句都进行加法运算:
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
add
dx,3
call word ptr
ds:[0eh]
;第一次执行到这里时,栈顶处值为0,(dx)=(dx)+3,程序跳到第一条指令
inc
dx ;第二次,程序就执行到这里了,这时候,dx 的值已经又加了一次3
inc dx
inc dx
mov ax,4c00h
int 21h
code ends
end start
加载中,请稍候......