就不对着数据手册说有寄存器了,主要说说ARM汇编和GNU汇编的区别,以前用RVDS2.2用的汇编程序都真ARM汇编。到用eclipse用的是编译u-boot或者内核的arm-linux-gcc,这次用的汇编要用GNU汇编,编译时交给arm-linux-gcc来做剩下的工作。
原来的一个RVDS2.2下的汇编LED程序是这样的:
WTCON EQU 0x53000000 ;看门狗控制寄存器地址
GPBCON EQU 0x56000010 ;GPB控制寄存器
GPBDAT EQU 0x56000014 ;GPB数据寄存器
AREA Init,CODE,READONLY ;声明代码段
ENTRY ;表示程序入口
CODE32 ;声明32位ARM指令
START ldr r0,=WTCON ;关掉看门狗
mov r1,#0x0
str r1,[r0]
ldr r0,=GPBCON ;设置GPB5为输出
mov r1,#0x400
str r1,[r0]
ldr r0,=GPBDAT ;设置GPB5为低 点亮LED1
mov r1,#0
str r1,[r0]
LOOP
b LOOP
END
改成GNU汇编是这样的:
;/**********************************************************
;*实验要求:创建启动代码汇编文件
;*功能描述:初始化一些必须的寄存器
;*日 期:2013-04-07
;*作 者:kangear
;**********************************************************/
.equ WTCON, 0x53000000 @看门狗控制寄存器地址
.equ GPBCON, 0x56000010 @GPB控制寄存器
.equ GPBDAT, 0x56000014 @GPB数据寄存器
@ AREA Init,CODE,READONLY @声明代码段
@ ENTRY @表示程序入口
@ CODE32 @声明32位ARM指令
.text
.global _start
_start:
ldr r0,=WTCON @关掉看门狗
mov r1,#0x0
str r1,[r0]
ldr r0,=GPBCON @设置GPB5为输出
mov r1,#0x400
str r1,[r0]
ldr r0,=GPBDAT @设置GPB5为低 点亮LED1
mov r1,#0
str r1,[r0]
LOOP:
b LOOP
.end
EQU变成的.equ; AREA变成了.text; ";"变成了"@"; 裸机都GNU了。 东西不多,调试的出现的问题说一下,单步调试到最后一句会出现如下提示:
![](https://img-my.csdn.net/uploads/201304/08/1365380016_4352.png)
这个不是什么错误,eclipse在说:这句是一个死循环!按照它的意思往下调试就没有意义了。这就相当于while(1);仅此而已。