周立功经典实验教程《ARM嵌入式系统实验教程》的配套源代码
源代码在线查看: test4.s
; 文件名:TEST4.S
; 功能:计算X的n次方的值
; 说明:X和n均为无符号整数
X EQU 9 ; 定义X的值为9
n EQU 8 ; 定义n的值为8
AREA Example4,CODE,READONLY ; 声明代码段Example4
ENTRY ; 标识程序入口
CODE32 ; 声明32位ARM指令
START LDR SP,=0x40003F00 ; 设置堆栈(满递减堆栈,使用STMFD/LMDFD指令)
LDR R0,=X
LDR R1,=n
BL POW ; 调用子程序POW,返回值为R0
HALT B HALT
; 名称:POW
; 功能:整数乘方运算。
; 入口参数:R0 底数
; R1 指数
; 出口参数:R0 运算结果
; 占用资源:R0、R1
; 说明:本子程序不考虑溢出问题
POW
STMFD SP!,{R1-R12,LR} ; 寄存器入栈保护
MOVS R2,R1 ; 将指数值复制到R2,并影响条件码标志
MOVEQ R0,#1 ; 若指数为0,则设置R0=1
BEQ POW_END ; 若指数为0,则返回
CMP R2,#1
BEQ POW_END ; 若指数为1,则返回。(此时R0没有被更改)
MOV R1,R0 ; 设置DO_MUL子程序的入口参数R0和R1
SUB R2,R2,#1 ; 计数器R2 = 指数值减1
POW_L1 BL DO_MUL ; 调用DO_MUL子程序,R0 = R1 * R0
SUBS R2,R2,#1 ; 每循环一次,计数器R2减1
BNE POW_L1 ; 若计数器R2不为0,跳转到POW_L1
POW_END LDMFD SP!,{R1-R12,PC} ; 寄存器出栈,返回
; 名称:DO_MUL
; 功能:32位乘法运算。
; 入口参数:R0 乘数
; R1 被乘数
; 出口参数:R0 计算结果
; 占用资源:R0、R1
; 说明:本子程序不会破坏R1
DO_MUL MUL R0,R1,R0 ; R0 = R1 * R0
MOV PC,LR ; 返回
END