GNU平臺無關 符號定義偽指令 ,`.local .set .equ` .global 使得符號對連接器可見,變為對整個工程可用的全局變數 .local 表示符號對外部不可見,只對本文件可見 .set 給一個全局變數或局部變數賦值,和 的功能一樣 .equ 和 一樣,只是格式不同 數據定義偽指令 , ...
GNU平臺無關
符號定義偽指令
.global
,.local
,.set
,.equ
.global
使得符號對連接器可見,變為對整個工程可用的全局變數
.global symbol
.local
表示符號對外部不可見,只對本文件可見
.local symbol
.set
給一個全局變數或局部變數賦值,和.equ
的功能一樣
.set symbol expr
.set start, 0x40
.set start, 0x50
mov r1, #start ;r1裡面是0x50
.equ
和.set
一樣,只是格式不同
symbol .equ expr
start .equ, 0x40
start .equ, 0x50
mov r1, #start ;r1裡面是0x50
數據定義偽指令
.byte
,.short
,.long
,.quad
,.float
,.string
,.asciz
,.ascii
,.rept
.byte
在存儲器中分配1個位元組,用指定的數據對存儲單元進行初始化
label: .byte expr ;label是程式標號,expr可以是-128~255的數字,也可是字元
a: .byte #1 ;等價於C中的char a=1;
.short
在存儲器中分配2個位元組,用指定的數據對存儲單元進行初始化
a: .short 0x1234
.word / .long
在存儲器中分配4個位元組,用指定的數據對存儲單元進行初始化
a: .word 0x12345678
.long
在存儲器中分配個位元組,用指定的數據對存儲單元進行初始化
.quad
在存儲器中分配8個位元組,用指定的數據對存儲單元進行初始化
a: .quad 0x12345678 ;等價於C中的long a=0x1234567812345678
.float
在存儲器中分配4個位元組,用指定的浮點數據對存儲單元進行初始化
a: .float 1.11
.space/.skip
用於分配一塊連續的存儲區域並初始化為指定的值,如果後面的填充值省略不寫則在後面填充為0;
label: .space size,expr ;expr可以是4位元組以內的浮點數
a: space 8, 0x1
.string
定義一個字元串,預設是string8,還有string16,string32,string64
a: .space "hello world!"
.rept
重覆執行接下來的指令,以.rept開始,以.endr結束
.rept cnt ;cnt是重覆次數
...
.endr
彙編控制偽操作
流程式控制制偽指令主要yy.if .else .endif
.macro .endm .exitm
.if .else .endif
.if logical-expression
...
.elseif logical-expression2
...
.else
...
.endif
.macro .endm .exitm
該偽指令可以將一段代碼定義為一個整體,稱為巨集指令,然後就可以在程式中通過巨集指令多次調用該段代碼,而.exitm
指令用來退出當前的巨集指令,巨集指令可以使用一個或多個參數,當巨集操作被展開時,這些參數被相應的值替換。
包含在.macro
和。endm
之間的指令序列稱為巨集定義體。在巨集定義體的第一行應聲明巨集的原型,包含巨集名所需的參數,然後就可以在彙編程式中通過巨集名來調用該指令序列,在源程式被編譯時,彙編器將巨集調用展開,用巨集定義中的指令序列代替程式中的巨集調用,並將實際參數的值傳遞給巨集定義中的形式參數
.macro macroname macargs ...
;code
.endm
雜項
.align 用於使程式當前位置滿足一定的對齊方式
.section 用來定義一個段的偽指令
.data 用來定義一個數據段
.text 用來定義一個代碼段
.include 用來包含一個頭文件
.arm 定義以下代碼使用arm指令集編譯
.code 32 同.arm
.code 16 同.thumb
.thumb 定義以下代碼使用thumb指令集編譯
.extern 用於聲明一個外部符號,用於相容性其他彙編
.weak 用於聲明一個弱符號,如果這個符號沒有定義,編譯就忽略,而不會報錯
.end 表示彙編結束
GNU平臺相關
ADR
把標簽所在的地址載入到寄存器中,這個指令將基於PC相對偏移的地址值或基於寄存器相對偏移的地址值讀取到寄存器中。當地址值是位元組對齊的時候,取值範圍是-255~255B;當地址值是字對齊的時候,取值範圍為-1020~1020B。當地址值是16位元組對齊時,取值範圍更大。 該指令等價於add <reg>, pc , offset
ADR <reg> <label>
ADRL
用於將中等範圍地址讀取到寄存器中
ADRL <reg> <label>
LDR
裝載一個32位的常數和一個地址寄存器
LDR reg, =expr
reg:目標寄存器
expr:32位常量表達式。彙編器根據expr的取值情況,對LDR偽指令做如下處理:
- 當expr表示的指令地址值沒有超過MOV指令或MVN指令的地址取值範圍時,彙編器用一對MOV和MVN代替LDR指令
- 當超過了的時候,彙編器將常數放入緩存吃,同時用一條基於PC的LDR讀取該常數
LDR R3,=0xff0
;將常熟0xff0讀到記憶體中相當於MOV R3, #0xff0
LDR R1,=0xfff
;將常數0xfff讀到記憶體,
;相當於LDR R1,[pc, offset_to_litpool] ... litpool DCD 0xfff
LDR R2, =place
;將place標號的地址讀入到R1中
;相當於LDR R1,[pc, offset_to_litpool] ... litpool DCD place