编写一个ARM汇编语言程序来执行浮点数的乘法
Posted
技术标签:
【中文标题】编写一个ARM汇编语言程序来执行浮点数的乘法【英文标题】:Write an ARM assembly language program to perform multiplication of floating point number 【发布时间】: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 截断)。
【参考方案1】:
要了解完整情况,您需要发布完整代码,包括 getnum
、divide
和 printnum
的实际定义。
假设:
getnum
从某个地方(控制台?)获取一个整数并将其存储在 r0
代码中引用的divide
函数将r0
除以r1
,并将结果保存在相同的寄存器中(不确定r1
是什么,可能是除法提示)。
printnum
只是打印出r0
的值。
如果我的假设是正确的,只需将您的代码组合在一起:
bl getnum
mul r0, r0, #6985
mov r1, #1000
bl divide
bl printnum
奖金
AFAIK 你不能对mul
命令使用相同的寄存器。不确定它是否适用于所有 ARM。
【讨论】:
Cainkovs - 是的,mul r0、r0 ... 适用于 Cortex-A9、A53 和 M-4。但是,乘法器(#6985)必须先放在另一个寄存器中;例如,Cortex-A9 movw r9, #6985, Cortex-M4 ldr r9,=#6985*, Cortex-A53 mov x9, 6985. *伪指令以上是关于编写一个ARM汇编语言程序来执行浮点数的乘法的主要内容,如果未能解决你的问题,请参考以下文章