年 月第 版,
3
1
8
2010
年 月第二次印刷
《ARM 嵌入式系统结构与编程》邱铁 编著. 清华大学出版社.
2009
ARM 汇编语言程程序设计精讲
阶乘操作实例解析
求一个数的阶乘(64 位结果)
用 ARM 汇编语言设计程序实现求 20!(即 20 的阶乘),并将其 64 位结果放在[R9:R8]
中。(R9 中存放高 32 位)
解:程序设计思路:64 位结果的乘法指令通过两个 32 位的寄存器相乘,可以得到 64 位的
结果,在每次循环相乘中,我们可以将存放 64 位结果两个 32 位寄存器分别与递增量相乘,
最后将得到的高 32 位结果相加。程序设计流程如图 7-1 所示:
《ARM 嵌入式系统结构与编程》邱铁 编著. 清华大学出版社.
2009
年 月第 版,
2010
3
1
8
年 月第二次印刷
开 始
初 始 化 [R9:R8]=20
递 减 计 数 器 R0=19
备 份 R9至 R1
计 算 R0与 R8相 乘
结 果 保 存 在 [R9:R8]
计 算 R0乘 R1并 加 上
进 位 保 存 在 R9
计 数 器 R0减 1
R0= =0?
YES
结 束
NO
程序设计流程图
R8 , #20
R9 , #0
R0,R8,#1
程序代码如下:
在 ARM 集成开发环境下编程 ADS:
AREA Fctrl,CODE,READONLY
ENTRY
CODE32
START
MOV
MOV
SUB
Loop
MOV
MLA
SUBS
BNE
Stop
R1 , R9
R8 , R9 , R0 , R8
R9 , R1 , R0 , R9
R0 , R0 , #1
Loop
UMULL
B
END
Stop
; 声明代码段 Fctrl
; 标识程序入口
; 声明 32 位 ARM 指令
;低位初始化
;高位初始化
;初始化计数器
;暂存高位值
;[R9:R8]=R0*R8
;R9=R1*R0+R9
;计数器递减
;计数器不为 0 继续循环
; 文件结束
年 月第 版,
3
1
《ARM 嵌入式系统结构与编程》邱铁 编著. 清华大学出版社.
2009
程序执行后输出结果如下:
年 月第二次印刷
2010
8
R8=0x82B40000
R9=0x21C3677C