【发布时间】:2012-11-27 22:52:17
【问题描述】:
我在汇编中的以下操作时遇到了一些问题。 我正在组装 IA32。假设 -4(%ebp)=x 和 -8(%ebp)=y 我已经从用户那里得到它们(都是 32 位长)。 这是代码:
format1: .string "Multiply : %u * %u = %llu\n"
format2: .string "Divide : %u / %u = %u\n"
# operation multiply
movl -4(%ebp), %eax
mull -8(%ebp)
pushl %edx
pushl %eax
pushl -8(%ebp)
pushl -4(%ebp)
pushl $format1
call printf
# operation divide
movl -4(%ebp), %eax
divl -8(%ebp)
pushl %eax
pushl -8(%ebp)
pushl -4(%ebp)
pushl $format2
call printf
乘法的结果在 %llu 中的原因是因为我希望能够将 2 个长数字相乘并打印结果,即使它达到 64 个字节。 而且在 %edx 中,mull 命令保存了 64 字节结果的“其他 32 字节”,所以我需要将它推送到堆栈以及 printf。 例如我想要这个输出:
Multiply : 4000000000 * 2 = 16000000000
另外,我希望 3 与 4 的除法运算返回 X.YZ 结果。 (尾数不超过2个数字,不四舍五入) 例如
Divide : 3 / 4 = 0.75
对于 19 和 1000:
Divide : 19 / 1000 = 0.01
对于 8 和 2:
Divide : 8 / 2 = 4.00
我确实尝试了很多来获得结果,但没有成功。 多谢! :)
【问题讨论】:
-
4000000000 * 2 = 16000000000?星球大战:奔腾反击? -
只是想举个例子,我需要能够得到最大 64 位的结果。我还不能让这个例子在我的代码中工作:/
-
为什么?为什么要标记这个 C 或 C++?如果你坚持C,你有没有问过你当地的C专家,也就是你的C编译器,他会怎么做? (例如,使用 gcc 或 clang 选项 -S 会产生非常好的汇编代码)
-
对于除法,将分子乘以 100(注意溢出),然后在最后两位数之前插入一个小数点。