第4章 GNU汇编伪指令集
– label: .string str – label: .ascii str – label: .asciz str
a: .string “abc” //分配了4字节(含\0) a: .ascii “abc” //分配了3字节 a: .asciz “abc” //分配了4字节
陈付龙:嵌入式系统
20
a
0x1234
陈付龙:嵌入式系统
short a=0x1234;
15
• 3.四字节分配 • 作用:在存储器中分配4个字节,并初始化 • 格式:
– label: .word expr – label: .long expr
-2^16~2^32-1的数字 程序标号
a: .word 0x12345678
a 0x12345678
• 作用:
– ADR伪指令为小范围地址读取伪指令。ADR伪指令将基于PC相对偏移地 址或基于寄存器相对偏移地址值读取到寄存器中,当地址值是字节对齐 时,取值范围为−255~255,当地址值是字对齐时,取值范围为−1020~ 1020。当地址值是16字节对齐时其取值范围更大。 – 相于PC寄存器或其它寄存器的小范围转移。
陈付龙:嵌入式系统
5
伪指令格式
.伪指令
陈付龙:嵌入式系统
6
伪指令种类
• 在GNU平台无关的汇编程序中,伪指令主要有
– 符号定义伪操作
• global, local, set, equ
– 数据定义伪操作
• byte, short, word, long, quad, float, space, skip, string, ascii, asciz, rept
22
• 1.选择 • 作用:根据条件判断,决定是否执行某个指令序列 • 格式:
– .if logical-expression commands [ .else commands] .endif – .if logical-expression commands .elseif logical-expression commands [.elseif logical-expression commands] .endif
陈付龙:嵌入式系统
25
4.1.5 杂项伪操作
• • • • • • • • • • • • align section data text include arm code 32 code 16 thumb extern weak end
陈付龙:嵌入式系统
26
• 1.align • 格式:
– .align abs-expr
– .extern symbol
• 作用:声明一个外部符号
陈付龙:嵌入式系统
34
• 9.weak • 格式:
– .weak symbol
• 作用:声明一个弱符号
陈付龙:嵌入式系统
35
• 10.end • 格式:
– .end
• 作用:汇编结束
陈付龙:嵌入式系统
36
4.2 GNU汇编器支持的ARM伪指令
陈付龙:嵌入式系统
38
• 使用说明:
– ADR伪指令被汇编器编译成一条指令。汇编器 通常使用ADD指令或SUB指令来实现伪操作的地 址装载功能。如果不能用一条指令来实现ADR 伪指令的功能,汇编器将报告错误。
• 示例:
LDR R4,=data+4*n ; code MOV pc,lr data DCD value0 ; n-1条 DCD 伪操作 DCD valuen ;更多 DCD 伪操作 ;n是汇编时产生的变量
陈付龙:嵌入式系统
8
• 1.全局标号定义 • 作用:定义一个全局符号,通常是为连接 器ld使用 • 格式:
– .global symbol – .globl symbol
陈付龙:嵌入式系统
9
• 2.局部标号定义
• 作用:定义对外部不可见的局部符号,作 用域仅在当前文件中 • 格式:
– .local symbol
• ARM汇编器支持ARM伪指令
– ADR – ADRL – LDR 它们在汇编阶段被编译成ARM或Thumb指令(指 令序列)
陈付龙:嵌入式系统
37
4.2.1 ADR伪指令
• 格式:
ADR{cond}{.W} <register> , =<expression> – ① cond,可选的指令执行条件 – ② .W,可选项。指定指令宽度(Thumb-2指令集支 持) – ③ register,目标寄存器 – ④ expression ,基于PC或具有寄存器的表达式。
陈付龙:嵌入式系统
4
4.1.1 伪指令概念
• 在ARM汇编语言程序中,有一些特殊指令助记符, 这些助记符与指令系统的助记符不同,没有相对应 的操作码,通常称这些特殊指令助记符为伪操作标 识符(directive),它们所完成的操作称为伪操作。 • 它既不控制机器的操作也不被汇编成机器代码,只 能为汇编程序所识别并指导汇编如何进行。 将相对 于程序或相对于寄存器的地址载入寄存器中。 • 伪指令在源程序中的作用是为了完成汇编程序做各 种准备工作的,这些伪操作仅在汇编过程中起作用, 一旦汇编结束,伪操作的使命就完成。
陈付龙:嵌入式系统
int a=0x12345678;
16
• 4.八字节分配 • 作用:在存储器中分配8个字节,并初始化 • 格式:
– label: .quad expr
程序标号
-2^32~2^64-1的数字
a: .quad 0x1234567812345678
long a=0x1234567812345678;
31
• 6.arm • 格式:
– .arm
• 作用:定义一下代码使用arm指令集编译, 功能等价于.code32
陈付龙:嵌入式系统
32
• 7.thumb • 格式:
– .thumb
• 作用:定义一下代码使用thumb指令集编译, 功能等价于.code16
陈付龙:嵌入式系统
33
• 8.extern • 格式:
– Symbol .equ expr
start .equ 0x40 start .equ 0x50 mov r1, #start r1
0x50
陈付龙:嵌入式系统
12
4.1.3 数据定义伪指令
• 为特定的数据分配存储单元 • 初始化存储单元
陈付龙:嵌入式系统
13
• 1.字节分配
• 作用:在存储器中分配一个字节,用指定 的数据对其初始化 • 格式:
.long \from .if \to-\from sum "(\from+1)",\to .endif .endm
sum 0,5
.long .long .long .long .long
1 2 3 4 5
24
陈付龙:嵌入式系统
举例
.macro SHIFTLEFT a, b .if \b < 0 mov \a, \a, ASR #-\b .exitm .endif mov \a, \a, LSL #\b .endm
– 汇编控制伪操作
• if, else, endif, macro, endm, exitm
– 杂项伪操作
• align, section, data, text, include, arm, code, thumb, weak, end
–…
陈付龙:嵌入式系统
7
4.1.2 符号定义伪指令
• 定义全局变量或局部变量 • 给全局变量或局部变量赋值
陈付龙:嵌入式系统
23
• 2.宏 • 作用:定义宏代码段,.macro: 定义一段宏 代码, .macro表示代码的开始, .endm表示代 码的结束, .exitm跳出宏 参数 宏名 • 格式:
– .macro macroname macArgs commands .long 0 .macro sum from=0, to=5 .endm
Richard Stallman
/binutils/docs-2.12//Pseudo-Ops.html#Pseudo%20Ops
陈付龙:嵌入式系统
3
/binutils/docs-2.12//Pseudo-Ops.html#Pseudo%20Ops
• 作用:通过填充字节的方式,使当前位置 满足一定的对齐方式
a
.align 2 .string “abcde”
2^2字节对齐
b c d e
陈付龙:嵌入式系统
27
• 2.section • 格式:
– .section sectioname
• 作用:定义一个段
陈付龙:嵌入式系统
28
• 3.data • 格式:
– label: .space size, expr – label: .skip size, expr
程序标号 内存字节数 4字节之内的值
a: .space 8,0x1
char a[8]={0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1};
陈付龙:嵌入式系统
19
• 7.字符串定义 • 作用:定义一个字符串 • 格式:
陈付龙:嵌入式系统
10
• 3.变量赋值 • 作用:给一个全局变量或局部变量赋值 • 格式:
– .set symbol, expr
.set start, 0x40 .set start, 0x50 mov r1, #start r1
0x50
陈付龙:嵌入式系统
11
• 4.宏替换 • 作用:给一个全局变量或局部变量赋值 • 格式: