编写一个ARM汇编语言程序来执行浮点数的乘法

     2023-02-16     68

关键词:

【中文标题】编写一个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. *伪指令

浮点数比较技巧:内联汇编

...nstswaxmoval,ahandeax,1如果比较结果仅影响从一组2个值中选择一个值,则此技巧可以避免分支 查看详情

当两者都是变量时,如何将浮点数除以整数?

...布时间】:2014-01-2311:53:13【问题描述】:我正在用C语言编写一个程序。我有两个变量,一个是整数,另一个是浮点数。我想将浮点数除以整数并希望得到浮点数的结果。我正在执行以下操作:inta;floatb=0,c=0;scanf("%d",&a);然后我... 查看详情

iPhone上的VFP单元矩阵乘法问题

...619:07:56【问题描述】:我正在尝试使用iPhone上的矢量浮点编写Matrix3x3乘法,但是我遇到了一些问题。这是我第一次尝试编写任何ARM程序集,所以它可能是一个我没有看到的失败的简单解决方案。我目前正在使用我编写的数学库运... 查看详情

浮点数的乘法在 Numpy 和 R 中给出不同的结果

...】:我正在使用Python(Numpy)和R进行数据分析。我的数据是一个向量795067X3,根据我使用的是Numpy还是R,计算该数据的平均值、中位数、标准差和IQR会产生不同的结果 查看详情

2个浮点数进行计算

...【发布时间】:2012-02-0506:58:25【问题描述】:我正在尝试编写一个非常简单的Android应用程序。它接受2个浮点数,进行计算,当我运行我的应用程序时,它崩溃了。但是,如果我输入整数而不是浮点数,我的程序不会崩溃并且会... 查看详情

c语言对两个浮点数进行比较的方法(代码片段)

C语言对两个浮点数进行比较:C语言用"=="来比较两个浮点数,返回值完全是不确定的。 因此只能定义一个精度来确定是否相等:if(fabs(a-b)<0.0000001)  //double类型的a和b近似相等 查看详情

浮点数不准确

...inaccuracies【发布时间】:2011-01-0120:30:21【问题描述】:在编写一个对范围内的每个数字执行一些操作的函数时,我遇到了一些浮点不准确的问题。问题可以看下面的代码:#include<iostream>usingnamespacestd;intmain()doublestart=.99999,end=1... 查看详情

汇编中浮点数的总和数组

...时间】:2017-04-1214:41:25【问题描述】:我在汇编x86中实现一个从C程序调用的函数,以添加一个浮点数组。函数的第一个参数是指向数组的指针,第二个是元素的数量。当我在linux中运行代码时,出现分段错误。我做错了什么?.te... 查看详情

c语言“输入一个浮点数,输出它的绝对值,保留两位小数。”求解

以下是一个C语言程序,用于输入一个浮点数,输出它的绝对值并保留两位小数:```c#include<stdio.h>#include<math.h>intmain()floatnum,abs_num;printf("请输入一个浮点数:");scanf("%f",&num);//计算绝对值abs_num=fabs(num);//输出... 查看详情

检查字符串是不是包含浮点数或整数

...整数【发布时间】:2020-06-2701:58:06【问题描述】:我需要编写erlang函数,它接受一个字符串,然后如果字符串包含浮点数或整数,则执行不同的操作。我曾想过使用string:to_float和string:to_integer,但我想知道是否可以在模式匹配中... 查看详情

java浮点数精度丢失

Java浮点数精度丢失问题引入昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的double来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图:输入依次为:红包个数,抢红包的人... 查看详情

在c语言中,如何将一个浮点数变换成整数?

...:电脑、C语言编译器。1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。2、在test.cpp文件中,输入C语言代码:doublea=2.71828;printf("%d",int(a));。3、编译器运行test.cpp文件,此时成功将浮点数2.71828转换为了整... 查看详情

使用浮点数或小数记账应用美元金额?

...B.NET和SQLServer中重写我们的旧版accountingsystem。我们引入了一个新的.NET/SQL程序员团队来进行重写。大多数系统已经使用浮点数完成了美元金额。我编程的旧系统语言没有浮点数,所 查看详情

pycharm编译乘法计算问题?

...有时小数点后有十六位数,这是为什么?在计算机中,浮点数是以二进制存储的,而不是十进制。在十进制下,有些小数可以精确表示,例如0.5或0.25等。但是,在二进制下,某些分数可能无法准确表示,因为分数的分母可能无... 查看详情

float和real数据类型的区别??

...的实现和精度,这可能会影响程序的可移植性。因此,在编写跨平台的程序时,需要谨慎选择和使用浮点数的数据类型。需要注意的是,不同编程语言可能对float和real的实现和语义有不同的规定,因此,在具体的编程环境中,需... 查看详情

gtest变化量

GoogleTest(gtest)是一个C++编写的单元测试框架。它可以帮助开发人员编写、维护和运行C++代码的单元测试。在使用GoogleTest进行单元测试时,可以使用gtest的ASSERT_XXX()或EXPECT_XXX()宏来检查测试结果是否正确。其中,ASSERT_XXX()表示如... 查看详情

什么时候装配比c快?(代码片段)

...,但这是一个特定的问题,征求例子和数据,而不是关于汇编语言与高级语言的扩展讨论。任何人都可以提供一些特定的例子,其中汇编将比使用现代编译器的编写良好的C代码更快,并且您是否可以通过分析证据来支持该声明... 查看详情

python浮点数是啥意思

...数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数... 查看详情