【ARM汇编子程序】求三个数的阶乘并求和

【ARM汇编子程序】求三个数的阶乘并求和编写汇编代码时 通过子程序 大大简化程序设计的复杂度 通过这篇文章带你练习子程序的调用和建立

在这里插入图片描述

在这里插入图片描述


每篇前言


不要试图鹤立鸡群,离开那群鸡。



在这里插入图片描述

求三个数的阶乘并求和

求解这个问题的目的是:练习汇编中子程序的建立和调用。

想求三个数的阶乘并求和,一共分为两个步骤,先对三个阶乘分别求阶乘,然后将三个数求和并输出,下面分步骤详解。

一、用子程序求阶乘

1.确定子程序的输入值

先定义全局变量

.data a:.word 2 b:.word 3 c:.word 4 

将r0作为子程序的输入,因此每次都先将待求阶乘的数取到寄存器r0

 ldr r0,=a ldr r0,[r0] 

然后用跳转指令进入子程序

 bl fact 

2.循环累乘求解

先给子程序构建框架

fact: push { 
      lr} ...... pop { 
      lr} mov pc,lr .end 

累乘的值存到寄存器r8,给r8赋初始值

 mov r8,#1 

用待求阶乘数作为循环递减变量

loop: mul r8,r0 sub r0,#1 cmp r0,#0 bne loop 

3.确定返回主程序的返回值

累乘后的值存放在r8,因此可以直接将r8作为返回值

二、3个数分别调用子程序

1.从内存取到值作为子程序输入

3个值存放在内存变量中分别叫“a,b,c”

 ldr r0,=a ldr r0,[r0] bl fact ldr r0,=b ldr r0,[r0] bl fact ldr r0,=c ldr r0,[r0] bl fact 

2.将3个数暂存到r1~r3

将“a,b,c”三个还没有求阶乘的数,在进入子程序前暂存到r1~r3用于输出(可以看到输出的格式串中有四个数据,所以最后一个数据需要用到压栈)

.data fmt:.asciz "\n %d!+ %d!+ %d!=%d\n" main: mov r1,r0 bl fact mov r2,r0 bl fact mov r3,r0 bl fact 

3.将返回值存到指定寄存器

每一个调用子程序求完的值都在r8,要先将这个值暂存到3个寄存器中用于求和

 bl fact mov r4,r8 bl fact mov r5,r8 bl fact mov r6,r8 

三、三个数求和

1.两两求和

现在三个求完阶乘的数据分别存放在r4~r6,对这三个数相加并放到r8中

 add r8,r4,r5 add r8,r8,r6 

2.压栈输出,出栈结束

在输出格式串中用到了四个数据,所以需要把第四个数据压到栈顶,然后输出完r1~r3之后,输出栈顶数据。那因此就是将r8压入栈顶。

//fmt:.asciz "\n %d!+ %d!+ %d!=%d\n" push { 
      r8} ldr r0,=fmt bl printf pop { 
      r8} 

完整代码

.data a:.word 2 b:.word 3 c:.word 1 fmt:.asciz "\n %d!+ %d!+ %d!=%d\n" .text .globl main main: push { 
      lr} //调用3次子程序 ldr r0,=a ldr r0,[r0] mov r1,r0 bl fact mov r4,r8 ldr r0,=b ldr r0,[r0] mov r2,r0 bl fact mov r5,r8 ldr r0,=c ldr r0,[r0] mov r3,r0 bl fact mov r6,r8 //三个数求和存到r8 add r8,r4,r5 add r8,r8,r6 push { 
      r8} ldr r0,=fmt bl printf mov r0,#0 pop { 
      lr} mov pc,lr //子程序fact //r0作为子程序的入口参数 //r8作为返回值 fact: push { 
      lr} mov r8,#1 loop: mul r8,r0 sub r0,#1 cmp r0,#0 bne loop pop { 
      lr} mov pc,lr .end 

运行结果

在这里插入图片描述

在这里插入图片描述



本期就结束了,如果对您有帮助,点赞+评论支持一下博主再走吧


还没有关注汤姆的朋友,点个关注每天学一点汇编

下期预告:
【ARM汇编】冒泡排序

在这里插入图片描述

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

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

(0)
上一篇 2026年3月17日 下午3:10
下一篇 2026年3月17日 下午3:10


相关推荐

  • 腾讯元宝重大升级:混元与DeepSeek模型携手开启深度思考新功能

    腾讯元宝重大升级:混元与DeepSeek模型携手开启深度思考新功能

    2026年3月13日
    2
  • 10月22日Ajax培训日记

    10月22日Ajax培训日记今天还是由梁言兵老师讲解Ajax,根据昨天学员的反馈,觉得AjaxTable这个项目太大了,学习起来有点费劲,希望梁老师讲一个较小的综合案例。所以,梁老师先讲解XTree这个客户端JavaScript组件,然后结合XTree,buffalo,spring,hibernate这些框架开发一个Ajax的demo。小收获:varobj={a:’xxx’b:function(){}}定义…

    2025年10月30日
    13
  • 关于java中堆内存与栈内存的详细分析[通俗易懂]

    本文由java零基础入门栏目为大家推荐,文中详细分析了什么栈内存与堆内存,并为大家介绍了二者的区别,希望可以帮助到大家。堆内存用于存储Java中的对象和数组,栈内存主要是用来执行程序用的。

    2022年1月17日
    40
  • TransE算法详解

    TransE算法详解TransE 算法详解 机器学习 知识图谱 知识表示 TransE 文章目录 TransE 算法详解算法背景知识图谱是什么知识表示是什么基本思想算法描述梯度参考文献算法背景知识图谱是什么一条知识图谱可以表示为一个三元组 sub rel obj 举个例子 小明的爸爸是大明 表示成三元组是 小明 爸爸 大明 前者是主体 中间是关系 后者是客体 主体和客体统称为实体 entity 关

    2026年3月18日
    2
  • 数据库的简单建模

    数据库的简单建模本文关键字 数据库 建模 概念模型 逻辑模型 物理模型 使用数据库时 通常是为了支撑一个应用或一个业务场景 第一步需要做的就是要对数据库的表结构进行设计 一个完善的设计方案包括 表名 列名 数据类型 备注信息 字符编码 主键设计 表间关系 其他约束条件等 其中的难点在于如何使用数据表以及表间关系来描述出相应的功能场景 能够应对以后的各种查询需要 这对刚接触数据库的使用者来说是有些困难的 但是只要认真思考 按照步骤来操作相信最后的结果不会差

    2025年11月13日
    4

发表回复

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

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