汇编 ret,retf和call

原创
2018/04/30 09:25
阅读数 186

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部