|
发表于 2012-7-20 00:03:44
|
显示全部楼层
为什么没有回答的呢?我尝试以下吧 理解的不好,大家帮忙指正共同学习:lol
mov ax,data
mov ss,ax ;这里数据段就作为栈段使用了。
mov sp,16 ;SS:SP=[data]:[10h]
mov word ptr ss:[0],offset s ;offset s 取标号S偏移地址存入内存单元ss:[0]
mov ss:[2],cs ;这里将段地址CS的值存入内存单元ss:[2]中,以上这两句就是确定了CALL
执行时需要的地址CS:IP ,当CALL执行时转移到SS:[0],而此单元的内容
正好是标号S的地址
call dword ptr ss:[0] ;这里call执行时还是分两步,由于是双字转,移所以首先将CS的值压入栈顶中
即ss:[0eH],将IP的值压入ss:[0cH](此处压入的IP值就是call临近的下一
条指令nop处的偏移地址)
nop ;由于call直接跳转到了标号s处,所以该指令没有被执行,但是占用一个字节,
如果没有NOP指令,则call执行IP的压栈操作时压入的IP值就会是标号S的偏移
地址,那时候结果ax就是0
s:mov ax,offset s ;取标号S的偏移地址存入ax中
sub ax,ss:[0ch] ;ax=ax-ss:[0Ch]=001A-0019=1,AX中的内容是标号S的偏移地址,
[0cH]单元的内容就是NOP指令的偏移地址 ,确实相差1
mov bx,cs
sub bx,ss:[0eh] ;bx=bx-ss:[0eH]=0正是CALL执行时将CS的值压入到了ss:[0eH]
其实可以给CS、标号S的偏移地址赋个值这样理解更直观。总之记住CALL执行时压入的IP的值就是它临近的下一条指令的偏移地址就行了。 |
评分
-
查看全部评分
|