日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[ARM-assembly]-ARM64汇编语言学习笔记

發布時間:2025/3/21 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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 flonums

3、對齊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, length

4、函數

.size name,expression

.type name,type_description

5、條件

.if expression .ifdef symbol .ifndef symbol .else .endif

6、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

語法: <op>{<size>} Rd, <addr> The op are: b unsigned byte h unsigned half-word sb signed byte sh signed half-word sw signed word 示例: ldr w8, [x4] strb x12, [x2] ldr x5, [x3, #7]! 前變址尋址 strh w9, [x6], #7 后變址尋址 ldrsh x5, [x0, 8] strb w1, [x9] ldrsh x5, [x0, 8] strb w1, [x9]
(2)、Load/store single register (unscaled)

ldur Load Register (Unscaled)
stur Store Register (Unscaled).
特點別ldr str多了一個u而已,offset在 [?256, 256]之間

語法: <op>{<size>} Rd, [Xn, #imm9] The op are: b unsigned byte h unsigned half-word sb signed byte sh signed half-word sw signed word 示例: ldursb x4, [x5, #255] stur x1, [x2, #-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汇编语言学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。