ker*_*_os 5 linux gnu-assembler linux-kernel
这是内核代码中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
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我理解这个指令吗?
ret是从程序返回的指令.所以基本上它会将堆栈中的返回地址弹出到EIP寄存器中.
l这里的前缀是告诉它它是一个远离程序的回报.在这种情况下,指令首先将一个值从堆栈弹出到EIP寄存器,然后将第二个值弹出到CS寄存器中.
该w后缀在这里,因为在这个步骤中,我们在实模式下运行,并且操作数为16个位宽.
确切的代码是:
pushw %ds
pushw $6f
lretw
6:
Run Code Online (Sandbox Code Playgroud)
在6:这里是非常重要的.这样做的目的是:将ds的值压入堆栈,将6标签的地址压入堆栈,然后触发该lretw指令.所以基本上,它会将标签的地址加载6到指令指针寄存器中,并用cs寄存器的值加载ds寄存器.所以这只是一个6通过更改cs寄存器值来继续标签执行的技巧.
您应该下载http://www.intel.com/design/intarch/manuals/243191.htm,其中提供了所有指令的精确详细信息,包括详细说明每条指令正在执行的伪代码.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |