ret指令用栈中的数据,修改IP,实现近转移
1,(IP)=((SS)*16+(SP))
2,(SP)=(SP)+2
相当于 pop IP
retf指令用栈中的数据修改CS和IP,实现远转移
1,(IP)=((SS)*16+(SP))
2,(SP)=(SP)+2
3,(CS)=((SS)*16+(SP))
4,(SP)=(SP)+2
相当于pop IP,pop CS
call指令分两步操作
1,将当前的IP或IP,CS压入栈中
2,转移
call不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同
call 标号相当于
push IP
jmp near ptr 标号
call far ptr 标号 实现段间转移,相当于
push CS
push IP
jmp far ptr 标号
call 16位reg,转移地址在寄存器中
push IP
jmp 16位reg
call word ptr 内存单元地址
push IP
jmp word ptr 内存单元地址
call dword ptr 内存单元地址
push CS
push IP
jmp dword ptr 内存单元地址
使用ret和call,模块坏编程
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
call fun1
MOV AH,4CH
INT 21H
fun1:
...
call fun2
...
ret
fun2:
...
ret
CODES ENDS
END START
用跳转指令执行数据区的机器指令
DATAS SEGMENT
; 这是mov ax,1234h的机器指令
w db 0B8h,34h,12h
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
push ax
mov ax,0
push ax
retf
MOV AH,4CH
INT 21H
CODES ENDS
END START