[ARM-assembly]-ARM64汇编语言学习笔记
參考<ARM 64-Bit Assembly Language.pdf>
★★★個人博客導讀首頁—點擊此處 ★★★
文章目錄
- 一、基礎語法
- 1、先看一個示例
- 2、分配和初始化全局變量
- 3、對齊aligning
- 4、函數
- 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 一次性讀寫兩個寄存器
- 三、Branch分支
- 1、Branch
- 2、Branch to Register
- 3、Branch and link
- 4、Compare and branch
- 5、Form PC-relative address
★★★ 友情鏈接 : 個人博客導讀首頁—點擊此處 ★★★
一、基礎語法
1、先看一個示例
寫一個簡單的c語言程序
把它翻譯成匯編語言是這樣的:
把C語言編譯成匯編語言,其實是這樣的:
補充一下stp ldp的知識:
stp ldp是雙double-word操作
- ARM64 開始就取消了32位的 LDM,STM,PUSH,POP指令,取而代之的是str\stp、ldr\ldp
- ARM64 里面對棧的操作是16字節對齊
補充一下fp和sp的知識:
x29是FP,x30是LR
- sp寄存器在任意時刻會保存棧頂的地址
- fp寄存器也稱為x29寄存器屬于通用寄存器,但是在某些時刻我們利用它保存棧底的地址
為何要保存X29 X30
- 當此函數為葉子函數時,就不需要在對 x29 和 x30 寄存器的保護。 葉子函數:函數里面不再調用其他函數。
- 當函數中的參數還有其他函數的引用時,需要對參數入棧,進行保護,以防引起數據錯誤。
2、分配和初始化全局變量
(示例)
疑問: 如何定義一個未初始化的static靜態局部變量和全局變量?
語法格式:
.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、對齊aligning
.align abs-expr, abs-expr, abs-expr 第一個abs-expr: 對齊的size 第二個abs-expr: 填充 第二個abs-expr: 可選,對齊應該跳過的最大字節數.balign[lw] abs-expr, abs-expr, abs-expr.skip size, fill .space size, fill 分配一大塊內存并將其全部初始化到相同的值,可以使用這兩個指令.equ symbol, expression .set symbol, expression 宏定義,等價define.equiv symbol, expression 宏定義,如果已經定義過了,則產生error.global symbol .globl symbol 聲明,聲明后,所有文件都可以使用.comm symbol, length4、函數
.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’相當于
二、指令介紹
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).
特點別ldr str多了一個u而已,offset在 [?256, 256]之間
(3)、Load/store pair 一次性讀寫兩個寄存器
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 //無條件跳轉, ±128 MB范圍
b{} <target_label> //有條件跳轉, ±1 MB范圍
b main
bvs overflow
2、Branch to Register
br Xn
ret {Xn}
3、Branch and link
bl <target_address>
blr Xn
其實就是在跳轉之前,先將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更加啊高效,它在兩個cycle周期就可以計算這個64bit地址,無需訪問memory
總結
以上是生活随笔為你收集整理的[ARM-assembly]-ARM64汇编语言学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux kernel的问与答
- 下一篇: [ARM-assembly]-A64的l