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   |     -    |  包含一个文件                                 |
	|------------------------------------------------------------------------------|
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值