王素《汇编语言》 检测10.4

汇编程序如下 :

assume cs:code

 

stack segment

 

dw 8 dup (0)

 

stack ends

 

code segment

 

start :mov ax,stack

1000:0000

       mov ss,ax

1000:0003

      mov sp,16       

1000:0005

      mov ds,ax      

1000:0008

      mov ax,0 

1000:000A

      call word ptr ds:[0eH]    

1000:000D

      inc ax

1000:000E

      inc ax

 

      inc ax

 

code ends

 

end start

 

    stack段用 dw 8 dup (0)定义了16字节内存为0的栈段,所以ds:[0]~ds:[f]的内存单元全部为0,当然,ds:[0E]单元的内存自然就为0了!

  从程序中得知ss== sp 

 


call word ptr ds:[0eh] 指令执行的是push ip (这里的ip值为INC AX的偏移地址 为0eh。)

mov sp =16 告诉栈顶指针为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的偏移地址了

当程序再一次执行到call word ptr ds:[0EH]时,指针将跳转到ds:[0eh] ,而此时的:[0eh]处的值已经不是0了,它已变成上次执行call时被压栈的INC AX处的偏移地址,

所以进行  执行 inc ax  指令。

 

posted @ 2020-08-12 12:28  beitso-admin  阅读(208)  评论(0编辑  收藏  举报