ARM无符号整数乘除法

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

ARM的无符号整数乘除法

ARM无符号整数乘法

一、实验目的

掌握ARM的汇编语言程序设计方法。

二、实验原理及基本技术线路图

ARM的乘法指令把一对寄存器的内容相乘,然后根据指令类型把结果累加到其它的寄存器。长整形的“乘累加”要使用代表64位的一对寄存器,最终的结果放在一个目标寄存器或者一对寄存器中。

乘法指令的语法:

MLA {}{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<

{

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:

相关文档
最新文档