首页 算命 正文

arm指数运算命令

一、ARM上的浮点如何运算

首先,我们先看一下arm处理器是如何处理浮点运算的。

交叉编译器在编译的时候,对于浮点运行会预 设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制。也就是说如果有浮点协处理器则交给它去做,如果没有则会产生一个陷阱(trap,处理器响应异常的机制), 而我们事先准备好针对浮点指令的陷阱处理程序就可以通过软件来模拟浮点运算指令。

然后,我们 解释一下OABI和EABI这两个概念。 /********************************************************************************************/以下部分转 载至 linux.chinaunix.net/bbs/thread-1143604-1-1.html">http://linux.chinaunix.net/bbs/thread-1143604-1-1.html . 1.什么是ABI ABI,application binary interface (ABI),应用程序二进制接口。

既然是 接口,那就是某两种东西之间的沟通桥梁,此处有这些种情况:A.应用程序 操作系统;B.应用程序 (应用程序所用到的)库C .应用程序各个组件之间 类似于API的作用 是使得程序的代码间的兼容,ABI目的是使得程序的二进制(级别)的兼容。 2.什么是OABI 和 EABI OABI中的O,表示 “Old”,“Lagacy”,旧的,过时的,OABI就是旧的/老的ABI. EABI中的E,表示“Embedded”,是一种新的ABI. EABI 有时候也叫做GNU EABI. OABI和EABI都是专门针对arm的CPU来说的。

3.EABI的好处 / 为何要用EABI A.支持软件浮点和硬件实现浮点功 能混用B.系统调用的效率更高C.后今后的工具更兼容D.软件浮点的情况下,EABI的软件浮点的效率要比OABI高很多。 4.OABI和EABI的区别两种ABI在如下方面有区别:A.调用规则(包括参数如何传递及如何获得返回 值) B.系统调用的数目以及应用程序应该如何去做系统调用C.目标文件的二进制格式,程序库等D.结构体中的 填充(padding/packing)和对齐。

E. OABI:* ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa * gcc -dumpmachine: arm-unknown-linux * objdump -x for compiled binary: private flags = 2: [APCS-32] [FPA float format] [has entry point] * "file" on compiled Debian binary:ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped * "readelf -h | grep Flags"" Flags: 0x0 EABI:* ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4 * gcc -dumpmachine: arm-unknown-linux-gnueabi * objdump -x for compiled binary:private flags = 4000002: [Version4 EABI] [has entry point] * "file" on compiled binary (under Debian):ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped * "readelf -h | grep Flags"" Flags: 0x4000002, has entry point, Version4 EABI /********************************************************************************************/在虚拟机 中,运行:arm_v5t_le-gcc -dumpmachine,输出:armv5tl-montavista-linuxeabi;运行 arm_v5t_le-readelf -h EXEC | grep Flags,(注:EXEC代表用交叉编译工具编译的可执行文件名),输出: Flags: 0x4000002, has entry point, Version4 EABI.上述结果说 明当前使用的montavista的编译器是符合EABI标准的。 使用EABI(Embedded Application Binary Interface)则可以对此改善处理,arm EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。

看到这里,之前遇到的一个问题终于弄明白 了。之前在Makefile中一直包含一个-mabi=apcs-gnu的参数,而apcs-gnu是OABI的参数,因此将OABI的参数传给符合 EABI标准的编译,编译阶段没有报错,但在板上运行时,程序中涉及到浮点数的部分出现了许多莫名的问题。

比如printf("%s %f",s,f);这句话输出的浮点数值并不是传给printf的参数,而是一个莫名其妙的数字。解决办法:在Makefile中将 “-mabi=apcs-gnu”去掉,重新编译运行,成功! 考试大温馨提示:本内容来源于网络,仅代表作者个人观点,与本站立场无关,仅供您学习交流使用。

其中可能有部分文章经过多次转载而造成文章内容缺失、错误或文章作者不详等问题,请您谅解。如有侵犯您的权利,请联系我们,本站会立即予以处理。

编辑特别推荐: 如何选购Linux可以搭配的机器之RAM考量 linuxln命令详解 nginx关于服务静态文件的配置。

二、ARM 汇编指令TST问题

eq 应当称为“判断的条件”,而把 Z 标志位称为“eq”位是不恰当。

Z 标志(和其它标志位)能被算术指令(包括加减乘除和比较)和逻辑指令(位运算指令和移位指令)改变,当需要判断“eq”时,上一条影响 Z 标志的指令,应该是减法或比较指令,而不应该是其它的指令,比如:

算术运算:加法——两个数相加结果为 0,不能使用 eq 判断两数相等。

逻辑运算:移位——一个数移位结果为 0,这个与 eq 什么都无从谈起。

还有你问题里的 TST 指令,也和 eq 扯不上关系。

不知题主明白没有?如果还有疑问请继续追问,如果满意请采纳,谢谢。

三、arm中如何取绝对值,用浮点指令吗

ABS 绝对值 ACS 反余弦 ADF 加法 ASN 反正弦 ATN 反正切 CMF 比较浮点值 CNF 比较取负的浮点值 COS 余弦 DVF 除法 EXP 指数 FDV 快速除法 FIX 转换浮点值成整数 FLT 转换整数成浮点值 FML 快速乘法 FRD 快速反向除法 LDF 装载浮点值 LFM 装载多个浮点值 LGN 自然对数 LOG 常用对数 MNF 传送取负的值 MUF 乘法 MVF 传送值/浮点寄存器到一个浮点寄存器 NRM 规格化 POL 极化角 POW 幂 RDF 反向除法 RFC 读 FP 控制寄存器 RFS 读 FP 状态寄存器 RMF 余数 RND 舍入成整值 RPW 反向幂 RSF 反向减法 SFM 存储多个浮点值 SIN 正弦 SQT 平方根 STF 存储浮点值 SUF 减法 TAN 正切 URD 非规格化舍入 WFC 写 FP 控制寄存器 WFS 写 FP 状态寄存器 本文档部分内容取自 ARM 汇编器手册。

ARM 可以与最多 16 个协处理器相接口(interface)。ARM3 和以后的处理器在 ARM 内有虚拟的协处理器来处理内部控制功能。

而可获得的第一个协处理器是浮点处理器。这个芯片处理 IEEE 标准的浮点运算。

定义了一个标准的 ARM 浮点指令集,所以编码可以跨越所有 RISC OS 机器。如果不存在实际的硬件,则这些指令被截获并由浮点模拟器模块(FPEmulator)来执行。

程序不需要知道是否存在 FP 协处理器。唯一不同的是执行速度。

RISC OS 的 BASIC 汇编器,作为标准,不支持任何真实的浮点指令。你可以转换整数到你的实现定义的‘浮点’并用它们进行(最普通的定点)基本数学运算,但你不能与浮点协处理器交互并以‘固有的’方式来做这些事情。

但是,扩展汇编器功能的补丁中包含了 FP 指令。 ARM IEEE FP 系统由 8 个高精度 FP 寄存器(F0 到 F7)。

寄存器的格式是无关紧要的,因为你不能直接访问这些寄存器,寄存器只在它被传送到内存或 ARM 寄存器时是‘可见的’。在内存中,一个 FP 寄存器占用三个字,但因为 FP 系统把它重新装载到自己的寄存器中,这三个字的格式是无关紧要的。

还有一个 FPSR (浮点状态寄存器),它类似于 ARM 自己的 PSR,持有应用程序可能需要的状态信息。可获得的每个标志都有一个‘陷阱’,这允许应用程序来启用或禁用与给定错误关联的陷阱。

FPSR 还允许你得知在 FP 系统得不同实现之间的区别。还有一个 FPCR (浮点控制寄存器)。

它持有应用程序不应该访问的信息,比如开启和关闭 FP 单元的标志。典型的,硬件有 FPCR 而软件没有。

FP 单元可以软件实现比如 FPEmulator 模块,硬件实现比如 FP 芯片(和支持代码),或二者的组合。二者的最好的例子是 Warm Silence Software 补丁,它允许 ARM FP 操作利用配备在 PC 协处理器卡上的 80x87 作为作为一个浮点协处理器。

计算的结果如同有无限的精度,接着被舍入成要求的精度。舍入方式有就近舍入,向正无穷(P)舍入, 向负无穷舍入(M), 或向零舍入。

缺省的是就近舍入。如果不可抉择,则舍入到最近似的偶数。

工作精度是 80 位,其组成是 64 位尾数,15 位指数,和一个符号位。在一些实现中对用单精度工作的指令提供了更好的性能 - 特别是完全基于软件的那些实现。

FPSR 包含 FP 系统所需的状态。总是提供 IEEE 标志,但只在一次 FP 比较操作之后才可获得结果标志。

浮点指令不应该用在 SVC 模式下。 FPSR 的低字节是例外标志字节。

6 4 3 2 1 0FPSR: 保留 INX UFL OFL DVZ IVO当引发一个例外条件的时候,把在位 0 到 4 中的适当的累计(cumulative)例外标志设置为 1。如果设置了相关的陷阱位,则按操作系统指定的方式把一个例外递送给用户程序。

(注意在下溢的情况下,陷阱启用位的状态决定在什么条件下设置下溢标志。) 只能用 WFS 指令清除这些标志。

IVO - invalid operation 无效操作在进行的操作的一个操作数是无效时设置 IVO。无效操作有: 在一个捕获(trapping)的 NaN (not-a-number:非数)上进行任何操作。

无穷大幅值(magnitude)相减,例如 (+∞) + (-∞)。 乘法 0 * ∞。

除法 ∞/∞ 或 x/0。 x REM y 这里 x = ∞ 或 y = 0。

(REM 是浮点除法操作的余数。) 任何小于 0 的数的平方根。

在上溢或操作数是 NaN 的时候进行转换成整数或十进制数。如果上溢使转换不可能,则生成最大的正或负整数(依赖于操作数的符号)并通知(signal)一个 IVO。

比较时有未对阶(Unordered)操作数例外。 ACS、ASN、SIN、COS、TAN、LOG、L www.hbbz08.com GN、POW、或 RPW 有无效/错误的参数。

DVZ - division by zero 除零如果除数是零而被除数是一个有限的、非零的数则设置 DVZ 标志。如果禁用了陷阱则返回一个正确的有符号的无穷。

还为 LOG(0) 和 LGN(0) 设置这个标志。如果禁用了陷阱则返回负无穷。

OFL - overflow 上溢结果幅值超出目的格式最大的数的时候设置 OFL 标志,舍入的结果是指数范围无限大的(unbounded)。 因为在结果被舍入之后检测上溢,在一些操作之后是否发生上溢依赖于舍入模式。

如果禁用了陷阱,要么返回一个有正确符号的无穷,要么返回这个格式的最大的有限数。这依赖于舍入模式和使用的浮点系统。

UFL - underflow 下溢两个有关联的事件产生下溢: 极小值(tininess) - 微小的非。