
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 0
FPSR: 保留 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 >
汇编主要是要了解CPU指令及用法,常说的是PC机的x86汇编,指令是x86的复杂指令集。
arm汇编是arm的精简指令集,比x86容易学,程序格式倒是和x86汇编差不多。
C语言ARM的和x86的差不多,除了对硬件寄存器 *** 作不同,其它语法和流程都一样。
arm汇编程序每一行是指定arm
core执行一条指令,每条指令都是硬件相关。
如:LDR
R3,
#1
;用LDR指令将数值1放入R3寄存器准备参与运算
C语言与arm指令无关,只与逻辑运算有关,指定硬件地址的 *** 作才与硬件相关;
如果用arm编译器来编译,每行可能编译出1到多条arm指令。
如:i++;
//变量
i
递增1等效于LDR
R3,#1
;
用LDR指令将数值1放入R3寄存器准备参与运算ADD
R2,
R2,
R3
;
用ADD指令将R2、R3寄存器里的数值相加后放回R2寄存器以上等效汇编的R2、R3寄存器只是为了举例,C语言不像汇编,不需要由程序员指定用哪个寄存器参与运算,编译器编译时会根据程序结构自动判断选择。
无论是c语言还是汇编语言,编译器编译后的结果是机器执行码,很多人因为汇编语言比较难懂及指令相关,所以以为它就是机器语言,其实它仍是人类设计的编写程序的语言,仍需要编译器编译成机器码才能执行,它只是比C语言更接近硬件而已。
linux *** 作系统就像你学xp系统一样,你说和裸机没装系统区别在哪就是一样的,linux *** 作系统一般是软件工程学生学的,自学的花先学linux程序设计和shell指令集
一、意思不同
b:数据跳转指令,标志寄存器中Z标志位等于零时, 跳转到BEQ后标签处。
bne: 数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到BNE后标签处。
二、作用不同
BNE指令,是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行。
B 是最简单的分支。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。
三、执行跳转的条件不同
例一:cmp同bne搭配
cmp r1,r2 //这个cmp搭配下边的bne指令构成了如果r1≠r2则执行bne指令,跳转到copy_loop函数处执行。否则,就跳过下边
bne copy_loop//的bne指令向下执行。
例二:cmp同beq搭配
cmp r0,r1//如果r0=r1,就执行beq,跳转到clean_bss函数处执行,否则跳过beq向下执行。
beq clean_bss
FPGA :最初是做逻辑电路,现在这个功能不重要了。做并行处理比较快,做数据处理比较麻烦,但是经常用,因为它是并行的
DSP和ARM是CPU,串行运行程序,ARM速度比较快,可以跑大的 *** 作系统。DSP做乘法除法之类的运算时速度比较快,所以经常运用在信号处理上。
以前都是复杂的电路CPU+FPGA的开发模式比较多
现在芯片越来越集成化,ARM上可以集成DSP模块,FPGA上可以做CPU(软核)。
老将出马,一个顶俩!
一种方法是在编译器中加上-thumb选项,在编译器中进行设置好了之后编译下,采用的指令集就是Thumb指令集了。二是可以直接在ARM汇编里实现。具体的切换是通过Branch Exchange-即BX 指令来实现的。指令格式为:Thumb状态 BX RnARM状态 BX<condition> Rn其中Rn可以是寄存器R0-R15中的任意一个。指令可以通过将寄存器Rn的内容拷贝到程序计数器PC来完成在4Gbyte地址空间中的绝对跳转,而状态切换是由寄存器Rn的最低位来指定的,如果 *** 作数寄存器的状态位Bit0=0,则进入ARM状态,如果Bit0=1,则进入Thumb状态,以下是一个用例:CODE32 //表示以下使用ARM状态下的代码,32位对齐LDR R0, =Into_Thumb+1 //将Into_Thumb地址值加1,再赋给R0//产生跳转地址并且设置最低位BX R0 //地址值位0为1,将进入THUMB状态//Branch Exchange 进入Thumb状态… CODE16 //Thumb状态下的子函数,16位对齐…LDR R3, =Back_to_ARM //将Back_to_ARM 地址值赋给R0//产生字对齐的跳转地址,最低位被清除,即bit0为0BX R3//Branch Exchange 返回到ARM状态,此时运行在ARM指令集环境里 CODE32 //ARM状态下的子函数Bach_to_ARM
RISC即"精简指令集计算机"。它是针对传统处理器指令系统的缺陷提出来的,传统处理器(如Intel体系)的指令系统越来越复杂,不仅导致处理器研制周期变长,而且还有难以调试、难以维护等一些自身无法克服的困难。RISC把着眼点放在如何使处理器的结构更加简单合理及提高运算速度上。它优先选取使用频率最高的简单指令(一般只有50米),避免使用复杂指令,一般将指令长度固定为32位,且多数为单周期指令。指令格式和寻址方式、种类减少,缩短了译码时间,压缩了机器周期。内部以硬布线控制逻辑为主,不用或少用微码控制等,这些措施大大提高了RISC处理器的运算速度。K6处理器的内核就是RISC超标准量体系结构。
CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构。它们的区别在于不同的CPU设计理念和方法。 早期的CPU全部是CISC架构,它的设计目的是要用最少的机器语言指令来完成所需的计算任务。比如对于乘法运算,在CISC架构的CPU上,您可能需要这样一条指令:MUL ADDRA, ADDRB就可以将ADDRA和ADDRB中的数相乘并将结果储存在ADDRA中。将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的 *** 作全部依赖于CPU中设计的逻辑来实现。这种架构会增加CPU结构的复杂性和对CPU工艺的要求,但对于编译器的开发十分有利。比如上面的例子,C程序中的a=b就可以直接编译为一条乘法指令。今天只有Intel及其兼容CPU还在使用CISC架构。 RISC架构要求软件来指定各个 *** 作步骤。上面的例子如果要在RISC架构上实现,将ADDRA, ADDRB中的数据读入寄存器,相乘和将结果写回内存的 *** 作都必须由软件来实现,比如:MOV A, ADDRA; MOV B, ADDRB; MUL A, B; STR ADDRA, A。这种架构可以降低CPU的复杂性以及允许在同样的工艺水平下生产出功能更强大的CPU,但对于编译器的设计有更高的要求。
RISC 和CISC 是目前设计制造微处理器的两种典型技术,虽然它们都是试图在体系结构、 *** 作运行、软件硬件、编译时间和运行时间等诸多因素中做出某种平衡,以求达到高效
的目的,但采用的方法不同,因此,在很多方面差异很大,它们主要有:
(1) 指令系统:RISC 设计者把主要精力放在那些经常使用的指令上,尽量使它们具有简单高效的特色。对不常用的功能,常通过组合指令来完成。因此,在RISC 机器上实现特殊功能时,效率可能较低。但可以利用流水技术和超标量技术加以改进和弥补。而CISC 计算机的指令系统比较丰富,有专用指令来完成特定的功能。因此,处理特殊任务效率较高。
(2) 存储器 *** 作:RISC 对存储器 *** 作有限制,使控制简单化;而CISC 机器的存储器 *** 作指令多, *** 作直接。
(3) 程序:RISC 汇编语言程序一般需要较大的内存空间,实现特殊功能时程序复杂,不易设计;而CISC 汇编语言程序编程相对简单,科学计算及复杂 *** 作的程序社设计相对容易,效率较高。
(4) 中断:RISC 机器在一条指令执行的适当地方可以响应中断;而CISC 机器是在一条指令执行结束后响应中断。
(5) CPU:RISC CPU 包含有较少的单元电路,因而面积小、功耗低;而CISC CPU 包含有丰富的电路单元,因而功能强、面积大、功耗大。
(6) 设计周期:RISC 微处理器结构简单,布局紧凑,设计周期短,且易于采用最新技术;CISC 微处理器结构复杂,设计周期长。
(7) 用户使用:RISC 微处理器结构简单,指令规整,性能容易把握,易学易用;CISC微处理器结构复杂,功能强大,实现特殊功能容易。
(8) 应用范围:由于RISC 指令系统的确定与特定的应用领域有关,故RISC 机器更适合于专用机;而CISC 机器则更适合于通用机
以上就是关于arm中如何取绝对值,用浮点指令吗全部的内容,包括:arm中如何取绝对值,用浮点指令吗、ARM、FPGA、DSP帮忙解释下如何选择、arm编程与C语言的编程区别和方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)