我知道shrb
代表转变逻辑正确。通常它与两个参数shrb amount, %register
一起使用。但是,在我看的代码中它不使用移位量 - 只有一个指定的寄存器:
shrb %dil
其中%dil
代表%rdi
的最低有效字节。
现在上面的命令意味着我们向右移动了1?你怎么会发现这个?有没有办法以某种方式执行命令,看看会发生什么?该文档无法提供有关当忽略班次金额时发生的情况的信息:https://docs.oracle.com/cd/E19253-01/817-5477/817-5477.pdf
答案 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语法中,shr
,sar
和shl
指令通常会在它为1时省略移位量。换句话说,它在技术上是正确的把它写成:
shrb $1, %dil
但是我见过的大多数工具都不会使用这种形式,特别是Gnu反汇编程序。 (请注意AT& T和Intel语法之间的另一个区别:目标和源操作数颠倒。)
当它为1时省略偏移量可能是出于历史原因。对于x86上的每个移位指令实际上有三种不同的编码:一个移位常数1,一个移位一个立即,一个移位cl
寄存器的内容。直到286时才引入立即移位编码,这就是为什么存在单独(更短)的1次移位编码的原因。如今,你可以将shift-by-1编码为shift-by-immediate-1,但没有理智的汇编程序会这样做。尽管如此,AT& T / GAS语法仍然保留了这一历史遗产。