ret,retf,iret等的区别

ret:也可以叫做近返回,即段内返回。处理器从堆栈中弹出IP或者EIP,然后根据当前的CS:IP跳转到新的执行地址。如果之前压栈的还有其余的参数,则这些参数也会被弹出。

 

retf:也叫远返回,从一个段返回到另一个段。先弹出堆栈中的IP/EIP,然后弹出CS,有之前压栈的参数也会弹出。(近跳转与远跳转的区别就在于CS是否压栈。)

 

iret:用于从中断返回,会弹出IP/EIP,然后CS,以及一些标志。然后从CS:IP执行。

 

iretw:先后弹出IP,CS和标志位,每次都以2个字节为一个单位弹出,总共6个字节。

iretd:以4字节为单位弹出EIP,然后再弹4个字节,这四个字节的前两个字节被抛弃,低两个字节留下写入CS,然后弹出4字节的标志。(主要因为CS只有16位)

 

iret是iretw或者iretd的缩写,取决于一个段被申明为16位段还是32位段。

 

原文链接: ret,retf,iret等的区别 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-428.html )

发表评论

2则评论给“ret,retf,iret等的区别”

  1. qqq

    补充一点

    如果NT位为0,使用iret时返回值从堆栈中获取  ....中断返回
    如果NT位值为1 ,使用iret (不是中断返回)  而是从Previous Task Link 前一个TSS段选择子找到TSS找到各个寄存器的值返回

    不要调试单步执行,会进0环把NT位清零,再使用iretd 因为NT位被置0 从堆栈返回,不会取出前一个TSS里的值 直接蓝屏...坑


    使用jmp指令访问任务段:
    jmp 0x48:0x123456
    如果0x48是TSS段描述符,先修改TR寄存器,再用TR.Base指向的TSS中的值修改当前的寄存器.
    CALL 0x48:0x12345678
    使用 JMP 和CALL的区别
    使用CALL 会储存上一个TSS段选择子到Previous Task Link
    使用JMP这个值不变
    如果用JMP访问TSS段描述符 EFLAGS寄存器的NT位值不变
    如果用CALL访问TSS ,EFLAGS寄存器的NT位会被置1

    回复