此次学习并修改的汇编程序是来自“苏州大学嵌入式学习社区官网—金葫芦专区—嵌入式书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⊙)~