zoukankan      html  css  js  c++  java
  • (转)ARM GNU常用汇编语言介绍

    ARM GNU常用汇编语言介绍

    原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010445441611/

     

    ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令组成.ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令。

    伪操作,是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序时处理,而在计算机运行期间没有有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失.

    宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义。

    • 宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用。

    • 通过直接书写宏名来使用宏.并本具宏指令的格式输入输出参数.

    • 宏定义本身不产生代码,只是在调用它时把宏体插入到原程序中.

    • 宏与C语言中的子函数形参和实参的调用相似,调用宏时通过实际的指令来代替宏体,实现相关的一段代码,但宏的调用与子程序的调用有本质的区别,即宏并不会节省程序的空间,其优点是简化程序代码,提高程序的可读性以及宏内容可以同步改.

    伪操作,宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则.

    伪指令也是ARM汇编语言程序里的特殊助记符,也不在处理器运行期间由机器执行,他们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作.

     

    目前常用的ARM编译环境有2种:

    • ADS/SDT IDE:ARM公司开发,使用了CodeWarrior公司的编译器.

    • 集成了GNU开发工具的IDE开发环境;它由GNU的汇编器as,交叉汇编器gcc和连接器id组成.

    ADS编译环境下的ARM伪操作和宏指令,可参考北航出版社的《ARM微控制器基础与实践》(周立功)这里主要讲述ARM GNU常用汇编语言。

     

    4.1 ARM GNU常用汇编伪指令介绍

    1. abort

    abort: 停止汇编

    .align absexpr1,absexpr2:

    以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值.

     

    2. if...else...endif

    .if

    .else

    .endif: 支持条件预编译

     

    3. include

    .include "file": 包含指定的头文件, 可以把一个汇编常量定义放在头文件中.

     

    4. comm

    .comm  symbol, length:在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接会为它留出空间.

     

    5. data

    .data subsection: 说明接下来的定义归属于subsection数据段.

     

    6. equ

    .equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间.

     

    7. global

    .global symbol: 定义一个全局符号, 通常是为ld使用.

     

    8. ascii

    .ascii "string": 定义一个字符串并为之分配空间.

     

    9. byte

    .byte expressions: 定义一个字节, 并为之分配空间.

     

    10. short

    .short expressions: 定义一个短整型, 并为之分配空间.

     

    11. int

    .int expressions: 定义一个整型,并为之分配空间.

     

    12 long

    .long expressions: 定义一个长整型, 并为之分配空间.

     

    13 word

    .word expressions: 定义一个字,并为之分配空间, 4bytes.

     

    14. macro/endm

    .macro: 定义一段宏代码, .macro表示代码的开始, .endm表示代码的结束.

     

    15. req

    name .req register name: 为寄存器定义一个别名.

     

    16. code

    .code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令.

     

    17. ltorg

    .ltorg: 表示当前往下的定义在归于当前段,并为之分配空间.

     

    4.2 ARM GNU专有符号

    1. @

    表示注释从当前位置到行尾的字符.

     

    2. #

    注释掉一整行.

     

    3. ;

    新行分隔符.

     

    4.3 操作码

    1. NOP

    nop

    空操作, 相当于MOV r0, r0

     

    2. LDR

    ldr <register> , = <expression>

    相当于PC寄存器或其它寄存器的长转移.

     

    3.ADR

    adr <register> <label>

    相于PC寄存器或其它寄存器的小范围转移.

     

    4.ADRL

    adrl <register> <label>

    相于PC寄存器或其寄存器的中范围转移.

     

    5 可执行生成说明

    5.1 lds文件说明

    5.1.1 主要符号说明

    1. OUTPUT_FORMAT(bfdname)

    指定输出可执行文件格式.

     

    2. OUTPUT_ARCH(bfdname)

    指定输出可执行文件所运行CPU平台

     

    3. ENTRY(symbol)

    指定可执行文件的入口段

     

    5.1.2 段定义说明

    1. 段定义格式

        SECTIONS
        { ...
            段名 :
            {
                内容
            }
        ...
        } 
  • 相关阅读:
    前端与算法 leetcode 344. 反转字符串
    JavaScript闭包使用姿势指南
    前端与算法 leetcode 48. 旋转图像
    前端与算法 leetcode 36. 有效的数独
    前端与算法 leetcode 1. 两数之和
    前端与算法 leetcode 283. 移动零
    前端与编译原理 用js去运行js代码 js2run
    前端与算法 leetcode 66. 加一
    前端与算法 leetcode 350. 两个数组的交集 II
    前端与算法 leetcode 26. 删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/sheshiji/p/3623737.html
Copyright © 2011-2022 走看看