ARM无符号整数乘除法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM的无符号整数乘除法
ARM无符号整数乘法
一、实验目的
掌握ARM的汇编语言程序设计方法。

二、实验原理及基本技术线路图
ARM的乘法指令把一对寄存器的内容相乘,然后根据指令类型把结果累加到其它的寄存器。

长整形的“乘累加”要使用代表64位的一对寄存器,最终的结果放在一个目标寄存器或者一对寄存器中。

乘法指令的语法:
MLA {<cond>}{S} Rd,Rm,Rs,Rn
长整型乘法指令产生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<<N)。

试探减法算法以最高有效位――第N-1位开始,通过依次试图设置各个位来确定q的N位值。

这种做法和对结果的二分搜索是等价的。

如果可以从当前的余数减去(d<<k),且减法结果不是负数,那么就可以设置位k。

这个算法的C实现代码如下:unsigned udiv_simple(unsigned d,unsigned n,unsigned N)
{
unsigned q=0,r=n;
do
{ /*计算下一个商*/
N--;/*移到下一位*/
if((r>>N)>=d) /*if r>=d*(1<<N)*/
{
r -=(d<<N);/*计算余数*/
q +=(1<<N);/*计算商*/
}
}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:
MOV R6, #0 @ 结果的符号位
mUNSIGN R6, R0 @ 判断被除数和除数的符号,无符号化mUNSIGN R6, R1
MOV R5, #0 @ 商
CMP R0, R1 @ 如果被除数小于除数
BLT Division_L2 @ 直接商0
mCLZ R3, R1 @ 判断除数位数,确定移位情况
SUB R3, R3, #1
MOV R1, R1, LSL R3
Division_L1:
MOV R5, R5, LSL #1
CMP R0, R1 @ 判断是否够减
SUBGT R0, R0, R1 @ 如果够减,做减法,上商1
ORRGT R5, R5, #1
SUBS R3, R3, #1
MOVCS R1, R1, LSR #1
BCS Division_L1
Division_L2:
TST R6, #1 @ 处理结果的符号
MVNNE R5, R5
ADDNE R5, R5, #1
Division_F:
MOV R1, R0
MOV R0, R5
Stop:
B Stop
.end
七、实验结果、分析和结论(误差分析与数据处理、成果总结等。

其中,绘制曲线图时必须用计算纸)
实验结果截图:。

相关文档
最新文档