GPFCON EQU 0x56000050 ;端口配置寄存器
GPFDAT EQU 0x56000054 ;端口数据寄存器
GPFUP EQU 0x56000058 ;端口上拉电阻使能寄存器
AREA MyPrj,CODE,READONLY
ENTRY
Start
mov r0,#0x23
mov r1,#0x2
mov r2,#0x3
mov r3,#0x4
bl subtest ;子函数调用例子
bl init_lcd
STMFD r13!,{r0}
mov r0,#0x1
bl light_lcd
ldr r0,=0x1ffffff
bl delay
mov r0,#0x2
bl light_lcd
ldr r0,=0x1ffffff
bl delay
mov r0,#0x3
bl light_lcd
ldr r0,=0x1ffffff
bl delay
mov r0,#0x4
bl light_lcd
ldr r0,=0x1ffffff
bl delay
mov r0,#0x5
bl light_lcd
ldr r0,=0x1ffffff
bl delay
LDMFD r13!,{r0}
;时间延迟函数例子
STMFD r13!,{r0} ;r0入栈
mov r0,#10 ;通过r0传递延迟时间长度
bl delay ;调用时间言迟函数
LDMFD r13!,{r0} ;r0出栈
;mov sp,#400
;swp r0,r1,r2 ;?
STMFD r13!,{r0-r3}
LDMFD r13!,{r3}
LDMFD r13!,{r4}
GBLA n1
n1 SETA 0x1
ldr r0,=n1
;;;;;;;;;;;;
;寄存器寻址方式
mov r1,r2 ;r2->r1
sub r0,r1,r2 ;r1-r2->r0
;立即寻址方式
subs r0,r0,#01 ;r0-1->r0
mov r0,#0xff00 ;0xff00->r0
;寄存器偏移寻址
mov r0,r2, lsl #3 ;r2的值左移,结果放入r0,即r0=r2*8
ands r1,r1,r2, lsl r3;r2的值左移r3位,然后和r1与操作,结果放入r1
;LSL逻辑左移,寄存器的低端位补0
;LSR逻辑右移,寄存器的高端位补0
;ASR算术右移,移位过程中保持符号位不变,即如果源操作数位正数,则字的高端空出位补0,否则补1
;ROR循环右移,由字的低端移出的位填入字的高端移出位
;RRX带扩展的循环右移,操作数右移一位,高端空出的位用原C标志值填充,移出位填充C标志值
;寄存器间接寻址
LDR r1,[r2] ;将r2的值作为地址,取出地址的数据保存在r1
;SWP r1,r1,[r2]
GBLA addr1
addr1 SETA 0x03ffffff
addr
;addr1 SETA 0x4
;addr1 SETA 0x5
ADR r0,addr
ldr r2,=addr1
mov r1,#0x3
ldr r3,=addr1
b .
;发光二级管GPIO口初始化
init_lcd
stmfd r13!,{r0,r1,r2}
ldr r0,=GPFCON
ldr r1,[r0]
bic r1,r1,#0xff00
orr r1,r1,#0x5500
str r1,[r0]
ldr r0,=GPFUP
ldr r1,[r0]
orr r1,r1,#0xf0
str r1,[r0]
ldmfd r13!,{r0,r1,r2}
mov pc,lr
;发光二级管显示,通过r0传递参数
light_lcd
stmfd r13!,{r1,r2}
ldr r1,=GPFDAT
ldr r2,=0xffffff0f
mvn r0,r0
mov r0,r0,lsl #4
orr r0,r2,r0
str r0,[r1]
ldmfd r13!,{r1,r2}
mov pc,lr
;延迟函数,通过r0传递时间长度参数
delay
subs r0,r0,#0x1
bne delay
mov pc,lr
;子程序调用例子,子程序调用 b 直接跳转到子程序地址;bl 把子程序返回地址(当前地址的下一条指令),然后跳转到子程序(带返回)
subtest
stmfd r13!,{r0} ;入栈保存
mov r0,#0x1
ldmfd r13!,{r0} ;出栈
mov pc,lr
END
;-------------------------------------------------------------------------------------
;知识文档
;R13 别名 sp 堆栈指针
;R14 别名 lr 专门用于子程序调用的返回值
;R15 别名 pc 程序计数器
;CPSR 当前程序状态寄存器
;SPSR 备份状态寄存器,用于在程序异常终端时保存被中断程序的状态
;31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
;运行模式位[4-0]
; 0b10000 用户模式user
; 0b10001 FIQ模式
; 0b10010 IRQ模式
; 0b10011 管理模式
; 0b10111 终止模式Abort
; 0b11011 未定义模式
; 0b11111 系统模式
;IFT[7-5],I=1禁止IRQ,F=1禁止FIQ,T=1执行thumb指令
;[27-8]保留
;NZCV[31-28]
; N-(负)标志,N=1表示运算结果为负数,N=0表示运算结果为正数或零
; Z-(零)标志,Z=1表示运算结果为零,Z=0表示运算结果为非零
; C-(进位)标志
; 加法运算(包括比较指令cmn):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0.
; 减法运算(包括比较指令cmp):当运算时发生了借位(无符号数下益出),C=0,否则C=1.
; 对于包含移位操作的非加/减运算指令:C为移位操作中最后移出位的值.
; 对于其他非加减运算指令:C的值通常保持不变.
; V-(溢出)标志
; 对于加/减法运算指令:当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
; 对于其他非加/减运算指令:V的值通常不改变.
;条件码:
; EQ Z置位 相等
; NE Z清零 不相等
; CS C置位 无符号数大于或等于
; CC C清零 无符号数小于
; MI N置位 负数
; PL N清零 正数或零
; VS V置位 溢出
; VC V清零 未溢出
; HI C置位Z清零 无符号数大于
; LS C清零Z置位 无符号数小于或等于
; GE N等于V 带符号数大于或等于
; LT N不等于V 带符号数小于
; GT Z清零且(N等于V) 带符号数大于
; LE Z置位且(N不等于V) 带符号数小于或等于
; AL 忽略 无条件执行
阅读(1611) | 评论(0) | 转发(0) |