關于 ARM64 匯編:調用流程與棧幀結構解析

一、ARM64 函數調用分析(匯編級)

寄存器規則(AArch64 ABI)

用途寄存器
參數傳遞x0 ~ x7
返回值x0(最多兩個:x0、x1)
棧指針sp
鏈接寄存器x30(lr)
幀指針x29(fp)
臨時/通用寄存器x9~x15等

函數調用指令流程

bl target_func     ; 跳轉并將返回地址保存到 x30(link register)
ret                ; 返回上一級,等價于 br x30

舉例

mov x0, #2
mov x1, #3
bl  add_func        ; 調用 add_func(2, 3)

二、棧幀結構詳解

每個函數調用會建立自己的“棧幀”,用于:

  • 保存 caller 的寄存器(尤其是 x29, x30)

  • 為局部變量騰出空間

  • 管理多層調用時的上下文切換

標準函數前后結構

函數入口

stp x29, x30, [sp, #-16]!    ; 保存 fp 和 lr,棧頂向下擴展 16 字節
mov x29, sp                  ; 新幀指針 = 當前棧頂

函數返回

ldp x29, x30, [sp], #16      ; 恢復幀指針和返回地址
ret                          ; 返回上一層

示例完整函數

func:stp x29, x30, [sp, #-16]!    ; 建棧幀mov x29, sp// 函數體ldp x29, x30, [sp], #16      ; 恢復ret

三、棧幀結構圖解(棧向下增長)

高地址 ↑
───────────────上一幀 fp      ← x29返回地址(lr) ← x30
───────────────局部變量區參數傳遞區(x8+)
───────────────當前 sp(棧底)
低地址 ↓

分析技巧:

  • IDA 里找 stp x29, x30, [sp,#-xxx]! 是函數入口特征

  • 棧幀大小往往是 16 的倍數(對齊)


四、系統調用實現(Linux syscall in ARM64)

在裸匯編中實現 syscall 需要:

  • 把 syscall 參數放入 x0~x5

  • 把 syscall 編號放入 x8

  • 執行 svc #0 發起系統調用

系統調用號對照

功能syscall 號
write64
read63
openat56
mmap222
exit93

示例:調用 write 輸出字符串

匯編代碼(寫到 stdout)

.global _start.section .data
msg:    .ascii "Hello ARM64!\n"
len = . - msg.section .text
_start:mov x0, #1              // stdoutldr x1, =msg            // buf addressmov x2, #12             // lengthmov x8, #64             // syscall number: writesvc #0                  // trigger syscall// exit(0)mov x0, #0mov x8, #93             // syscall number: exitsvc #0

編譯運行方式(Linux ARM64 模擬器或真機)

aarch64-linux-gnu-as hello.s -o hello.o
aarch64-linux-gnu-ld hello.o -o hello
qemu-aarch64 ./hello

五、逆向視角:系統調用識別

在 IDA 中看到以下指令,基本可以確認是系統調用:

mov x8, #64       ; syscall 編號
svc #0            ; 系統調用

結合調用前的 mov x0, #1, ldr x1, =addr, mov x2, #len 可以還原 syscall 是寫 stdout。

匯總圖(函數調用 → 棧幀 → syscall)

main:stp x29, x30, [sp, #-16]!      // 保存mov x29, spmov x0, #1                     // arg0: stdoutldr x1, =msg                   // arg1: buffer addrmov x2, #13                    // arg2: lengthmov x8, #64                    // syscall writesvc #0                         // 發起調用ldp x29, x30, [sp], #16        // 恢復ret

六、總結

內容關鍵點
調用規則x0~x7 傳參,x30 返回地址
棧幀結構使用 x29 做幀指針,函數內局部變量/保存寄存器都存在棧
系統調用x0~x5 參數, x8 syscall 號, svc #0 觸發
IDA/Ghidra逆向stp/ldp, bl, svc 判斷函數入口、調用、syscall
實戰環境用 qemu + aarch64 工具鏈模擬也能練習

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86268.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka vs RabbitMQ vs Redis:消息中間件全面對比與選型指南

Kafka vs RabbitMQ vs Redis:消息中間件全面對比與選型指南 一、各中間件消息流轉全過程Kafka 消息流轉全過程(含機制詳解)1. 核心組件2. 流程詳解 RabbitMQ 消息流轉全過程(含機制詳解)1. 核心組件2. 流程詳解 Redis …

【代碼級指南】從Zero-shot到Chain-of-Thought:Prompt工程全棧技術解析?

本文較長,建議點贊收藏,以免遺失。 從理論到實踐,掌握Zero-shot/Few-shot Prompt設計精髓。 一、Prompt Engineering 核心概念圖解 Prompt Engineering 三大支柱 二、Prompt 設計基礎框架 1. Prompt 核心四要素 prompt_template "&q…

sizeof()函數無法計算形參指針指向的字符串大小

給定的代碼中&#xff0c;func() 函數打印的 name_len 是 指針的大小&#xff0c;而不是字符串的長度。具體原因如下&#xff1a; 代碼分析 #include <stdio.h> #include <string.h>void func(char *name) {printf("name_len:%d", sizeof(name)); // 打…

Python打卡:Day37

知識點回顧&#xff1a; 過擬合的判斷&#xff1a;測試集和訓練集同步打印指標模型的保存和加載 僅保存權重保存權重和模型保存全部信息checkpoint&#xff0c;還包含訓練狀態 早停策略 浙大疏錦行

Android 9.0(API 28)后字重設置

在 Android 應用中設置字體字重&#xff08;Font Weight&#xff09;可以通過多種方式實現&#xff0c;下面詳細介紹各種方法及其適用場景。 1. 使用 XML 屬性設置字重 1.1 基本字重設置&#xff08;API 1&#xff09; <TextViewandroid:layout_width"wrap_content&…

WebRTC(十):RTP和SRTP

RTP&#xff08;Real-time Transport Protocol&#xff09; 作用 RTP 用于傳輸實時媒體流&#xff08;如音頻、視頻&#xff09;&#xff0c;它不提供可靠傳輸&#xff0c;而是關注低延遲、高實時性。 報文結構 整體結構 RTP 報文由以下部分組成&#xff1a; RTP Header …

微服務架構下面臨的安全、合規審計挑戰

微服務架構在帶來敏捷性、可擴展性等優勢的同時&#xff0c;也給安全和合規審計帶來了巨大的挑戰。這些挑戰主要源于微服務的 分布式特性、動態性以及數量龐大 等特點。 以下是微服務架構下安全和合規審計面臨的具體挑戰 一、安全審計挑戰 1. 攻擊面擴大和復雜性增加 服務數…

顯卡等驅動程序的介紹與安裝

文章目錄 1. 什么是驅動程序2. 電腦的驅動程序有哪些3. 電腦的驅動程序的安裝4. 獨立顯卡驅動程序的安裝5. 現代化驅動程序的安裝6. 驅動程序既然這么重要&#xff0c;為什么我不都下一遍呢&#xff1f; 1. 什么是驅動程序 假設我們現在成功組裝了一臺臺式機&#xff0c;那我們…

【Python】高光譜數據分析

特征提取 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cross_decomposition import PLSRegression from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression# 設置matplotlib支持中文…

nt!CcGetVirtualAddressIfMapped函數中的nt!CcGetVacbLargeOffset函數分析--重要

第一部分&#xff1a; 1: kd> kc # 00 nt!CcGetVirtualAddressIfMapped 01 nt!CcFlushCache 02 Ntfs!LfsFlushLfcb 03 Ntfs!LfsFlushToLsnPriv 04 Ntfs!LfsWriteLfsRestart 05 Ntfs!LfsWriteRestartArea 06 Ntfs!NtfsCheckpointVolume 07 Ntfs!NtfsCheckpointAllVolumes 0…

K8s入門指南:架構解析濃縮版與服務間調用實戰演示

目錄 前言一、k8s概念理解1、k8s整體架構&#xff08;1&#xff09; Master 主節點&#xff08;2&#xff09; Node 工作節點&#xff08;3&#xff09; Etcd 鍵值存儲數據庫 &#xff12;、Pod被視為最小的部署單元&#xff13;、k8s的五種控制器類型&#xff08;1&#xff09…

【ubuntu下小工具】Crontab定時任務進行數據備份和清理

背景 在生產環境的深度學習項目中&#xff0c;系統每日會持續生成大量數據。如果不進行有效管理&#xff0c;隨著時間的推移&#xff0c;磁盤空間將被占滿&#xff0c;最終導致服務器癱瘓。 為解決這一問題&#xff0c;需設置一個定時任務去執行腳本&#xff0c;用以完成&#…

3dgs涉及的基本概念:球諧系數(SH 系數)等

1.球諧系數&#xff08;SH 系數&#xff09; ──────────────────────────────────────── 1.1 什么是球諧函數 (Spherical Harmonics&#xff0c;縮寫為 SH) 球諧函數是一組定義在單位球面上的一組正交函數&#xff0c;類似于在二維平…

sql格式化自動識別SQL語法結構

一、安裝包 PoorMansTSqlFormatterLib 二、代碼實現 using Microsoft.AspNetCore.Mvc; using PoorMansTSqlFormatterLib.Formatters; using PoorMansTSqlFormatterLib.Parsers; using PoorMansTSqlFormatterLib.Tokenizers;namespace SaaS.OfficialWebSite.Web.Controllers …

LVS-DR負載均衡群集深度實踐:高性能架構設計與排障指南

目錄 一、核心原理與理論 二、背景與架構設計 三、全流程部署步驟 1. NFS共享存儲配置&#xff08;192.168.7.100&#xff09; 2. Real Server節點配置&#xff08;四臺服務器&#xff09; 3. Director服務器配置 四、常見問題解決方案 五、生產環境總結 拓撲示意圖&am…

Hall 定理學習筆記

定義 對于一張二分圖 G ( V , E ) G(V,E) G(V,E)&#xff0c;設其左右部點集分別為 V L , V R V_L,V_R VL?,VR?&#xff0c;不妨認為 ( ∣ V L ∣ ≤ ∣ V R ∣ ) (|V_L|\leq |V_R|) (∣VL?∣≤∣VR?∣)&#xff0c;定義該二分圖的一組 完備匹配 為左部 ∣ V L ∣ |V…

使用jmeter進行websocket連接測試

一、WebSocket Sampler 插件安裝 下載地址&#xff1a;http://download.csdn.net/detail/easternunbeaten/9753723 下載后&#xff0c;解壓直接拷貝到Jmeter的lib下的ext文件夾里面,重啟Jmeter&#xff0c;Sanpler下多一個Websocket選項 二、WebSocket 取樣器字段介紹 1、W…

網絡安全漏洞掃描是什么?如何識別目標進行掃描?

&#xff0c;現在大家對于網絡安全漏洞掃描那可是相當在意這網絡安全&#xff0c;如今在咱這個大時代里可是相當重要的一個事咧&#xff01;因為&#xff0c;隨著互聯網蹭蹭地發展&#xff0c;網絡攻擊還有數據泄露這類威脅那真是越來越多越來越大&#xff01; 咱先來說說啥叫…

NoSQL之Redis配置優化

NoSQL之Redis配置優化 一、Redis1.關系數據庫與非關系型數據庫關系型數據庫非關系型數據庫非關系型數據庫產生背景 2.Redis基礎Redis簡介Redis安裝部署配置參數 3.Redis命令工具redis-cli命令行工具redis-benchmark 測試工具 4.Redis數據庫常用命令key相關命令(1)keys&#xff…

《HTTP權威指南》 第14章 安全HTTP

安全HTTP需要提供的功能&#xff1a; 服務器認證客戶端認證完整性加密效率普適性管理的可擴展性適應性在社會上的可行性 HTTPS HTTPS方案的URL以https://開頭&#xff0c;區別于https://。 HTTPS在HTTP的基礎上使用SSL或者TLS&#xff08;傳輸層安全&#xff09;進行加密。 …