伪指令不是指令,伪指令和指令的根本区别是通过编译后会不会生成机器码。工具
伪指令的意义在于指导编译过程。学习
伪指令是和具体的编译器相关的,咱们使用gun工具链,所以学习gun环境下的汇编伪指令。spa
gun汇编中的一些符号:code
@ 用来作注释ci
# 也用来作注释,通常用于行首,表示这一行都是注释而不是代码编译器
: 以冒号结尾的是标号string
. 在gun汇编中表示当前指令的地址io
# 当即数前面要加#或$,表示这是个当即数编译
.global _start @给_start外部连接属性float
.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