汇编语言:ret和retf指令

1. ret指令

        ret指令用栈顶中的数据,修改IP的内容,从而实现近转移。执行ret指令的基本步骤原理如下:

(1)(IP) = ((ss)*16 + (sp))

(2)(sp) = (sp) + 2

所以,CPU执行ret指令时,相当于执行:pop IP

IP(Instruction Pointer)是指令指针寄存器

ss(stack segment)是栈段寄存器

sp(stack pointer)是栈指针寄存器

下面的程序,ret指令执行后,(IP) = 0,CS:IP指向代码段的第一条指令

assume cs:code, ss:stack
stack segment
    db 16 dup (0)
stack ends
code segment
    mov ax, 4c00h
    int 21h
start:
    ;初始化栈段
    mov ax, stack
    mov ss, ax
    mov sp, 16

    mov ax, 0
    push ax         ;栈顶数据为0
    ret             ;相当于执行:pop IP指令,所以ret指令执行后,(IP) = 0
code ends
end start

2. retf指令

         retf指令同时用栈顶中的数据,修改IP和CS,从而实现远转移。执行retf指令的基本步骤原理如下:

(1)(IP) = ((ss)*16 + (sp))

(2)(sp) = (sp) + 2

(3)(CS) = ((ss)*16 + (sp))

(4)(sp) = (sp) + 2

所以,CPU执行ret指令时,相当于执行:

(1)pop IP

(2)pop CS

CS(Code Segment)是代码段寄存器

下面的程序,retf指令执行后,(IP) = 0, CS:IP指向代码段的第一条指令

assume cs:code, ss:stack
stack segment
    db 16 dup (0)
stack ends
code segment
    mov ax, 4c00h
    int 21h
start:
    ;初始化栈
    mov ax, stack
    mov ss, ax
    mov sp, 16

    push cs
    mov ax, 0
    push ax
    retf        ;相当于执行:(1)pop IP; (2)pop CS, 所以retf指令执行后,CS:IP指向了代码段的第一条指令
code ends
end start

参考文献

《汇编语言(第4版)》- 王爽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值