王爽汇编语言检测点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
下面的程序执行后,ax中的数值为多少?
assume cs:code
stack segment
stack ends
code segment
start:
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

