汇编语言实现数组求和_汇编语言loop循环1到100求和

汇编语言实现数组求和_汇编语言loop循环1到100求和ARM汇编数组求和、ARM汇编语句循环框架

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

通过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


??????完结撒花!??????

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186763.html原文链接:https://javaforall.net

(2)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 小米平板5采用120Hz高刷LCD屏:纯平中框+侧面指纹[通俗易懂]

    小米平板5采用120Hz高刷LCD屏:纯平中框+侧面指纹[通俗易懂]根据此前官方透露的消息,久未更新的小米平板产品线将在近期得到更新,将推出全新一代小米平板5系列产品,并且号称将配备前所未有的旗舰配置。随着发布时间的日益临近,关于该机的爆料也越来越密集。现…

    2022年6月20日
    27
  • influxdb基本操作_一个数据库只有一个内模式

    influxdb基本操作_一个数据库只有一个内模式安装aptinstallinfluxdbinfluxdb-client<ip>:8083#web<ip>:8086#httpapi复制代码influxDB中独有的一些概念Point由时间戳(time)、数据(field)和标签(tags)组成time:每条数据记录的时间,也是数据库自动生成的主索引fields:各种记录的值…

    2025年6月20日
    4
  • apk伪造签名_如何反编译app

    apk伪造签名_如何反编译app反编译apk过程反编译目的需要的环境和工具工具环境反编译流程apktool解包导出apk的源代码修改Smali代码无法选中文本框添加开机自启Smali源码Java源码apktool打包apk签名模拟器安装apk验证apk反编译目的反编译apk:1  对apk应用进行激活成功教程并重新打包,反编译就是逆向的过程。  Androidapk是用高级语言源代码,通常是Java,对apk的逆向智能转换成汇编语言,即Smali。  这次反编译的目的是为了学习apk的软件安全,了解apk的编译过程。现有一个apk的

    2025年12月2日
    10
  • java多线程并发之旅-14-lock free queue 无锁队列[通俗易懂]

    java多线程并发之旅-14-lock free queue 无锁队列[通俗易懂]无锁队列能实现吗?上面说的加锁的环形队列,可以保证线程安全。但是加锁能不能去掉呢?答案是肯定的,请看下面的娓娓道来。i++是原子操作吗?i++和++i是原子操作吗?有一个很多人也许都不是很清楚的问题:i++或++i是一个原子操作吗?在上一节,其实已经提到了,在SMP(对称多处理器)上,即使是单条递减汇编指令,其原子性也是不能保证的。那么在单处理机系统中呢?在编译器对C/C++源代码…

    2022年7月19日
    20
  • Apache 中RewriteRule 规则参数[通俗易懂]

    Apache 中RewriteRule 规则参数[通俗易懂][size=medium]Apache中RewriteRule规则参数Apache模块mod_rewrite提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数…

    2022年5月15日
    43
  • 求和符号西格玛_∑求和公式计算公式

    求和符号西格玛_∑求和公式计算公式求和符号性质:a&nbsp;1&nbsp;&nbsp;1_1+a&nbsp;2&nbsp;&nbsp;2_2+a&nbsp;3&nbsp;&nbsp;3_3+……+a&nbsp;n&nbsp;&nbsp;n_n可以简单的表示为:∑&nbsp;n&nbsp;i=1&nbsp;a&nbsp;i&nbsp;&nbsp;∑i=1nai\sum_{i=1}^n

    2022年10月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号