int a;
while(1);
flag:
b flag
b .
IRQ_STACK_START:
.word 0x0badc0de
等价于 unsigned int IRQ_STACK_START = 0x0badc0de;
.global _start @ 给_start外部链接属性
.section .text @ 指定当前段为代码段
.ascii .byte .short .long .word
.quad .float .string @ 定义数据
.align 4 @ 以16字节对齐
.balignl 16 0xabcdefgh @ 16字节对齐填充
.equ @ 类似于C中宏定义
.align 4 @ 2的 4 次幂,16字节对齐
.align 2 @ 2的 2 次幂, 4字节对齐
.balignl 16, 0xdeadbeef @ 对齐 + 填充
b表示位填充;align表示要对齐;l表示long,以4字节为单位填充;16表示16字节对齐;0xdeadbeef是用来填充的原料。
0x00000008: .balignl 16, 0xdeadbeef
0x0000000c: 0xdeadbeef
0x00000010: 下一条指令
.end @标识文件结束
.include @ 头文件包含
.arm / .code32 @声明以下为arm指令
.thumb / .code16 @声明以下为thubm指令
ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
nop 空操作
ARM 中有一个 ldr 指令,还有一个 ldr 伪指令
一般都使用 ldr 伪指令而不用 ldr 指令
ldr指令: ldr r0, #0xff
伪指令: ldr r0, =0xfffl @涉及到合法/非法立即数,涉及到ARM文字池
adr 和 ldr 的差别:ldr 加载的地址在链接时确定,而 adr 加载的地址在运行时确定;所以我们可以通过 adr 和 ldr 加载的地址比较来判断当前程序是否在链接时指定的地址运行。