我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?
Visual Studio或Visual C++ Express的现代(2008/2010)版本是否会在编译代码中生成x86 MUL指令(无符号乘法)?我似乎无法找到或设想它们出现在编译代码中的示例,即使使用无符号类型也是如此.
如果VS不使用MUL进行编译,是否有理由说明原因?
作为一个刚接触组装的人,我使用gcc进行逆向工程.但现在我遇到了一个有趣的问题:我尝试将两个64位整数乘以x86-64.C代码如下:
unsigned long long
val(unsigned long long a, unsigned long long b){
return a*b;
}
Run Code Online (Sandbox Code Playgroud)
并使用gcc编译:
val:
movq %rdi, %rax
imulq %rsi, %rax
ret
Run Code Online (Sandbox Code Playgroud)
将有符号乘法用于无符号整数可能违反直觉,但它适用于C.
但是,我想检查溢出的乘法.现在,如果结果大于2^63-1(我猜因为它毕竟是带符号的乘法),则设置溢出标志.但对于无符号的64位,只要结果不大于此值,这仍然可以2^64-1.
在这种情况下,进行乘法(在汇编中)的正确方法是什么?