【发布时间】:2016-10-10 15:37:53
【问题描述】:
我需要用 ARM 汇编语言编写一个程序,该程序将整数作为输入并返回该整数乘以 6.985 的整数值。例如,如果输入 36 作为输入,则结果将为 251。
我只能使用内置函数 add(将两个整数相加)、mul(将两个整数相乘)、divide(将两个整数相除)、getnum(从用户获取一个整数作为输入)和 printnum (它将输出打印到屏幕上)。我的做法是先乘以 6985,再除以 1000。
这是我的 mul 函数代码:
bl getnum
mul r0, r0, #6985
bl printnum
这是我的除法代码:
bl getnum
mov r1, #1000
bl divide
mov r4, r0
mov r5, r1
bl printnum
mov r0, r5
bl printnum
我的问题是如何将这两种方法结合起来,使其同时执行乘法和除法?我还是这门语言的新手,所以我不知道如何去掉divide函数中的getnum并将它与mul函数结合起来。
【问题讨论】:
-
您使用的是什么 ARM 指令集和处理器系列; ARMv7 用于 Cortex-M4 等?通常,没有一条指令可以同时进行乘法和除法,并且某些 ARM 处理器没有除法指令。
-
如果你没有非常精确的精度要求,你可以做 *57221 然后除以 8192 = *6.9849853515625 .. 重点是,8192 是 2^13,所以除法是简单的左移 13 位。 (为了获得更好的准确性,只需将原始 6.985 值乘以 2 直到您对小数点感到满意以截断它们,并计算您将其相乘的次数)。否则你的方法是有效的,不确定你在问什么,只需使用
mul的结果作为除法部分。 (如果您使用 2 的幂,请尝试在溢出之前可以将最大数量相乘) -
除以 2 的幂当然是右移,左移是乘以 2 的幂。
-
@Ped7g 一般而言,div/mul 按两 (2) 班次的幂计算,但并非全部适用。见publications.ai.mit.edu/ai-publications/pdf/AIM-378.pdf
-
@InfinitelyManic 是的,但在这种特殊情况下这不是问题(有符号整数 * 57221 / 8192 .. 对于 -1 输入,它将输出正确的 -6)。在处理十进制数字时,它总是以精度为代价(除非您逐位处理它们),因此您还必须小心使用 *6985 /1000,因为它有自己的一组问题(溢出和 /1000 截断)。