我想确认我对这个特定操作码的理解。
此行来自x-86-64机器(MBP 15“ 2017)中的汇编代码 我被这条指令弄糊涂了。
shlq $5, %rsi
所以我知道的是:
shl
是arithmetic的逻辑移位q
是代表四字的后缀,在x86-64机器上是8字节或64位。但是我不确定它将移位多少位。
因此,我进行了广泛的研究,发现一些here看起来最相关。在第47页上,它说:
sal
(或其同义词shl
)向左移(乘)一个字节,一个单词或 long值,用于由立即值指定的计数,并存储 乘积分别是该字节,字或长。第二个左移>移位CL寄存器中指定的计数值。高阶位 移入进位标志;低位设置为0。
我不确定它们在这里到底是什么意思,特别是“将乘积存储在该字节,字或长整数中”部分,但这是我的理解:
shlq $5, %rsi
这将左移5次。因此,该值将是原始值的2 ^ 5 = 32倍。然后,它将乘以该值与相应字长的乘积,在这种情况下,该字长为四字,因此为8个字节或64位。换句话说,它将总共移位 32 * 64 = 2048位或32 * 8字节= 256字节。
我正确吗?
上面的同一页下面有一个示例,但我听不懂。
示例
左移,由常数(253)指定的计数,32位内容 有效地址的数量(由EDI寄存器寻址加上偏移量) 之4):
shll $253, 4(%edi)
您的帮助将不胜感激!
研究的文档:
https://docs.oracle.com/cd/E19641-01/802-1948/802-1948.pdf https://docs.oracle.com/cd/E19455-01/806-3773/instructionset-27/index.html https://www.engr.mun.ca/~anderson/teaching/8894/reference/x86-assembly/ https://www.cs.cmu.edu/~fp/courses/15213-s07/misc/asm64-handout.pdf https://cs.brown.edu/courses/cs033/docs/guides/x64_cheatsheet.pdf https://docs.oracle.com/cd/E19253-01/817-5477/817-5477.pdf ...还有更多
答案 0 :(得分:1)
您的直觉是正确的,直到“然后,它将用该值与相应的字长(在这种情况下为四字)进行乘积运算”。那部分不会发生。该值仅乘以32,就可以了。