ARM无符号整数乘除法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM的无符号整数乘除法
ARM无符号整数乘法
一、实验目的
掌握ARM的汇编语言程序设计方法。
二、实验原理及基本技术线路图
ARM的乘法指令把一对寄存器的内容相乘,然后根据指令类型把结果累加到其它的寄存器。长整形的“乘累加”要使用代表64位的一对寄存器,最终的结果放在一个目标寄存器或者一对寄存器中。
乘法指令的语法:
MLA {
长整型乘法指令产生64位的结果。由于结果太大,不能存放在一个32位寄存器,所以把结果存放在2个32位的寄存器RdLo和RdHi中。RdLo存放低32位,RdHi存放高32位。利用UMULL和SUMLL指令可以进行32位宽度的无符号或有符号的整数乘法运算,得到64位的结果。在实际应用中,有许多需要长整型乘法运算的应用。例如,处理C中long long整型算术运算等。
对于64位整数乘法运算可利用如下页图所示的扩展方法来实现。其中:
R0,R1分别存放被乘数的低32位和高32位;
R2,R3分别存放乘数的低32位和高32位;
128位结果由低到高依次存放在R4,R5,R6,R7中。
三、实验内容
依据图2-1框图所示方法编制2个64位无符号整数乘法的程序。
四、所用仪器、材料
PC一台
EmbestIDE Education Edition for ARM
五、实验方法、步骤
●在Embest IDE环境中新建工程,编写程序;
●编译成功后,连接下载进行调试。
六、实验过程原始记录(数据、图表、计算等)
1. 实验A源程序:
.global _start
.text
_start:
MOV R8,#20 @低32位初始化为20
MOV R9,#0 @高32位初始化为0
MOV R0,R8,#1 @初始化计数器
Loop:
MOV R1,R9 @暂存高位值
UMULL R8,R9,R0,
R8
×
+
图2-1:2个64位无符号整数乘法的扩展方法L
H
L H
H H L
L
MlLA R9,R1,R0,R9
SUBS R0,R0,#1
BNE loop
Stop:
B Stop
.end
七、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸)
实验结果截图:
ARM的无符号整数除法
一、实验目的:
掌握ARM的汇编语言程序设计方法。
二、实验原理:
ARM内核对除法运算不提供硬件支持。除法运算必须通过调用基于标准算术操作的软件程序来完成。
通过试探减法实现无符号数除法,在ARM的运算中是很有用的。其原理如下:计算无符号整数n和d的商q=n/d和余数r=n%d。假定已知商q不超过N位,n/d<2N,或者说n<(d< { unsigned q=0,r=n; do { /*计算下一个商*/ N--;/*移到下一位*/ if((r>>N)>=d) /*if r>=d*(1< { r -=(d< q +=(1< } }while(N); return q; } 三、实验内容 利用试探减法编制2个64位有符号整数除法的程序。 四、所用仪器、材料 PC一台 EmbestIDE Education Edition for ARM 五、实验方法、步骤 ●在Embest IDE环境中新建工程,编写程序; ●编译成功后,连接下载进行调试。 六、实验过程原始记录(数据、图表、计算等) 1. 实验源程序: .global _start .macro mCLZ Rd, Rs @ 求一个数的前导0个数 MOV \Rd, #0 @ 在某些ARM中,可以使用指令CLZ 代替 __mCLZ_L1: TST \Rs, #0x80000000 ADDEQ \Rd, \Rd, #1 MOVEQ \Rs, \Rs, ROR #31 BEQ __mCLZ_L1 MOV \Rs, \Rs, LSR \Rd .endm .macro mUNSIGN Rd, Rs @ 将一个数无符号化 TST \Rs, #0x80000000 @ 将无符号的整数放到Rs中 EORNE \Rd, \Rd, #1 @ 将这个数总的符号部分放到Rd中 MVNNE \Rs, \Rs ADDNE \Rs, \Rs, #1 .endm .arm .text _start: LDR R0, =-123456 @ 被除数 LDR R1, =523 @ 除数 Div: