【问题标题】:help in understanding this code snippet帮助理解此代码片段
【发布时间】:2011-09-08 03:00:03
【问题描述】:

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

谁能帮我理解这个指令?

【问题讨论】:

标签: linux linux-kernel gnu-assembler


【解决方案1】:

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

l 前缀在这里表明它是从过程返回的far。在这种情况下,指令首先将堆栈中的一个值弹出到 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,它提供了所有指令的精确详细信息,包括详细说明每条指令的作用的伪代码。

【讨论】:

  • 我查看了本手册...但找不到具体说明。可能我不是很清楚..你真的很棒谢谢你的清晰解释..我喜欢它..
  • 顺便说一句,当评论说要规范化 %cs 时是什么意思...感谢您帮助我。
  • 为什么是 $6f? $6f 不意味着 6.. 的绝对值吗? f 后缀有什么作用?对不起,问题流。
  • 不,$6f 不是绝对值 6,而是表示 6 标签的地址为正向(f 代表正向)。请参阅sourceware.org/binutils/docs-2.21/as/… 上的“本地标签”
  • 谢谢......很抱歉没有回复最佳答案......我不同步。
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
相关资源
最近更新 更多