【ARM汇编循环】循环框架|数组求和

举报
IM汤姆凯特 发表于 2022/04/19 17:11:31 2022/04/19
【摘要】 ARM汇编数组求和、ARM汇编语句循环框架

 通过ARM汇编实现数组求和,实现简单循环


还是老方法,初学汇编,我们可以先写一个实现同样功能的C语言代码,来参考学习

#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("%10d\n",sum);
    return 0; 
}

这里我们看到在主函数中定义了一个数组,定义了两个变量,然后for循环进行了10次,for循环中执行了数组累加运算,最后把累加的和打印出来,最后返回。

1.先把框架给出来(不明白可以参见这一篇文章:如何写一个ARM汇编语言框架

.data
……
.globl main
 main:
    stmfd sp!,{lr}
    ……
    mov r0, #0
    ldmfd sp!,{lr}
    mov pc, lr
.end

2.定义全局变量

先给一个打印出的格式,然后把数组给定义好,然后把有多少数给算出(用于判断循环结束)

    fmt:.asciz "%10d\n"  // 定义一个以空结尾的字符串格式
    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,这里我们依次声明

    mov r4,#0  // r4当做循环数 i
    mov r6,#0  // r6作为和sum
    ldr r5, =ary  // r5取出并存放在内存中定义的数组

4.构建循环

循环在汇编中主要用到的就是两个工具指令,跳转和判断(B 和 CMP)其中B后面又可以加很多条件,比如BLT表示,如果带符号小于就跳转。

这里我给大家贴上所有的的条件助记符

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASU3msaTlp4blh6_nibk=,size_20,color_FFFFFF,t_70,g_se,x_16


这里该这么用,大家可以看看代码中的详细注释

ARM汇编语言循环语句模板

loop:            
        …………
        add r4,#1   //在上面声明了,r4先清零,然后执行一次加1一次
testfor:cmp r4,#counter   // 比较r4的值和后面的值的大小,实质上是前面减后面
        blt loop  //  blt,就是刚刚上面提到的,如果前面小于后面,就跳转到loop

这就是常用到的循环体,我们可以把它作为模板记住。

5.在循环体中添加要循环的内容

        ldr r2,[r5],#4  //把r5中当前地址对应的值给r2,然后再给r5自+4,让它指向数组中的下一个数
        add r6,r2    //  sum+=L[i]  把当前r2的值加到r6,多次循环就实现了累加

完成!

然后我们来看一下整体代码和运行结果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASU3msaTlp4blh6_nibk=,size_20,color_FFFFFF,t_70,g_se,x_16




🌸🌸🌸🌸🌸🌸完结撒花!🌸🌸🌸🌸🌸🌸

如有疑问或错误,欢迎大家评论区留言指出,谢谢支持!!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。