C言語のポインタ参照学習

例えば

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、44 
    の.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 78 
    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 78 
    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、44 
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 78 
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 78 
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をアドレス)を指摘しました。

 

おすすめ

転載: www.cnblogs.com/mysky007/p/11257273.html