cpu执行ret指令时,进行下面两步操作:
(1)(ip)=((ss)*16+sp)
(2)(sp)=(sp)+2
为什么这段程序执行后IP为0
assume cs:code
stack segment
db 16 dup(0)
stack ends
code segment
mov ax,4c00h
int 21 21h
start mov ax,stack
mov ss,ax
mov sp,16
mov ax,0
push ax
mov bx,0
ret
code ends
end start
------解决方案--------------------------------------------------------
ret指令用栈中数据修改ip的值,从而实现段内转移。
这个程序里,
mov ax,0 ;此时sp=0eh,ss:sp指向内容为0000
push ax ;
而
ret ;实现了用栈中数据修改ip的功能,由于是段内转移,
;所以CS的值不变,仅仅用栈中弹出数据赋予ip新值。
;此时sp=10h,ip=0000