汇编 ret,retf和call

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

093048_mmjb_2856757.png

转载于:https://my.oschina.net/ahaoboy/blog/1803278

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值