AAPCS 學習課後練習 通過乙個小例子來講解

2021-07-08 20:30:33 字數 2539 閱讀 9763

一、有個函式有10個引數,請問是引數是如何傳遞的?請畫出壓棧圖(32位 / 64位).

<1> 首先看arm32 

。編寫 test.c

#include int func(int v1, int v2, int v3, int v4, 

int v5, int v6, int v7, int v8,

int v9, int *p1)

int main( int argc, char **argv)

。編寫android.mk

local_path := $(call my-dir)

include $(clear_vars)

local_cflags += -g3 -o0 #取消gcc優化

local_src_files := test.c

local_module := test

include $(build_executable)

。mmm  編譯:

install: out/target/product/$/symbol/system/bin/test

。使用objdump工具解開test:

./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-objdump -s out/target/product/$/symbols/system/bin/test >vendor/test/test-arm32.s

#include 00000398 :

int func(int v1, int v2, int v3, int v4,

int v5, int v6, int v7, int v8,

int v9, int *p1)

3fa: 4618 mov r0, r3 //計算結果儲存到r0,作為子程式返回值

3fc: b006 add sp, #24 //恢復sp指標

3fe: 4770 bx lr //返回main函式

00000400 :

int main( int argc, char **argv)

43e: 4618 mov r0, r3 //main函式返回值儲存在r0

440: b00b add sp, #44 ; 0x2c //恢復sp指標,回到【圖1】

442: f85d fb04 ldr.w pc, [sp], #4 //從lr(base+4)恢復pc指標

446: bf00 nop

。v1-v4使用r0-r3直接傳入子程式

。v5-p1使用壓棧方式傳入,子程式結果返回值存於r0

。區域性變數壓棧儲存,需要使用時候再從棧彈出

壓棧圖

<1> 再看 

arm64

。在64位環境編譯test.c, 使用objdump工具解開test

(mmm vendor/test/;aarch64-linux-android-objdump -s out/target/product/p6601/symbols/system/bin/test >vendor/test/test-arm64.s

0000000000000628 :               //子程式分析和arm32類似,此處省略100字...

#include int func(int v1, int v2, int v3, int v4,

int v5, int v6, int v7, int v8,

int v9, int *p1)

6fc: 9100c3ff add sp, sp, #0x30

700: d65f03c0 ret

0000000000000704 :

int main( int argc, char **argv)

770: d10043bf sub sp, x29, #0x10

774: a9417bfd ldp x29, x30, [sp,#16] // 恢復x29,x30,sp

778: 910103ff add sp, sp, #0x40

77c: d65f03c0 ret

。v0-v7直接使用x0-x7傳遞,其它引數使用壓棧傳遞.

。區域性變數也是壓棧儲存,需要使用的時再從棧中取出.

。子程式返回值存於x0(w0)中.

壓棧圖:

課後練習一

psp2.1 personal software process stages 預估耗時 分鐘 實際耗時 分鐘 planning 計畫30 45 estimate 估計這個任務需要多少時間 3045 development 開發570 630 analysis 需求分析 包括學習新技術 60 des...

IOS學習 課後練習6

6.設計乙個類circle,用來表示二維平面中的圓 1 屬性 double radius 半徑 point2d point 圓心 2 方法 屬性相應的set和get方法 設計乙個物件判斷跟其他圓是否重疊 重疊返回yes,否則返回no 設計乙個類方法判斷兩個圓是否重疊 重疊返回yes,否則返回no i...

Python學習 課後練習整理 二

本學習的課程python程式設計的練習在拼題a上完成,為了記錄學習過程,對課後練習進行整理 1.使用函式求特殊a串數列和 30 分 給定兩個均不超過9的正整數a和n,要求編寫函式fn a,n 求a aa aaa aa aa n個a 之和,fn須返回的是數列和 函式介面定義 fn a,n 其中 a 和...