一、有個函式有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 和...