ARM ASM初接触
用uVersion的RealMDK(额,应该是这么叫的,不确定),开始接触底层代码了;不知道底层怎么实现的,用Linux写应用的时候总觉得很别扭很低级。
好吧,我的第一个arm-asm程序
;It's my first arm-asm programm
;Hello arm!
;
;2011-05-17
;
;*************************************************
;constant define
;*************************************************
x EQU 45;
y EQU 20;
stack_top EQU 0x30200000;
export Reset_Handler
;**************************************************
;code
;**************************************************
AREA test,CODE,READONLY
Reset_Handler
ldr sp,=stack_top
mov r0,#x
str r0,[sp]
mov r0,#y
ldr r1,[sp]
add r0,r0,r1
; stop b stop
end
解释如下(不知道这个是ARM汇编里的还是MDK相关的):
①EQU
该伪操用于将数字常量、基于寄存器的值和程序中的标号定义为一个字符名称。
格式:symbol EQU expression
会自动忽略EQU两边的空格或者是table。
②EXPORT/GLOBAL
EXPORT(GLOBAL功能完全相同)用于声明在本文件中定义但能在其他模块中使用的变量,相当于定义了一个全局变量。
语法格式:EXPORT symbol, symbol...
EXPORT和symbol中间只能有一个空格,多了会报错。
③AREA
AREA 用于定义一个代码段或数据段,ARM汇编程序设计采用分段式设计,一个 ARM源程序至少有一个代码段,大的程序会有若干个代码段和数据段。
语法格式:AREA segment-name, class-name, attributes ,...
AREA不能顶行首,AREA后面只能跟空格,否则会报错
④END
END 用于标记汇编文件的结束行,即标号后的代码不作处理。
end可以是小写的,但是千万不可顶行首写,会出现warning"A1447W: Missing END directive at end of file, but found a label named END。"
⑤程序段的名称(如Reset_Handler)一段程序的段标。
供类似C语言里的goto语句一样的操作来使用。
段标必须要从行首开始,否则会报错。
================ 昏哥线=======================
另外还遇到一个错误,这个一直没法解决。前面几个倒是很敏感的就认为是格式的问题。
searching ARM libraries.
abc.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main.
Target not created
找了半天,都不厚道的讲要重装巴拉巴拉。。。
其实,很简单,新建工程的时候不小心把MDK自带的启动代码加到工程里面了。
启动代码里面有一句,它要引用_main这个变量的,但是我的代码里面只输出了Reset_Handler这一个变量。也就是,默认的启动代码会等一个main函数,我这没有。
仔细看了下实验指导书上,他新建完工程,提示是否要添加启动代码的时候,人家压根就选择的是否。这个完全属于我手贱。
又新建了一个工程(不知道所谓的启动代码是不是还加了其他东西进去,保险起见,新建一个重头开始),添加写好的汇编程序进去。
然后编译,遇到下面问题
杯具的断网了,晚上12点半,哥蹲办公室发奋学习,尼玛居然给断网了!
==================昏哥线=====================
5月18日继续
==================昏哥线=====================
这个问题一直没有搜到解决办法,我猜想可能是哪里配置错误,或者是操作不当。遂有按照guideline新建了几次Project。。。果然找到,在target option→Linker选项卡下面,有一个叫scatter file的框框里,uVision4它会自己填进去一个文件名。so。。。我把它删了编译器就不会提示找不到这个文件了。
后面还遇到一个问题:
这个错误是因为前一个错误引申的一个错误。在解决前面一个问题的时候,有人说,直接自己建一个ASM_2.sct的空文件放目录下面就好了,俺就照做了,然后就出现了这个问题。所以,我猜想这个问题是因为scatter file引起的,因为我建了个空的来欺骗编译器,结果编译器找不到需要的信息,所以会报错。
So,一个没证实的想法,如果你在target option→Linker指定了scatter file,编译器就会去从这里读需要的信息;如果没有指定,编译器会自己生成一个,这些信息都是默认的。因为对这个不熟,所以,暂时不知道这些信息是干嘛用的。
自此,俺的第一个在uVersion上的ARM工程算是编译成功了。