【问题标题】:What does the x86-64 instruction "shrb %dil" mean?x86-64 指令“shrb %​​dil”是什么意思?
【发布时间】:2017-01-30 18:02:12
【问题描述】:

我知道shrb 代表逻辑右移。通常它与两个参数一起使用,shrb amount, %register。但是,在我正在查看的代码中,它没有使用移位量 - 只指定了一个寄存器:

shrb %dil

其中%dil 代表%rdi 的最低有效字节。

现在上面的命令是否暗示我们向右移动 1?您将如何发现这一点?有没有办法以某种方式执行命令,看看会发生什么?该文档对于提供有关省略班次量时会发生什么的信息没有帮助:https://docs.oracle.com/cd/E19253-01/817-5477/817-5477.pdf

【问题讨论】:

  • 到底为什么要使用 oracle 文档。试试官方的英特尔,或者你的汇编程序。是的,默认情况下它是1,是的,您可以将其粘贴到程序中并在调试器中运行以查看它的作用。此外,反汇编程序也可能会显示隐含的1
  • 该指令与莳萝草指令同义。它旨在腌制您的程序
  • x86 上没有这样的指令。它必须是宏或特定汇编程序专有的东西。
  • @Henrik 它是 at&t 语法
  • 当它可以从操作数推导出来时它是可选的。如果你有一个内存操作数,那就不可能了。

标签: assembly x86 x86-64 att


【解决方案1】:

这是 AT&T/GAS 语法,与 Intel 语法有很大不同。在 Intel 语法中,等效指令为:

shr  dil, 1

它是 64 位长模式代码,将edi 寄存器的最低 8 位(指使用dil 助记符)右移 1 位。 (目标操作数的)最低有效位被移入进位标志 (CF),最高有效位被清除。 (shr 的标准行为。)

请注意,在您的代码中,shr 助记符以b 为后缀。这表明它是一个byte 大小的操作。 Intel 语法在操作数之一(例如DWORD PTR)上使用注释来消除歧义,而 AT&T 语法使用指令后缀:b 表示字节,w 表示字,l 表示长-word,q 表示四字等。

在这种情况下,b 后缀实际上是可选的,即使在 AT&T 语法中也是如此,因为目标操作数是 8 位寄存器,因此指令明确。但是,Gnu 工具通常会在所有指令中添加后缀以保持一致性,即使在没有歧义的情况下也是如此。这可能是您的代码来自哪里。

此外,在 AT&T 语法中,shrsarshl 指令通常在移位量为 1 时省略。换句话说,将其写成在技术上是正确的:

shrb  $1, %dil

但我见过的大多数工具都不会使用这种形式,尤其是 Gnu 反汇编程序。 (请注意 AT&T 和 Intel 语法之间的另一个区别:目标和源操作数是颠倒的。)

移位量为1时省略可能是历史原因。实际上,x86 上的每个移位指令都有三种不同的编码:一种以常数 1 移位,一种以立即数移位,另一种以cl 寄存器的内容移位。 shift-by-immediate 编码直到 286 才引入,这就是为什么 shift-by-1 有一个单独的(更短的)编码。如今,您可以将 shift-by-1 编码为 shift-by-immediate-1,但没有一个理智的汇编程序会这样做。尽管如此,AT&T/GAS 语法仍保留了符号中的这一历史遗产。

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 2012-05-02
    • 2016-05-24
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多