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工程算是编译成功了。

    ——————
    无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
  • 相关阅读:
    剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
    剑指 Offer——3. 从尾到头打印链表
    剑指 Offer——2. 替换空格
    剑指 Offer——1. 二维数组中的查找
    LeetCode 905. Sort Array By Parity 按奇偶校验排列数组
    LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
    SSH 代码笔记
    anaconda3安装caffe
    opencv多版本安装
    人脸文章与数据库
  • 原文地址:https://www.cnblogs.com/pied/p/2049475.html
Copyright © 2011-2022 走看看