首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

王爽《汇编语言》检测点10.4 遇到困难解决方法

2012-03-04 
王爽《汇编语言》检测点10.4 遇到困难内存地址机器码汇编指令1000:0b80000movax,61000:2ffd0call,ax1000:540

王爽《汇编语言》检测点10.4 遇到困难
内存地址   机器码   汇编指令
1000:0   b8   00   00   mov   ax,6
1000:2   ff   d0   call,ax
1000:5   40   inc   ax
1000:6   mov   bp,sp
add   ax,[bp]
==========================以下是ddrmsdos的分析======================
回复人:ddrmsdos(handong)   (   )   信誉:100   2007-1-10   15:10:07   得分:90  
 
在执行了
call   ax
的时候
指令寄存器会指向下一条指令的起始地址,也就是
1000:5   inc   ax
然后指令寄存器ip=5要压入堆栈
然后跳转到cs:ax指定的地址执行
又因为此时ax中的值为6   ,cs=1000
所以跳转到1000:6执行
于是修改   ip为6
到此时call   ax指令才执行完毕

然后就执行
mov   bp,sp
因为sp里面放的是堆顶的地址,所以bp也是栈顶的地址了
之后
add   ax,[bp]
因为,bp里面放的是栈顶的地址,所以   [bp]   寄存器寻址后   [bp]实际是代表该地址单元的内容,也就是栈顶的内容,因为先前我把ip压入了堆栈,所以[bp]得到的内容就是5(先前在call   ax时候压入的ip的值)

所以   ax=ax+[bp]
也就是   ax=6+5=B
=================================================
  关于这句:
mov   bp,sp
因为sp里面放的是堆顶的地址,所以bp也是栈顶的地址了

我不明白啊,sp应该都是放偏移地址的吧?
那么mov   bp,sp应该只是把栈顶的偏移地址传给了bp啊,
那add   ax,[bp]   为什么不等于   add   ax,ds:[bp]   而是   add   ax,ss:[bp]

我是初学汇编的菜鸟
 


[解决办法]
[bp] 缺省的段就是 ss 而不是 ds

热点排行