【发布时间】:2012-10-19 03:11:35
【问题描述】:
我正在为它制作一个虚拟机和一个 C 编译器。我不明白的是大多数指令集如何具有 IMUL 和 IDIV,但没有 ISUB 和 IADD。由于 sub 通常是 unsigned sub 我怎么能在 x86 中做类似的事情
MOV EAX,1
MOV EDX,3
SUB EAX,EDX,EAX
得到-2?
【问题讨论】:
-
你熟悉二进制补码吗?
-
FWIW MIPS 确实有无符号和有符号的加减法(它们是否检查溢出不同)。
-
更有趣的是,使用 2 的补码,乘法结果的低半部分也与符号无关。这就是为什么没有任何版本的
mul只给出较低的部分,imul已经做到了。
标签: assembly signed unsigned-integer