开始研究ARM了,从最基础最简单的,点亮LED灯开始。
//嗯,最简单的应该是直接把LED灯接在电源上吧……
主要学习一下汇编代码的结构,ARM GPIO口的控制。
硬件环境:
s3c2440处理器
GPB5、GPB6、GPB8、GPB10口各接一个发光二极管,
发光二级管正极接电源,负极接GPB口。(即低电平导通并发光)
Code Warrior 编译
汇编代码:
1 AREA LEDSAMPLE,CODE,READONLY
2 ENTRY
3 START
4 LDR R3, =0x56000010
5 LDR R4, =0x00DDD7FC
6 STR R4, [R3]
7
8 LDR R1, =0x56000014
9 MOV R2, #0X0
10 STR R2, [R1]
11
12 B START
13 END
注解及笔记:
01
指示一个代码段或者数据段;
LEDSAMPLE:段名;CODE:表示这是一个代码段;READONLY:表示只读
02
入口
03
标号,用于跳转指令。
另外
标号需要顶格写,也就是说,其他的代码不可以顶格写
04
LDR伪指令(不同于ARM指令LDR),将一个值(立即数0x56000010)存入寄存器R3
0x56000010为GPB的控制寄存器地址,即GPBCON
而ARM装载指令LDR用法一般为: LDR R1, [R2] ;读取R2寄存器所保存的值作为一个内存地址,将这个地址上所保存的数据存入R1
05 同04
其中,对于GPB口,01表示用于输出。GPB5,6,8,10的设置位分别为[11:10][13:12][17:16][21:20]
06 储存指令,读取R3中保存的值作为一个内存地址,并将R4所保存的值保存到这个内存地址上
即为GPBCON赋值,设置GPB口功能
08 同04
其中0x56000014为GPBDAT寄存器地址,存放IO数据。此处输出全0,即低电平。
09 传输指令。将一个8位图立即数(0x0)送入R2
本身主要用于寄存器之间传输数据:MOV R1, R0 ;将R0中保存的值赋给R1
10 同06
12 ARM跳转指令,程序跳转至标号START处
13 结束