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语句一样的操作来使用。

段标必须要从行首开始,否则会报错。

================ 昏哥线=======================

另外还遇到一个错误,这个一直没法解决。前面几个倒是很敏感的就认为是格式的问题。

abc.axf: Warning: L6665W: Neither Lib$$Request$$armlib Lib$$Request$$cpplib defined, not
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函数,我这没有。
仔细看了下实验指导书上,他新建完工程,提示是否要添加启动代码的时候,人家压根就选择的是否。这个完全属于我手贱。

又新建了一个工程(不知道所谓的启动代码是不是还加了其他东西进去,保险起见,新建一个重头开始),添加写好的汇编程序进去。

然后编译,遇到下面问题

ASM_2.axf: error: L6031U: Could not open scatter description file ASM_2.sct: No such file or directory

杯具的断网了,晚上12点半,哥蹲办公室发奋学习,尼玛居然给断网了!

==================昏哥线=====================
5月18日继续
==================昏哥线=====================

ASM_2.axf: error: L6031U: Could not open scatter description file ASM_2.sct: No such file or directory

这个问题一直没有搜到解决办法,我猜想可能是哪里配置错误,或者是操作不当。遂有按照guideline新建了几次Project。。。果然找到,在target option→Linker选项卡下面,有一个叫scatter file的框框里,uVision4它会自己填进去一个文件名。so。。。我把它删了编译器就不会提示找不到这个文件了。

后面还遇到一个问题:

Error: L6372E: Image needs at least one load region

这个错误是因为前一个错误引申的一个错误。在解决前面一个问题的时候,有人说,直接自己建一个ASM_2.sct的空文件放目录下面就好了,俺就照做了,然后就出现了这个问题。所以,我猜想这个问题是因为scatter file引起的,因为我建了个空的来欺骗编译器,结果编译器找不到需要的信息,所以会报错。

So,一个没证实的想法,如果你在target option→Linker指定了scatter file,编译器就会去从这里读需要的信息;如果没有指定,编译器会自己生成一个,这些信息都是默认的。因为对这个不熟,所以,暂时不知道这些信息是干嘛用的。

自此,俺的第一个在uVersion上的ARM工程算是编译成功了。

——————
无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
原文地址:https://www.cnblogs.com/pied/p/2049475.html