周立功经典实验教程《ARM嵌入式系统实验教程》的配套源代码
源代码在线查看: test5.s
; 文件名:TEST5.S
; 功能:计算1+2+...+N的值
; 说明:N≥0,当N=0时结果为0;当N=1时结果为1。
N EQU 100 ; 定义N的值为100
AREA Example5,CODE,READONLY ; 声明代码段Example5
ENTRY ; 标识程序入口
CODE32 ; 声明32位ARM指令
ARM_CODE LDR SP,=0x40003F00 ; 设置堆栈指针
ADR R0,THUMB_CODE+1
BX R0 ; 跳转并切换处理器状态
LTORG ; 声明文字池
CODE16 ; 声明16位Thumb指令
THUMB_CODE LDR R0,=N ; 设置子程序SUM_N的入口参数
BL SUM_N ; 调用子程序SUM_N
B THUMB_CODE
; 名称:SUM_N
; 功能:计算1+2+...+N的值
; 入口参数:R0 N的值
; 出口参数:R0 运算结果
; 占用资源:R0
; 说明:当N=0时结果为1;当N=1时结果为1。
; 若运算溢出,结果为0。
SUM_N
PUSH {R1-R7,LR} ; 寄存器入栈保护
MOVS R2,R0 ; 将N的值复制到R2,并影响条件码标志
BEQ SUM_END ; 若N的值为0,则返回。(此时R0没有被更改)
CMP R2,#1
BEQ SUM_END ; 若N的值为1,则返回。(此时R0没有被更改)
MOV R1,#1 ; 初始化计数器R1=1
MOV R0,#0 ; 初始化结果寄存器R0=0
SUM_L1 ADD R0,R1 ; R0 = R0 + R1
BCS SUM_ERR ; 结果溢出,跳转到SUM_ERR
CMP R1,R2 ; 将计数器的值与N比较
BHS SUM_END ; 若计数器的值≥N,则运算结束
ADD R1,#1
B SUM_L1
SUM_ERR MOV R0,#0
SUM_END POP {R1-R7,PC} ; 寄存器出栈,返回
END