Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3432601
  • 博文数量: 754
  • 博客积分: 10132
  • 博客等级: 上将
  • 技术积分: 7780
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:36
文章分类

全部博文(754)

文章存档

2012年(3)

2011年(39)

2010年(66)

2009年(167)

2008年(479)

我的朋友

分类: LINUX

2008-06-26 00:45:01

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) |
0

上一篇:ARM指令集

下一篇:The GNU Assembler

给主人留下些什么吧!~~