x86 行“imulq $44,(%rbx), %rax”有什么作用?

Jor*_*kie 1 x86 assembly att

我知道 imul 是有符号乘法,并且文档似乎表明三个操作数的语法是imulq dest, source1, source2. 因此,该行将读取为:将 %rbx 中存储的地址的内容与 %rax 中的值相乘,然后将其存储在内存位置 44 中,但这肯定不正确吗?

Dan*_*zar 6

您正在使用imul指令的三操作数变体,该变体在指令集参考中定义为IMUL r64, r/m64, imm8“乘以r/m64by的内容imm8并将结果存储在r64”中。该指令还有另一种变体,它采用 32 位立即数,但在这种情况下,无法判断汇编器将实际发出哪个变体。

现在,您的汇编器似乎正在使用 x86 汇编的 AT&T 语法。GNU 汇编器默认使用它。以相反的顺序指定指令的操作数是众所周知的。因此,imulq $44, (%rbx), %rax将乘以存储器的内容在存储在地址%rbx通过44,并且将结果存储在%rax