大家好,又见面了,我是你们的朋友全栈君。
通过ARM汇编实现数组求和,实现简单循环
还是老方法,初学汇编,我们可以先写一个实现同样功能的C语言代码,来参考学习
代码语言:javascript复制#include<stdio.h>
int main(){
int ary[10] = {0,1,2,3,4,5,6,7,8,9};
int sum, i;
sum = 0;
for ( i = 0; i < 10; i )
{
sum =sum ary[i];
}
printf("dn",sum);
return 0;
}
这里我们看到在主函数中定义了一个数组,定义了两个变量,然后for循环进行了10次,for循环中执行了数组累加运算,最后把累加的和打印出来,最后返回。
1.先把框架给出来(不明白可以参见这一篇文章:如何写一个ARM汇编语言框架)
代码语言:javascript复制.data
……
.globl main
main:
stmfd sp!,{lr}
……
mov r0, #0
ldmfd sp!,{lr}
mov pc, lr
.end
2.定义全局变量
先给一个打印出的格式,然后把数组给定义好,然后把有多少数给算出(用于判断循环结束)
代码语言:javascript复制 fmt:.asciz "dn" // 定义一个以空结尾的字符串格式
ary:.word 0,1,2,3,4,5,6,7,8,9 //自定义一个数组
.equ counter,( . - ary)/4 // .equ伪指令,声明一个 counter来存放数组个数
下面详细讲一下counter,( . – ary)/4 这个语句,其中“ . ”代表当前行的地址,ary代表的是数组的首地址,然后相减再除以一个word占的长度,得到的就是这个数组的总个数
3.声明要使用的寄存器
C语言中我们定义了一个数组,一个和一个循环数 i,这里我们依次声明
代码语言:javascript复制 mov r4,#0 // r4当做循环数 i
mov r6,#0 // r6作为和sum
ldr r5, =ary // r5取出并存放在内存中定义的数组
4.构建循环
循环在汇编中主要用到的就是两个工具指令,跳转和判断(B 和 CMP)其中B后面又可以加很多条件,比如BLT表示,如果带符号小于就跳转。
这里我给大家贴上所有的的条件助记符
这里该这么用,大家可以看看代码中的详细注释
ARM汇编语言循环语句模板
代码语言:javascript复制loop:
…………
add r4,#1 //在上面声明了,r4先清零,然后执行一次加1一次
testfor:cmp r4,#counter // 比较r4的值和后面的值的大小,实质上是前面减后面
blt loop // blt,就是刚刚上面提到的,如果前面小于后面,就跳转到loop
这就是常用到的循环体,我们可以把它作为模板记住。
5.在循环体中添加要循环的内容
代码语言:javascript复制 ldr r2,[r5],#4 //把r5中当前地址对应的值给r2,然后再给r5自+4,让它指向数组中的下一个数
add r6,r2 // sum =L[i] 把当前r2的值加到r6,多次循环就实现了累加
完成!
然后我们来看一下整体代码和运行结果