有关ret指令有时不好用的问题
做实验10-3的时候发现ret没有跳到call指令的下一行,然后就试了试,弄清了ret的具体实现。代码1:
定义栈段(省略)
code segment
start:mov ax,3
mov bx,1
。
。
call add_1
mov ax,4c00h
int 21h
add_1:push ax
add ax,bx
ret
code ends
此时执行ret指令后跳转到mov bx,1(即第二句)
代码2:
定义栈段(省略)
code segment
start:mov ax,3
mov bx,1
。
。
call add_1
mov ax,4c00h
int 21h
add_1:push ax
add ax,bx
pop ax
ret
code ends
只是在ret指令上一行加了pop ax
执行ret结果:跳到mov ax,4c00h.正常跳转
总结:为什么代码1没有正常跳转,原因是定义栈段的时候。使用ret相当于pop ip,这时候的ip有两种可能:
一种是ip指向定义的栈段,此时pop的ip是定义栈段里即时ip;
另一种是没定义栈段,或者定义了栈段但是栈的指针指向栈底(就是push与pop一样多的)
这时候ret指令pop的ip则是由call时由系统自动分配的ip。
由此我们可以利用定义的栈段来自己设定ret的位置,相当于jmp了
谢谢楼主分享,谢谢
页:
[1]