嵌入式作业2——理解与学习调用GPIO构件控制小灯闪烁的main.s汇编源文件

本文详细解析了嵌入式学习中的main.s汇编源文件,并将其与C语言描述进行对比,展示了如何在汇编程序中实现死循环、显示特定信息以及计算1+2+...+10的求和结果。通过实际操作,提升对汇编语言的理解和应用能力。
摘要由CSDN通过智能技术生成

此次学习并修改的汇编程序是来自“苏州大学嵌入式学习社区官网—金葫芦专区—嵌入式书6版—电子资源AHL-MCU-6”中04-Software/ch02的内容。


1.打开AHL-MCU6-V2.0-20240118/04-Software/ch02/CH02-1-20220118工程目录,编译下载运行,理解并学习main.s汇编源文件

如何编译下载运行main.s可以参考上一节内容:嵌入式系统常用术语以及在AHL-GEC-IDE(4.55)环境下运行一个嵌入式程序

运行结果:
蓝光持续闪烁,利用printf输出灯亮状态、灯暗状态、闪烁次数等提示信息在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.写出main.s源文件中94~101行语句的c语言描述

①汇编程序如下:
在这里插入图片描述
②逐句分析每行汇编指令,写出注释:

main_loop:                      //主循环标签(开头)
//(2.1)主循环次数变量mMainLoopCount+1
		ldr r2,=mMainLoopCount     //r2←mMainLoopCount的地址
		ldr r1, [r2]               //r1←mMainLoopCount的值
		add r1,#1                  
		str r1,[r2]	               //把r1中的字(即mMainLoopCount+1的值)存储到r2所表示的内存地址(即mMainLoopCount的地址)处
//(2.2)未达到主循环次数设定值,继续循环
        ldr r2,=MainLoopNUM        //r2←MainLoopNUM的地址
		cmp r1,r2                  //r1-r2,若结果小于0,发生借位,C=0,则跳转到main_loop执行,直到主循环次数达到MainLoopNUM则跳出循环
		blO  main_loop     //未达到,继续循环

可以分析得出上述汇编程序可以while循环结构表达,循环条件是通过比较变量mMainLoopCount与变量MainLoopNUM值的大小,如果小于,则mMainLoopCount++,直至大于等于MainLoopNUM再跳出循环。

③得到C语言描述如下:

void func(int a)
{
   int a = mMainLoopCount;
   int b = MainLoopNUM;
   while(a<b)
   {
      a++;
   }
}

3.修改main.s源文件,增加相关内容

(1)此次修改main.s可以在“main_loop:”语句之前的地方增加,并用“b.”结束使得程序陷入死循环,不再继续执行下去。
(2)汇编语言下printf函数调用的一般形式为(printf的格式详见05_UserBoard/printf.h文件):
标号:
.ascii “格式控制字符串\0”
ldr r0,=标号
ldr r1,=输出列表待输出项1
ldr r2,=输出列表待输出项2

3.1在第一行显示“广州大学+学号+姓名缩写”字样

①将main.s第13-19行修改为如下内容:

.ascii "广州大学-32106100040-zenglu\n\0"

②将main.s第56行开始main:里的汇编程序中只留下:

//显示hello_information定义的字符串
	ldr r0,=hello_information   //待显示字符串首地址
	bl  printf		            //调用printf显示字符串

③编译工程,运行程序得到结果
在这里插入图片描述

3.2编写一个1+2+…+10的程序,将求和结果存入名为“sumresult”的内存单元中,并将求和结果用printf显示出来

①先用C语言编写1+2+…+10的程序代码:

int main()
{
   int sumresult = 0;
   for(int i=1;i<=10;i++)
   {
      sumresult+=i;
   }
   printf("1+...+10的结果为:%d\n",sumresult);
   return 0;
}

②由上述C语言程序得到的汇编语言程序如下:

ldr r1,=sumresult         //r1←变量sumresult的地址
ldr r2,[r1]               //r2←变量sumresult地址中的数据
movs r3,#1                //将值1给r3 

loop:
cmp r3,#10                //比较r3的值(即为1)与10的大小
bgt endloop               //如果r3的值大于10,则跳到标签endloop执行
add r2,r3                 //r2=r2+r3
add r3,#1                 //r3=r3+1
b loop                    //若没加到10,则loop循环

endloop:
str r2,[r1]               //将最终1+...+10的结果存储到r1的地址(即sumresult的地址)处
ldr r0,=data_format3      //输出格式送r0
ldr r2,=sumresult         //r2中是sumresult的地址
ldr r1,[r2]               //r1中是sumresult的数据
bl printf                 //调用printf显示字符串
b .                       //不断在此处循环,及陷入死循环

③具体修改是先在main.s第41行后加入

//编写一个1+2+...+10的程序,将求和结果存入名为“sumresult”的内存单元中,并将求和结果用printf显示出来
sumresult:
   .word 0
data_format3:
   .ascii "1+...+10的结果为:%d\n\0"

④再将第②步的汇编代码写入main.s第56行开始main:内(原本main:的程序都删除),main_loop:
在这里插入图片描述
⑤编译工程,运行程序得到结果
在这里插入图片描述

以上就是对main.s源汇编程序的理解学习、修改以及运行结果。让我们可以更加地掌握如何用汇编语言逻辑表达常用C语言编程结构,并且能更加地熟悉与运用汇编语言指令,伪指令等等(⊙v⊙)~

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值