###条件
下に示すcファイルをアセンブリにしたものを考えます.
このとき,w0, w1がx29が示すアドレスから見てどの位置に格納されているのかを見ます.
8個までレジスタ経由で引数を渡すものとします.
9個目以降はスタック経由で渡します.ただし,今回は引数はふたつまでしか出てきていません.
結果はw0レジスタにセットします.
###質問内容
私の考えでは,21行目のstpは,二つのレジスタx29, x30の内容をスタックポインタ(sp)から16だけ減じたアドレスのメモリに書き込んでいるので,引数はそのx29の直下に位置するのではないかと考えていますが,あっていますでしょうか.
図的には,汎用レジスタ1がx29であり,そのすぐ下にw1, w0の順に入っていると考えています.
###cファイル
C
1sum(int a, int b) 2{ 3 return a+b; 4} 5 6main() 7{ 8 int a; 9 a= sum(1, 2); 10 put_int(a); 11} 12
###追記
tlcの実行結果
FuncTab sum #1 main #2 SymTab id(1) a #1, offset(-4) b #2, offset(-8) id(2) a #1, offset(-4) root func[ identifier(r0)(sum)] ( param(r0)( identifier(r0)(a)) param(r0)( identifier(r0)(b))) l(3): return( add(r0)( identifier(r0)(a) identifier(r1)(b))) func[ identifier(r0)(main)] () l(8): declaration( identifier(r0)(a)) l(9): stm_asign( exp_asign(r0)( identifier(r0)(a) call(r1)( identifier(r0)(sum) ( const_int(r0)(1) const_int(r0)(2))))) l(10): stm_asign( call(r0)( identifier(r0)(put_int) ( identifier(r0)(a))))
引数が9個のプログラム
C
1sum(int a, int b, int c, int d, int e, int f,int g,int h,int i) 2{ 3 return a+b+c+d+e+f+g+h+i; 4} 5 6main() 7{ 8 int a; 9 a= sum(1, 2,3,4,5,6,7,8,9); 10 put_int(a); 11} 12
1 .arch armv8-a 2 .file "nine_var.c" 3 .text 4 .align 2 5 .global sum 6 .type sum, %function 7 sum: 8 .LFB0: 9 .cfi_startproc 10 add w0, w0, w1 11 add w0, w0, w2 12 add w0, w0, w3 13 add w0, w0, w4 14 add w0, w0, w5 15 add w0, w0, w6 16 add w0, w0, w7 17 ldr w1, [sp] 18 add w0, w0, w1 19 ret 20 .cfi_endproc 21 .LFE0: 22 .size sum, .-sum 23 .align 2 24 .global main 25 .type main, %function 26 main: 27 .LFB1: 28 .cfi_startproc 29 sub sp, sp, #32 30 .cfi_def_cfa_offset 32 31 stp x29, x30, [sp, 16] 32 .cfi_offset 29, -16 33 .cfi_offset 30, -8 34 add x29, sp, 16 35 mov w0, 9 36 str w0, [sp] 37 mov w7, 8 38 mov w6, 7 39 mov w5, 6 40 mov w4, 5 41 mov w3, 4 42 mov w2, 3 43 mov w1, 2 44 mov w0, 1 45 bl sum 46 bl put_int 47 mov w0, 0 48 ldp x29, x30, [sp, 16] 49 add sp, sp, 32 50 .cfi_restore 29 51 .cfi_restore 30 52 .cfi_def_cfa_offset 0 53 ret 54 .cfi_endproc 55 .LFE1: 56 .size main, .-main 57 .ident "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0" 58 .section .note.GNU-stack,"",@progbits
これのtlcによる実行
FuncTab sum #1 main #2 SymTab id(1) a #1, offset(-12) b #2, offset(-16) c #3, offset(-20) d #4, offset(-24) e #5, offset(-28) f #6, offset(-32) g #7, offset(-36) h #8, offset(-40) i #9, offset(-8) id(2) a #1, offset(-4) root func[ identifier(r0)(sum)] ( param(r0)( identifier(r0)(a)) param(r0)( identifier(r0)(b)) param(r0)( identifier(r0)(c)) param(r0)( identifier(r0)(d)) param(r0)( identifier(r0)(e)) param(r0)( identifier(r0)(f)) param(r0)( identifier(r0)(g)) param(r0)( identifier(r0)(h)) param(r0)( identifier(r0)(i))) l(3): return( add(r0)( add(r0)( add(r0)( add(r0)( add(r0)( add(r0)( add(r0)( add(r0)( identifier(r0)(a) identifier(r1)(b)) identifier(r1)(c)) identifier(r1)(d)) identifier(r1)(e)) identifier(r1)(f)) identifier(r1)(g)) identifier(r1)(h)) identifier(r1)(i))) func[ identifier(r0)(main)] () l(8): declaration( identifier(r0)(a)) l(9): stm_asign( exp_asign(r0)( identifier(r0)(a) call(r1)( identifier(r0)(sum) ( const_int(r0)(1) const_int(r0)(2) const_int(r0)(3) const_int(r0)(4) const_int(r0)(5) const_int(r0)(6) const_int(r0)(7) const_int(r0)(8) const_int(r0)(9))))) l(10): stm_asign( call(r0)( identifier(r0)(put_int) ( identifier(r0)(a))))
回答1件
あなたの回答
tips
プレビュー