ARM GNU 匯編偽指令簡介
- 匯編指令語句
每一條指令語句在源程序匯編時(shí)都要產(chǎn)生可供計(jì)算機(jī)執(zhí)行的指令代碼(即目標(biāo)代碼),所以這種語句又叫可執(zhí)行語句。每一條指令語句表示計(jì)算機(jī)具有的一個(gè)基本能力,如數(shù)據(jù)傳送,兩數(shù)相加或相減,移位等,而這種能力是在目標(biāo)程序(指令代碼的有序集合)運(yùn)行時(shí)完成的,是依賴于汁算機(jī)內(nèi)的中央處理器(CPU)、存儲(chǔ)器、I/O接口等硬件設(shè)備來實(shí)現(xiàn)的。 - 匯編偽指令語句
偽指令語句是用于指示匯編程序如何匯編源程序,所以這種語句又叫命令語句。例如源程序中的偽指令語句告訴匯編程序:該源程序如何分段,有哪些邏輯段在程序段中哪些是當(dāng)前段,它們分別由哪個(gè)段寄存器指向;定義了哪些數(shù)據(jù),存儲(chǔ)單元是如何分配的等等。偽指令語句除定義的具體數(shù)據(jù)要生成目標(biāo)代碼外,其他均沒有對應(yīng)的目標(biāo)代碼。偽指令語句的這些命令功能是由匯編程序在匯編源程序時(shí),通過執(zhí)行一段程序來完成的,而不是在運(yùn)行目標(biāo)程序時(shí)實(shí)現(xiàn)的。 - 匯編偽指令的作用
二 .ARM GNU 匯編偽指令簡介
本文引用地址:http://butianyuan.cn/article/201611/319130.htm
(1)abort
.abort 停止匯編
(2)align
.align absexpr1,absexpr2
以某種對齊方式,在未使用的存儲(chǔ)區(qū)域填充值. 第一個(gè)值表示對齊方式,4, 8,16或32. 第二個(gè)表達(dá)式值表示填充的值.
(3)if...else...endif
.if
.else
.endif: 支持條件預(yù)編譯
(4)include
.include "file": 包含指定的頭文件, 可以把一個(gè)匯編常量定義放在頭文件中
(5)comm
.comm symbol, length:
在bss段申請一段命名空間,該段空間的名稱叫symbol, 長度為length. Ld連接器在連接
會(huì)為它留出空間
(6)data
.data subsection: 說明接下來的定義歸屬于subsection數(shù)據(jù)段
(7)equ
.equ symbol, expression: 把某一個(gè)符號(symbol)定義成某一個(gè)值(expression).該
指令并不分配空間
(8)global
.global symbol: 定義一個(gè)全局符號, 通常是為ld使用
(9)ascii
.ascii "string": 定義一個(gè)字符串并為之分配空間
(10)byte
.byte expressions: 定義一個(gè)字節(jié), 并為之分配空間
(11)short
.short expressions: 定義一個(gè)短整型, 并為之分配空間
(12)int
.int expressions: 定義一個(gè)整型,并為之分配空間
(13)long
.long expressions: 定義一個(gè)長整型, 并為之分配空間
(14)word
.word expressions: 定義一個(gè)字,并為之分配空間, 4 bytes
(15)macro/endm
.macro: 定義一段宏代碼, .macro表示代碼的開始, .endm表示代碼的結(jié)束, .exitm
跳出宏, 示例如下:
.macro SHIFTLEFT a, b
.if /b < 0
mov /a, /a, ASR #-/b
.exitm
.endif
mov /a, /a, LSL #/b
.endm
(16)req
name .req register name: 為寄存器定義一個(gè)別名
(17)code
.code [16|32]: 指定指令代碼產(chǎn)生的長度, 16表示Thumb指令, 32表示ARM指令
(18)ltorg
.ltorg: 表示當(dāng)前往下的定義在歸于當(dāng)前段,并為之分配空間
注:PC寄存器長轉(zhuǎn)移
三.ARM GNU專有符號
(1)@ 表示注釋從當(dāng)前位置到行尾的字符.
(2)# 注釋掉一整行.
(3); 新行分隔符.
四. 操作碼
(1)NOP: nop 空操作, 相當(dāng)于MOV r0, r0
(2)LDR: ldr
(3)ADR: adr
評論