zoukankan      html  css  js  c++  java
  • 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工程算是编译成功了。

    ——————
    无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
  • 相关阅读:
    MySQL:批量修改表的排序规则
    Python黑客编程3网络数据监听和过滤
    springboot redis 项目实战 完整篇
    C#读取U盘序列号
    AS3,ReferenceError: Error #1056: 无法为 ×× 创建属性 ×××。
    知道挖掘机如何从货车上下来吗?
    一次进销存软件架构的实践(二)——业务外观层设计
    重构你的软件企业
    遇到了火狐扩展全部丢失的问题
    分布式系统设计原理与方案
  • 原文地址:https://www.cnblogs.com/pied/p/2049475.html
Copyright © 2011-2022 走看看