例えば
1つの#include <stdio.hの> 2 INT test_num。 3ボイドFUNC(int型 *のP) 4 { 5 p =&test_num。 6 } 7 INT メイン(ボイド) 8 { 9 のint *のP。 10 FUNC(P)。 11 * pを= 1000年。 12 リターン0 ; 13 }
コアを使い果たし
分解:
gccの-S t3.c -o t3.s
。ファイル " t3.c " .comm test_num、4、4 の.text .globl FUNC .TYPE FUNC、@関数 FUNC: .LFB0: .cfi_startproc pushq %RBP .cfi_def_cfa_offset 16 .cfi_offset 6、 - 16 MOVQ %のRSPは、%RBP 。 cfi_def_cfa_register 6 MOVQの %のRDI、 - 24(%のRBP) MOVQ $ test_num、 - 8(%のRBP) popq %RBP .cfi_def_cfa 7、8 RET .cfi_endproc .LFE0: .sizeのFUNC、。- FUNC .globl主 .TYPEメイン、@関数 メイン: .LFB1: .cfi_startproc pushq %RBP .cfi_def_cfa_offset 16 .cfi_offset 6、 - 16 MOVQ %RSP、%RBP .cfi_def_cfa_register 6 SUBQ $ 16%のRSP MOVQ - 8(% RBP)、%のRAX MOVQ %のRAX、%RDI FUNC呼び出し MOVQ - 8%、(%のRBP)RAX MOVL $ 1000、(%のRAX)は $ MOVL 0%、eaxに 残し .cfi_def_cfa 7、8 RET .cfi_endproc :.LFE1 、メイン.sizeを。- メイン .ident " GCC:(Ubuntuの4.8.4-2ubuntu1〜14.04.4)4.8.4 " .SECTION .note.GNU -stack、""、PROGBITS @
メイン関数呼び出しFUNC前:
MOVQ - 8(RBP%)、%RAX
MOVL $ 1000(%のRAX)
明らかな間違い、EBPの内容内容の4つのバイトは、現在、ESP、FUNC機能のための使用を* pのコピーを作成し、実際には、指摘に移動し、
関数funcを呼び出した後:
MOVQ $ test_num、 - 8(%RBP)
ので、FUNC機能の操作のみ* p個のコピー、コピーは最初のアドレスを格納します。
それのコピーだけが知っているので、戻って、main関数にRET後、変数に値100を割り当てられ、* pの主な機能は、知られていません。
ソースを変更します。
1つの#include <stdio.hの> 2 INT test_num。 3ボイドFUNC(INT ** P) 4 { 5 *はP =&test_num。 6 } 7 INT メイン(ボイド) 8 { 9 のint *のP。 10 FUNC(&P)。 11 * pを= 1000年。 12 リターン0 ; 13 }
分解プロセス:
1 。ファイル " t3.c " 2 .commのtest_num、4、4 3 の.text 4 .globl FUNC 5 .TYPEのFUNC、@関数 6 FUNC: 7 .LFB0: 8 .cfi_startproc 9 pushq%以下のRBP 10 .cfi_def_cfa_offset 16 11 .cfi_offset 6、 - 16 12 MOVQ%RSP%のRBP 13 .cfi_def_cfa_register 6 14 MOVQ%のRDI、 -8(%のRBP) 15 MOVQ - 8(%のRBP)、%RAX 16 MOVQ $ test_num、(%のRAX) 17 popq%のRBP 18 .cfi_def_cfa 7、8 19 RET 20 .cfi_endproc 21 .LFE0: 22 .sizeのFUNC、。 - FUNC 23 .globlメイン 24 メイン.TYPE、@関数 25 メイン: 26 .LFB1: 27 .cfi_startproc 28 pushq%以下のRBP 29 .cfi_def_cfa_offset 16 30 .cfi_offset 6 - 16 31 MOVQ%RSP%のRBP 32 .cfi_def_cfa_register 6 33 SUBQ $ 16、%RSP 34 leaq - 8(RBPの%)、%参照 35 フィット見MOVQ%を、%RDI 36 コールFUNC 37 MOVQ - 8(RBPの%)、%参照 38 MOVL $ 1000(%は、参照A) 39 MOVL $ 0、%eaxに 40は 去る 41 .cfi_def_cfa 7、8 42 RET 43 .cfi_endproc 44 .LFE1: 45 .sizeメイン、.- 主 46 .ident " GCC(Ubuntuの4.8.4-2ubuntu1〜14.04.4)4.8.4 " 47 .SECTION .note.GNUスタック、""、@ PROGBITS
私たちは、変更がある見ることができます
言い換えれば、EBPのコンテンツの利用のためにコピー関数funcとして次の4つのバイトではなく、アドレスの内容は、(すなわちミアン機能* pをアドレス)を指摘しました。