伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
伪指令的意义在于指导编译过程。
伪指令是和具体的编译器相关的,我们使用gun工具链,因此学习gun环境下的汇编伪指令。
gun汇编中的一些符号:
@ 用来做注释
# 也用来做注释,一般用于行首,表示这一行都是注释而不是代码
: 以冒号结尾的是标号
. 在gun汇编中表示当前指令的地址
# 立即数前面要加#或$,表示这是个立即数
.global _start @给_start外部链接属性
.section .text @指定当前段为代码段
.ascii .byte .short .long .word
.quad .float .string@定义数据
.align 4 @以16字节对齐
.balignl 16 0x12345678 @16字节对齐填充
.equ @类似C中宏定义
例如:
IRQ_STACK_START:
.word 0x12345678
等价于 unsigned int IRQ_STACK_START = 0x122345678;
.balignl 16,0xdeadbeef @对齐+填充
b表示位填充;align表示要对齐;l表示long,以4字节为单位填充;16表示16字节对齐;0xdeadbeef是用来填充的原料
.end @表示文件结束
.include @头文件包含于
.arm/ .code32 @声明以下为arm指令
.thumb/ .code16 @声明以下为thumb指令
ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
nop 空操作
ARM指令中有一个ldr指令,也有一个ldr伪指令。一般都使用伪指令。
ldr指令: ldr r0,#0xff
ldr伪指令: ldr r0,=0xfff @涉及到合法/非法立即数,涉及到ARM文字池
adr与ldr
ldr加载的地址和链接时给定的地址有关,由链接脚本决定。