linux嵌入式编程学习笔记(2)


汇编语言的程序格式:

以段(section)为单位组织源文件 分为代码段, 数据段, 段之间相互独立 一个ARM汇编程序至少需要一个代码段, 使用AREA伪操作标识一个段的开始, 段的名字和属性 使用伪操作ENTRY标识程序执行的第一条命令 使用伪操作END标识汇编程序结束 标号 注释

汇编语言实例:数据块复制

AREA COPY, CODE, READONLY     ENTRY START     LDR RO, =SRC     LDR R1, =DST     MOV R2, #10 LOOP     LDR R3, [R0], #4     STR R3, [R1]. #4     SUBS R2, R2, #1     BNE LOOP AREA COPYDATA, DATA, READWRITE SRC DCD 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 DST DCD 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    END

符号与标号:

符号的定义: 在ARM汇编中, 使用符号表示地址, 标量和数字常量 当符号用来标识地址时, 又称为标号 符号的命名: 由字母, 数字和下划线组成, 开头不能使用数字, 但局部标号除外 符号在其作用域内必须唯一 不能与系统内部或系统预定义的符号同名 不能与指令助记符, 伪指令同名 局部标号: 通过数字0-99而不是使用名称(字符)进行地址引用 作用域为当前段 引用格式: %{F/B/A/T} N{routname} F: 指示编译器向前搜索 B: 指示编译器向后搜索 A: 指示编译器搜索宏的所有嵌套层次 T: 指示编译器搜索宏的当前层 routname: 局部标号作用范围名称, 使用ROUT伪指令定义 若B, F没有指定, 编译器先向后搜索, 再向前搜索

伪操作:

伪操作时ARM汇编语言中一些特殊的指令助记符 主要目的是对汇编源程序指令做各种处理, 组装成一个完整的汇编程序 伪操作是为汇编器服务的, 汇编之后, 伪操作消失, 类型于C语言中的宏为编译器服务, 预处理之后, 宏消失 不同的编译环境, 伪操作格式可能不一样 常用伪操作: 符号定义伪操作: GBLA, LCLA 数据定义伪操作: DCD, DCB, SPACE 汇编控制伪操作: AREA, ENTRY, MACRO, MEND 符号定义常用伪操作: |------------------------------------------------------------------------------| |  伪操作  |      使用示例     |                    说明                       | |------------------------------------------------------------------------------| |   GBLA   |  GBLA a           |  声明一个全局算术变量a, 并初始化为0           |    |----------|-------------------|-----------------------------------------------| |   GBLL   |  GBLL a           |  声明一个全局逻辑变量a, 并初始化为{FALSE}     |    |----------|-------------------|-----------------------------------------------| |   GBLS   |  GBLS str       |  声明一个全局字符串变量str, 并初始化为空串    |    |----------|-------------------|-----------------------------------------------| | LCLA/L/S |  LCLA/L/S a       |  声明一个局部的算术/逻辑/字符串变量a          |    |----------|-------------------|-----------------------------------------------| |   SETA   |  num SETA 20      |  给算术变量num赋值20                          |    |----------|-------------------|-----------------------------------------------| |   SETL   |  bool SETL {TRUE} |  给逻辑变量bool赋值{TRUE}                     |    |----------|-------------------|-----------------------------------------------| |   SETS   |  str SETS "hello" |  给字符串变量str赋值"hello"                   |    |----------|-------------------|-----------------------------------------------| |   RLIST  |  ArReg RLIST {R0} |  给寄存器列表定义名称ArReg, 可通过LDM/STM访问 |    |----------|-------------------|-----------------------------------------------| |   CN     |  Cache CN 7       |  将协处理器的寄存器7命名为Cache               |    |----------|-------------------|-----------------------------------------------| |   CP     |  memory CP 15     |  将协处理器P15命名为(ARM支持16个协处理器)     |    |----------|-------------------|-----------------------------------------------| |   DN     |  name DN rgname   |  给一个双精度VFP寄存器命名                    |    |----------|-------------------|-----------------------------------------------| |   SN     |  name SN rgname   |  给一个单精度VFP寄存器命名                    |    |----------|-------------------|-----------------------------------------------| |   FN     |  name FN rgname   |  给一个浮点寄存器命名                         | |------------------------------------------------------------------------------| 数据定义常用伪操作: |------------------------------------------------------------------------------| |  伪操作  |      使用示例     |                    说明                       | |------------------------------------------------------------------------------| |  DCD或&  |num DCD 0xffffffff |  指定编译器分配一个或多个字, 4字节对齐        |    |----------|-------------------|-----------------------------------------------| |   DCDU   |   DCDU 0xffffffff |  指定编译器分配一个或多个字, 不需要对齐       |    |----------|-------------------|-----------------------------------------------| |  DCB或=  |    DCB "A"       |  指定编译器分配一个或多个字节空间             |    |----------|-------------------|-----------------------------------------------| | SPACE或% |    Buf SPACE 100  |  指定编译器分配一块连续空间, 并初始化为0      |    |----------|-------------------|-----------------------------------------------| |  MAP或^  |    MAP 0xffffffff |  定义一个结构化内存表的首地址                 |    |----------|-------------------|-----------------------------------------------| | FIELD或# |  a/str FIELD 4/8  |  定义一个结构化内存表中的数据域               |    |----------|-------------------|-----------------------------------------------| |DCFD/DCFDU|         -         |  给双精度浮点数分配存储空间                   |    |----------|-------------------|-----------------------------------------------| |DCFS/DCFSU|         -         |  给单精度浮点数分配存储空间                   |    |----------|-------------------|-----------------------------------------------| | DCQ/DCQU |         -         |  分配双字(8 byte)存储空间                     |    |----------|-------------------|-----------------------------------------------| | DCW/DCWU |         -         |  分配半字(2 byte)存储空间                     |    |----------|-------------------|-----------------------------------------------| |   DATA   |         -         |  表示代码段数据的标号, 一般后跟DCD或DCB       |    |----------|-------------------|-----------------------------------------------| |   LTORG  |         -         |  声明一个文字池(数据缓冲池)                   | |------------------------------------------------------------------------------| 汇编控制伪操作: |------------------------------------------------------------------------------| |       伪操作      | 使用示例 |                    说明                       | |------------------------------------------------------------------------------| |  IF, ELSE, ENDIF  |     -    |  条件汇编                                     |    |-------------------|----------|-----------------------------------------------| |    WHILE, WEND    |     -    |  重复汇编中一段相同的源代码                   |    |-------------------|----------|-----------------------------------------------| | MACRO, MEND, MEXIT|     -    |  宏定义                                       | |------------------------------------------------------------------------------| 其他常用伪操作: |------------------------------------------------------------------------------| |       伪操作      | 使用示例 |                    说明                       | |------------------------------------------------------------------------------| |       ALIGN       |     -    |  使用当前位置满足一字节的对齐                 |    |-------------------|----------|-----------------------------------------------| |       AREA        |     -    |  指示汇编器代码段或数据段的开始               |    |-------------------|----------|-----------------------------------------------| |       CODE16      |     -    |  指示编译器后面的指令为Thumb指令              | |-------------------|----------|-----------------------------------------------| |       CODE32      |     -    |  指示编译器后面的指令为ARM指令                | |-------------------|----------|-----------------------------------------------| |       ENTRY       |     -    |  指定程序的入口点                             | |-------------------|----------|-----------------------------------------------| |        EQU        |     -    |  给常量定义一个符号名, 类似于宏               | |-------------------|----------|-----------------------------------------------| |        END        |     -    |  表示汇编源程序结束                           | |-------------------|----------|-----------------------------------------------| |  EXPORT, GLOBAL   |     -    |  声明一个符号可以被其他文件引用               | |-------------------|----------|-----------------------------------------------| |  IMPORT, EXTERN   |     -    |  引用其他文件的符号, 需要先IMPORT             | |-------------------|----------|-----------------------------------------------| |    GET, INCLUDE   |     -    |  包含一个文件                                 | |------------------------------------------------------------------------------|


本文为我原创

-- --
  • 投诉或建议
评论