这是来自内核代码中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
的地址加载到指令指针寄存器中,并将cs
寄存器的值加载到ds
寄存器的值中。所以这只是继续执行标签6
并改变cs
寄存器值的一种技巧。
您应该下载http://www.intel.com/design/intarch/manuals/243191.htm,其中给出了所有指令的详细信息,包括详细说明每个指令正在执行的伪代码。
我看了这本手册......但找不到具体的说明。可能是我不是很清楚.. 你真的很棒非常感谢您的明确解释..我喜欢它.. –
顺便说一句,当它说正常化%cs时,意思是什么......感谢帮助我。 –
为什么是6美元?不$ 6f平均值的绝对值为6 ..和f后缀是什么?对于一系列问题感到抱歉。 –
http://disi.unitn.it/~abeni/SO2/LinuxKernel/boot.html? – istepura