[ARM-assembly]-ARM64汇编语言学习笔记
參考<ARM 64-Bit Assembly Language.pdf>
★★★個(gè)人博客導(dǎo)讀首頁(yè)—點(diǎn)擊此處 ★★★
文章目錄
- 一、基礎(chǔ)語(yǔ)法
- 1、先看一個(gè)示例
- 2、分配和初始化全局變量
- 3、對(duì)齊aligning
- 4、函數(shù)
- 5、條件
- 6、include文件
- 7、宏Macros
- 二、指令介紹
- 1、instruction set architecture (ISA)框圖
- 2、AArch64 general registers
- 3、condition flags
- 4、Load/store
- (1)、Load/store single register
- (2)、Load/store single register (unscaled)
- (3)、Load/store pair 一次性讀寫(xiě)兩個(gè)寄存器
- 三、Branch分支
- 1、Branch
- 2、Branch to Register
- 3、Branch and link
- 4、Compare and branch
- 5、Form PC-relative address
★★★ 友情鏈接 : 個(gè)人博客導(dǎo)讀首頁(yè)—點(diǎn)擊此處 ★★★
一、基礎(chǔ)語(yǔ)法
1、先看一個(gè)示例
寫(xiě)一個(gè)簡(jiǎn)單的c語(yǔ)言程序
把它翻譯成匯編語(yǔ)言是這樣的:
把C語(yǔ)言編譯成匯編語(yǔ)言,其實(shí)是這樣的:
補(bǔ)充一下stp ldp的知識(shí):
stp ldp是雙double-word操作
- ARM64 開(kāi)始就取消了32位的 LDM,STM,PUSH,POP指令,取而代之的是str\stp、ldr\ldp
- ARM64 里面對(duì)棧的操作是16字節(jié)對(duì)齊
補(bǔ)充一下fp和sp的知識(shí):
x29是FP,x30是LR
- sp寄存器在任意時(shí)刻會(huì)保存棧頂?shù)牡刂?/li>
- fp寄存器也稱(chēng)為x29寄存器屬于通用寄存器,但是在某些時(shí)刻我們利用它保存棧底的地址
為何要保存X29 X30
- 當(dāng)此函數(shù)為葉子函數(shù)時(shí),就不需要在對(duì) x29 和 x30 寄存器的保護(hù)。 葉子函數(shù):函數(shù)里面不再調(diào)用其他函數(shù)。
- 當(dāng)函數(shù)中的參數(shù)還有其他函數(shù)的引用時(shí),需要對(duì)參數(shù)入棧,進(jìn)行保護(hù),以防引起數(shù)據(jù)錯(cuò)誤。
2、分配和初始化全局變量
(示例)
疑問(wèn): 如何定義一個(gè)未初始化的static靜態(tài)局部變量和全局變量?
語(yǔ)法格式:
.byte expressions.2byte expressions .hword expressions .short expressions.4byte expressions .word expressions .long expressions.8byte expressions .quad expressions.ascii "string" //帶'\n'.asciz "string" //不帶'\n' .string "string.float flonums .single flonums.double flonums3、對(duì)齊aligning
.align abs-expr, abs-expr, abs-expr 第一個(gè)abs-expr: 對(duì)齊的size 第二個(gè)abs-expr: 填充 第二個(gè)abs-expr: 可選,對(duì)齊應(yīng)該跳過(guò)的最大字節(jié)數(shù).balign[lw] abs-expr, abs-expr, abs-expr.skip size, fill .space size, fill 分配一大塊內(nèi)存并將其全部初始化到相同的值,可以使用這兩個(gè)指令.equ symbol, expression .set symbol, expression 宏定義,等價(jià)define.equiv symbol, expression 宏定義,如果已經(jīng)定義過(guò)了,則產(chǎn)生error.global symbol .globl symbol 聲明,聲明后,所有文件都可以使用.comm symbol, length4、函數(shù)
.size name,expression
.type name,type_description
5、條件
.if expression .ifdef symbol .ifndef symbol .else .endif6、include文件
.include "file"7、宏Macros
.macro macname .macro macname macargs ... .endm .exitm
(宏也是有遞歸宏的)
‘enum 0,5’相當(dāng)于
二、指令介紹
1、instruction set architecture (ISA)框圖
2、AArch64 general registers
General purpose registers
Frame pointer —x29
Link register —x30
Stack pointer —sp
Zero register —xzr
Program counter —pc
PSTATE register
3、condition flags
4、Load/store
(1)、Load/store single register
ldr Load Register
str Store Register
在寄存器和memory之間傳輸double-word, single word, half-word, byte
(2)、Load/store single register (unscaled)
ldur Load Register (Unscaled)
stur Store Register (Unscaled).
特點(diǎn)別ldr str多了一個(gè)u而已,offset在 [?256, 256]之間
(3)、Load/store pair 一次性讀寫(xiě)兩個(gè)寄存器
stp x29, x30, [sp, #-16]! ldp x29, x30, [sp], #16三、Branch分支
? Branch,
? Branch to Register,
? Branch and Link (subroutine call),
? Compare and Branch, and
? Form program-counter-relative Address.
1、Branch
b Branch //無(wú)條件跳轉(zhuǎn), ±128 MB范圍
b{} <target_label> //有條件跳轉(zhuǎn), ±1 MB范圍
b main
bvs overflow
2、Branch to Register
br Xn
ret {Xn}
3、Branch and link
bl <target_address>
blr Xn
其實(shí)就是在跳轉(zhuǎn)之前,先將PC+4的地址保持到X30(LR)中
4、Compare and branch
cbz Compare and Branch if Zero,
cbnz Compare and Branch if Nonzero,
tbz Test Bit and Branch if Zero, and
tbnz Test Bit and Branch if Nonzero.
cb{n}z Rt,
tb{n}z Rt, #imm6,
? The cbz and cbnz instructions have a range of ±1 MB (encoded in 19 bits).
? The range of the tbz and tbnz instructions is ±32 KB (encoded in 14 bits).
5、Form PC-relative address
adr Form PC-Relative Address
adrp Form PC-Relative Address to 4 KB Page
它比ldr Rx,=label更加啊高效,它在兩個(gè)cycle周期就可以計(jì)算這個(gè)64bit地址,無(wú)需訪問(wèn)memory
總結(jié)
以上是生活随笔為你收集整理的[ARM-assembly]-ARM64汇编语言学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux kernel的问与答
- 下一篇: linux kernel的spinloc