修改main.s源文件,增加以下内容:
1、在第一行显示“广州大学”字样。
2、编写一个1+2+…+10的程序,将求和结果存入名为”sumresult”的内存单元中,并将求和结果用printf显示出来。
//--------------------------------------------------------------------
//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)
main:
//(1)======启动部分(开头)主循环前的初始化工作======================
//(1.2)【不变】关总中断
cpsid i
//(1.5)用户外设模块初始化
// 初始化蓝灯, r0、r1、r2是gpio_init的入口参数
ldr r0,=LIGHT_BLUE //r0指明端口和引脚(用=,因常量>=256,需用ldr)
mov r1,#GPIO_OUTPUT //r1指明引脚方向为输出
mov r2,#LIGHT_OFF //r2指明引脚的初始状态为亮
bl gpio_init //调用gpio初始化函数
// 初始化串口UART_User1
mov r0,#UART_User //串口号
ldr r1,=UART_BAUD //波特率
bl uart_init //调用uart初始化函数
//(1.6)使能模块中断
mov r0,#UART_User //串口号
bl uart_enable_re_int //调用uart中断使能函数
//(1.7)【不变】开总中断
cpsie i
//(1)======启动部分(结尾)=======================================
bl expFun//branch label跳转至标签分支 expFun实验函数
bl .//branch label跳转至标签分支 当前地址,用于使程序停在当前位置
data_format_string://数据类型字符串标识
.ascii "%s\n\0"
data_format_decimal://数据类型十进制整数标识
.ascii "%d\n\0"
show_information://待显示的字符串
.ascii "广州大学\n\0"
expFun://实验函数
push {r0, r1, r2}//r0,r1,r2入栈,在该函数结束后还原为原值
ldr r0, =data_format_string//load register从存储中加载 将 数据类型字符串标识 存入 寄存器r0,规定printf输出格式
ldr r1, =show_information//load register从存储中加载 将 标签show_infomation位置字符串 的位置值 存入 寄存器r1
bl printf//branch label跳转至标签分支 串口输出函数,该函数将 r1指向的字符串 输出到串口中
mov r0, #0//move寄存器间移值 从 立即数0 到 r0,r0=0
mov r1, #0//move寄存器间移值 从 立即数0 到 r1,r1=0
addLoop://累加循环
add r0, r0, #1//r0=r0+1,r0记录已经加了多少次
add r1, r1, r0//r1=r1+r0,r1存储累加结果
cmp r0, #10//compare比较 r0 和 立即数10
ble addLoop//branch less equal小于等于跳转(Z=1且N!=V),r0<=10即还没加到第10次时继续循环累加
//r1已经累加10次了就继续向下运行
ldr r0, =data_format_decimal//
mov r2, r1//move寄存器间移值,r2=r1
bl printf//branch label跳转至标签分支 串口输出函数,将 r2存储的数据 输出到串口中
pop {r2, r1, r0}//r2,r1,r0出栈,当前函数结束,将寄存器还原
bx lr//branch exchange切换跳转 到 label register用bl跳转时所处的指令位置寄存器 所指向的位置,回到调用该函数时的初始位置