僞指令不是指令,僞指令和指令的根本區別是通過編譯後會不會生成機器碼。工具
僞指令的意義在於指導編譯過程。學習
僞指令是和具體的編譯器相關的,咱們使用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