编写一个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】:

要了解完整情况,您需要发布完整代码,包括 getnumdivideprintnum 的实际定义。

假设:

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汇编语言程序来执行浮点数的乘法的主要内容,如果未能解决你的问题,请参考以下文章

汇编中浮点数的总和数组

ARM NEON 汇编和浮点舍入

用ARM汇编语言编写程序实现:求寄存器R0和R1中两个整数的最大公约数并将结果存储在R0中

编写一段ARM汇编程序段,实现1+2+...+100的运算

求用ARM汇编语言编写从1加到100的程序

汇编语言程序 99乘法表 急求