加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 帮助理解这段代码片段

发布时间:2020-12-14 00:59:42 所属栏目:Linux 来源:网络整理
导读:这是内核代码中header.S文件的代码片段.我无法理解lretw指令的作用.我已经查看了很多在线资源来获取该指令. # We will have entered with %cs = %ds+0x20,normalize %cs so# it is on par with the other segments. pushw %ds pushw $6f lretw 任何人都可以
这是内核代码中header.S文件的代码片段.我无法理解lretw指令的作用.我已经查看了很多在线资源来获取该指令.

# We will have entered with %cs = %ds+0x20,normalize %cs so
# it is on par with the other segments.
        pushw   %ds 
        pushw   $6f 
        lretw

任何人都可以帮助我理解这个指令吗?

解决方法

ret是从程序返回的指令.所以基本上它会将堆栈中的返回地址弹出到EIP寄存器中.

l前缀在这里告诉它它是程序的远程返回.在这种情况下,指令首先将一个值从堆栈弹出到EIP寄存器,然后将第二个值弹出到CS寄存器中.

w后缀在这里是因为在这一步我们以实模式运行,操作数是16位宽.

确切的代码是:

pushw   %ds
    pushw   $6f
    lretw
6:

6:在这里非常重要.这样做的目的是:将ds的值压入堆栈,将6标签的地址压入堆栈,然后触发此lretw指令.基本上,它会将标签6的地址加载到指令指针寄存器中,并使用ds寄存器的值加载cs寄存器.因此,这只是通过更改cs寄存器值继续在标签6执行的技巧.

您应该下载http://www.intel.com/design/intarch/manuals/243191.htm,它提供所有指令的精确详细信息,包括详细说明每条指令正在执行的伪代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读