我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?
Visual Studio或Visual C++ Express的现代(2008/2010)版本是否会在编译代码中生成x86 MUL指令(无符号乘法)?我似乎无法找到或设想它们出现在编译代码中的示例,即使使用无符号类型也是如此.
如果VS不使用MUL进行编译,是否有理由说明原因?
我正在使用运行时调试器.
EAX:0000 0023 EDX:5555 5556
imul edx
Run Code Online (Sandbox Code Playgroud)
EAX:aaaa aac2 EDX:0000 000b
我完全糊涂了,无法弄清楚这种倍增是如何起作用的.这里发生了什么事?我在这里的类似问题中注意到 imul ebx ; result in EDX:EAX我不理解EDX:EAX表示法虽然:/
我正在使用DosBox模拟器学习x86的汇编.我正在尝试执行乘法.我不知道它是如何工作的.当我写下面的代码时:
mov al, 3
mul 2
Run Code Online (Sandbox Code Playgroud)
我收到一个错误.虽然,在我使用的参考文献中,它在乘法中说,它假设AX始终是占位符,因此,如果我写:
mul, 2
Run Code Online (Sandbox Code Playgroud)
它将al值乘以2.但它不适用于我.
当我尝试以下内容时:
mov al, 3
mul al,2
int 3
Run Code Online (Sandbox Code Playgroud)
我在ax中得到了结果9.请参阅此图片以获得澄清:

另一个问题:我可以直接使用内存位置吗?例:
mov si,100
mul [si],5
Run Code Online (Sandbox Code Playgroud) 我编译了以下程序:
#include <stdint.h>
uint64_t usquare(uint32_t x) {
return (uint64_t)x * (uint64_t)x;
}
Run Code Online (Sandbox Code Playgroud)
这拆解为:
0: 89 f8 mov eax,edi
2: 48 0f af c0 imul rax,rax
6: c3 ret
Run Code Online (Sandbox Code Playgroud)
但是imul用于乘以有符号数字的指令.那为什么用gcc呢?
/ edit:使用uint64_t程序集时类似:
0: 48 0f af ff imul rdi,rdi
4: 48 89 f8 mov rax,rdi
7: c3 ret
Run Code Online (Sandbox Code Playgroud) 我试图在汇编中进行简单的乘法操作,但由于某种原因,我没有看到寄存器在标记MUL功能时发生变化.
mov bx, 5
mov cx, 10
mul cx
Run Code Online (Sandbox Code Playgroud) 如果您需要在 MIPS 中将两个任意有符号数相乘,是否有理由选择:
mul $t0 $s0 $s1
Run Code Online (Sandbox Code Playgroud)
或这个:
mult $s0 $s1
mflo $t0
Run Code Online (Sandbox Code Playgroud)
?
我在网上发现每个答案的含义不一致。乍一看,我认为前者是后者的伪指令。(甚至有一个网页声称这一点。)但是查看机器代码,它似乎是mult有效的 R 类型指令(操作码 0),而mul具有非零操作码(0x1c),因此不应该是 R 类型,即使它包含 3 个寄存器?!
RISC 哲学要求经常使用伪指令,因为我们只有有限的真实指令。但我只是没有想到为什么需要两种不同的乘法。两者都会影响lo和hi(使用 MARS),因此您可以检查其中任一是否溢出。那么为什么要裁员呢?mul为什么不直接告诉大家一直使用呢?
按位运算的有符号和无符号变量之间有什么区别吗?
例如,处理无符号数时:
AND 00000111, 00001101
将导致00000101.
但是在处理签名号码时会发生什么?
在 x86 汇编中,大多数指令具有以下语法:
operation dest, source
Run Code Online (Sandbox Code Playgroud)
例如,add看起来像
add rax, 10 ; adds 10 to the rax register
Run Code Online (Sandbox Code Playgroud)
但是助记符就像mul并且div只有一个操作数source- 被destination硬编码为rax. rax这迫使您在想要乘法或除法时随时设置并跟踪寄存器,如果您正在进行一系列乘法,这可能会变得很麻烦。
我假设存在与乘法和除法的硬件实现相关的技术原因。有没有?
如果我将两个16位数相乘,结果将是32位长.但为什么会这样呢?这有什么明确的解释?
并且为了正确理解:对此的计算是:n位数乘以m位数给出(n + m)位数?