帮助理解这段代码片段

这是来自内核代码中的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寄存器。 所以这只是一个诀窍,继续在标签6处执行cs寄存器值的更改。

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