10.1
The answer is (mov ax,1000h ; mov ax,0).
程序中采用的retf,在此之前用了两次push指令,很明显用到了cs和ip的值,根据retf指令的操作知道先pop ip,再pop cs,所以在入栈时就先cs,再ip。
10.2
ax=6。
第一次做错了,认为ax=3,后来觉得有点太顺理成章,所以又看了一遍,发现执行call指令时,压入堆栈的值是call的下一条指令的偏移地址,试想ax=3,那么pop ax又返回到call指令了,这样就变成了死循环。
10.3
ax=1010h
经过call指令后,进入堆栈的cs=1000,ip=8,进过pop ax后,栈中的ip值赋给了ax,则ax=8
add后,ax=16=10h
pop bx后,bx=栈中cs=1000h
add ax,bx后,ax=1000h+10h=1010h
10.4
ax=11=0bh
call ax后,ip=5被压入栈中,同时程序跳转到1000:6
bp=sp,因为刚才sp指向ip=5,所以ax=6+5=11=0bh
10.5
(1)ax=3
注意一点:call word ptr 内存单元地址 相当于
push ip
jmp word ptr 内存单元地址
分析程序:前面是初始化寄存器,到 call 指令
首先将 inc ax 所对应的偏移地址压入堆栈,然后找到ds:[0EH],并跳转,我们发现ds:[0EH]里的内容就是指令 inc ax 的偏移地址,所以这里 call 指令,只相当于是个 push 指令了
(2)ax=1,bx=0
此程序采用了 call dword ptr ss:[0],首先将当前cs,ip压入堆栈,先cs,后ip,然后跳转到(ss:[0]=offset s)
程序将标号 s 所指的偏移地址赋给了ax
再来看ss:[0ch]是什么,就是nop指令所对应的偏移地址,而nop指令占一个字节,所以 sub ax,ss:[0ch] 后 ax=1
ss:[0eh] 里面存的是cs的值,因为程序没有改变过cs的值,所以bx=0
![学习动态](images/model1/b8.gif)
![最新评论](images/model1/b1.gif)
- [alabo886] 出现add [bx+si],al 我的也是啊,有时还出现别的莫名其妙的指令,不明怎么回事? 10/18 10:30
- [2007211006sj] 假如code中 a dw 1,2,3,4,5,6,7,65500 b dd 0 呢? 06/11 20:51
- [游客] 呵呵 ,我刚学汇编,一口气读完了第5章,希望以后可以一起讨论. 07/14 17:37
- [deepblue] 加油!革命同志 06/20 10:08
- [ppt] 做笔记很好,记忆深刻. 06/14 12:07
- [duckgaga] 加油! 06/12 23:40
- [tomato] 够认真! 06/12 20:25
- [tomato] 博主学习汇编语言的路程马上要走完了!一路辛苦了!不过改个弯又是另一条更宽阔的路途等待博主去走下去!加 06/12 20:23
- [tomato] 嗯,不错,我比较喜欢优美的文章,呵呵! 06/12 20:09
- [ppt] 分析分析不错. 06/11 22:57
[ 游客 发表于 2008-05-21 11:21 ]
理解的都很正确。
一定要记牢,理解透哟。这在以后的学习过程中可是很重要滴。