1、 用ARM汇编语言实现以下C程序段的功能。
(1)y=a×(b+c)
THUMB ; 表示接下来的代码为 THUMB 指令集
PRESERVE8 ; 表示接下来的代码保持 8 字节栈对齐
AREA Init1, CODE, READONLY ; 声明代码段
ENTRY
CODE32
START MOV R0, #9 ;加载a到R0
MOV R1, #1 ;加载b到R1
MOV R2, #1 ;加载c到R2
ADD R1,R2 ;b与c相加结果保存到R1中
MUL R0,R1 ;结果a*(b+c)的结果保存到R0中
END
(2)if(x<3)
y=3×x+66;
else if(x<100)
y=100×x+88;
else
y=0;
THUMB ; 表示接下来的代码为 THUMB 指令集
PRESERVE8 ; 表示接下来的代码保持 8 字节栈对齐
AREA Init2, CODE, READONLY ; 声明代码段
ENTRY
CODE32
CMP R0, #3 ;与 3 比较
BLT COND1 ;则跳转到 COND1 处理
CMP R0, #100
BLT COND2 ;大于3但是小于100 则跳转到 COND1 处理
MOV R0, #0 ;都不是,则把R0赋值为0
B FINISH ;跳转到结束
COND1 MUL R0, #3 ;R0=R0*3,小于3
ADD R0, #66 ;R0=R0+66
B FINISH ;跳转到结束
COND2 MUL R0, #100 ;大于3但是小于100,R0=R0*100
ADD R0, #88 ;R0=R0+88
FINISH END
(3) for(i=0;i<10;i++)
x[i]=a[i]+b[i]
AREA BlockData,DATA,READWRITE ;定义数据段
DATA1 DCD 2,5,0,3,-4,5,0,10,9,5 ;数组 DATA1
DATA2 DCD 3,5,4,-2,0,8,3,-10,5,6 ;数组 DATA2
SUM DCD 0,0,0,0,0,0,0,0,0,0 ;数组 SUM
AREA Init3,CODE,READONLY ;定义代码段
ENTRY
CODE32
START LDR R1,=DATA1 ;数组 DATA1 的首地址存入到 R1
LDR R2,=DATA2 ;数组 DATA2 的首地址存入到 R2
LDR R3,=SUM ;数组 SUM 的首地址存入到 R3
MOV R0,#0 ;计数器 R0 的初始值置 0
LOOP LDR R4,[R1],#04 ;取 DATA1 数组的一个数 , 同时修改地址指针
LDR R5,[R2],#04 ;取 DATA1 数组的一个数 , 同时修改地址指针
ADDS R4,R4,R5 ;相加并影响标志位
ADD R0,R0,#1 ;计数器加 1
STR R4,[R3],#04 ;保存结果到 SUM 中 , 同时修改地址指针
BNE LOOP ;若相加的结果不为 0 则循环
END
2、编写C语言函数int fact(int N),求N的阶乘,要求用for循环来完成。
(1)将函数中的乘法部分,用嵌入汇编来实现。
嵌入汇编部分
__asm int multi(int X1, int X2)
{
MUL R0, R0, R1 //R0 = X1*X2
BX LR //返回结果保存在R0中
}
函数fact调用multi做乘法
int fact(int N)
{
int i ;
int sum = 0;
for(i=1;i<=N;i++)
{
sum = multi(sum, i);
}
return sum;
}
(2)将函数中的乘法部分,用内联汇编来实现。
int fact(int N)
{
int i ;
int sum = 0;
for(i=1;i<=N;i++)
{
__asm{
MUL sum, sum, i //sum = sum * i
}
}
return sum;
}
所有文章首发平台是微信公众号-极客印记,同步发布到CSDN,简书,掘金等平台博客–十安辰,喜欢的话,记得微信扫码关注我哦