x86-64指令“shrb%dil”是什么意思?

时间:2017-01-30 18:02:13

标签: assembly x86 x86-64 att

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

shrb %dil

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

现在上面的命令意味着我们向右移动了1?你怎么会发现这个?有没有办法以某种方式执行命令,看看会发生什么?该文档无法提供有关当忽略班次金额时发生的情况的信息:https://docs.oracle.com/cd/E19253-01/817-5477/817-5477.pdf

1 个答案:

答案 0 :(得分:0)

这是AT& T / GAS语法,与英特尔语法非常不同。在Intel语法中,等效指令为:

shr  dil, 1

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

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

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

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

shrb  $1, %dil

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

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