帮助理解此代码段

时间:2011-09-08 03:00:03

标签: linux linux-kernel gas

这是内核代码中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

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

1 个答案:

答案 0 :(得分:5)

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

此处l前缀表示它是从程序返回的。在这种情况下,指令首先将堆栈中的值弹出到EIP寄存器中,然后将第二个值弹出到CS寄存器中。

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

确切的代码是:

    pushw   %ds
    pushw   $6f
    lretw
6:

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

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