加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

王爽汇编语言检测点10.5(1)解题分析

(2014-11-29 22:27:34)
标签:

股票

分类: 笑话收藏

王爽汇编语言检测点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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有