ARM彙編偽指令

2021-09-24 22:33:23 字數 2553 閱讀 1921

.global,.local,.set,.equ

.global

使得符號對聯結器可見,變為對整個工程可用的全域性變數,通俗講就是定義全域性變數

eg:.global symbol

.local

.set

給乙個全域性變數或區域性變數賦值,和.equ的功能一樣

eg:.set symbol expr

.set start, 0x40

.set start, 0x50

mov r1, #start ;r1裡面是0x50

.equ

和.set一樣,只是格式不同

eg: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的數字,也可是字元

eg:a: .byte #1 ;等價於c語言中的char a=1;

.short

在儲存器中分配2個位元組,用指定的資料對儲存單元進行初始化

eg:a: .short 0x1234

.long / .word

在儲存器中分配4個位元組,用指定的資料對儲存單元進行初始化

eg:a: .word 0x12345678

.quad

在儲存器中分配8個位元組,用指定的資料對儲存單元進行初始化

eg:a: .quad 0x12345678 ;等價於c中的long a=0x1234567812345678

.float

在儲存器中分配4個位元組,用指定的浮點資料對儲存單元進行初始化

eg:a: .float 1.11

.space /.skip

用於分配一塊連續的儲存區域並初始化為指定的值,如果後面的填充值省略不寫則在後面填充為0;

label: .space size,expr ;expr可以是4位元組(32bit)以內的浮點數

eg:a: space 8, 0x1

.string

定義乙個字串,預設是string8,還有string16,string32,string64

eg:a: .space 「hello world!」

.rpet

重複執行接下來的指令,以.rept開始,以.endr結束

eg:.rept cnt ;cnt是重複次數

….endr

流程控制偽指令主要有.if .else .endif .macro .endm .exitm

.if, .else, .endif

.if logical-expression

….elseif logical-expression2

….else

….endif

.macro, .endm, .exitm

該偽指令可以將一段**定義為乙個整體,稱為巨集指令。然後就可以在程式中通過巨集指令多次呼叫該段**;而.exitm用於退出當前巨集指令,巨集指令可以使用乙個或多個引數,當巨集操作被展開時,這些引數被相應的值替換。包含在.macro和.endm之間的指令序列稱為巨集定義體。在巨集定義體的第一行應該宣告巨集的原型,包含巨集名所需要的引數,然後就可以在匯程式設計序中通過巨集名來呼叫該指令序列。在源程式被編譯時,編譯器將巨集呼叫展開,用巨集定義中的指令序列代替程式中的巨集呼叫,並將實際引數值傳遞給巨集定義中的形式引數。

eg:.macro macroname macargs …

…code…

.endm

.align 用於使程式當前位置滿足一定的對齊方式

.section 用來定義乙個段的偽指令

.data 用來定義乙個資料段

.text 用來定義乙個**段

.include 用來包含乙個標頭檔案

.arm 定義以下**使用arm指令集編譯

.code 32 同.arm

.code 16 同.thumb

.thumb 定義以下**使用thumb指令集編譯

.extern 用於宣告乙個外部符號,用於相容性其他彙編

.weak 用於宣告乙個弱符號,如果這個符號沒有定義,編譯就忽略,而不會報錯

.end 表示彙編結束

adr把標籤所在的位址載入到暫存器中,這個指令將基於pc相對偏移的位址或基於暫存器相對偏移的位址值讀取到暫存器中。當位址是位元組對齊時,取值範圍為-255-255b;當位址是字對齊時取值範圍是-1020-1020b。該指令相當於 add , pc, offset

eg:adr

adrl

用於將中等範圍位址讀取到暫存器中

adrl

ldr裝在乙個32位的常數和乙個位址暫存器,即將乙個32位常數載入到乙個暫存器中

ldr reg, =expr

reg:目標暫存器

expr:32位常量

彙編器根據expr的取值情況對ldr偽指令會做一下處理:

ARM彙編偽指令

資料定義偽指令 彙編控制偽操作 雜項.global,local,set,equ 使得符號對聯結器可見,變為對整個工程可用的全域性變數,通俗講就是定義全域性變數 eg global symbol 給乙個全域性變數或區域性變數賦值,和.equ的功能一樣 eg set symbol expr set st...

ARM彙編偽指令

用來做注釋。可以在行首也可以在 後面同一行直接跟,和c語言中 類似 做注釋,一般放在行首,表示這一行都是注釋而不是 以冒號結尾的是標號 點號在gnu彙編中表示當前指令的位址 立即數前面要加 或 表示這是個立即數 global start 給 start外部鏈結屬性 section text 指定當前...

ARM 彙編 偽指令 MACRO及MEND

macro偽操作標識 巨集定義的開始,mend標識巨集定義的結束。用macro 及mend定義一段 稱為巨集定義體,這樣在程式中就可以通過巨集指令多次呼叫該 段 語法格式 macro macroname code code mend 其中 labelz在巨集指令被展開時,label可被替換成相應的符...