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 = 1,000 ;
12      반환 0 ;
13 }

코어에서 실행

분해 :

GCC -S t3.c -o t3.s

 

    . 파일     " t3.c " 
    .comm test_num, 4 , 4 
    는 .text 
    .globl FUNC 
    .type FUNC, @function의 
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 : 
    크기는의 FUNC. - FUNC 
    .globl 메인 
    .type 메인, @function 
주 : 
.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는 
    , 주요 크기는. - 주요 
    .ident     " GCC : (~ 14.04.4 우분투 4.8.4-2ubuntu1) 4.8.4 " 
    .section .note.GNU -stack, "" , @ progbits

주요 함수 호출 FUNC 전 :

 
    movq - 8 (RBP %)을, % RAX 
    의 movl $ (1000 %의 RAX)

; 명백한 실수는 내용의 4 바이트는 현재 이동 EBP의 내용은 ESP 지적, 사실, * P는 사본의 FUNC 기능에 대한 사용했다
: 함수 func에 호출 한 후
  , movq의 $의 test_num를 - 8 (%을 RBP)
그래서 FUNC 기능 동작은 P * 복사본은 복사가 처음 주소를 저장한다.
그것의 사본을 알고 있기 때문에 다시 메인 함수 RET 후, 변수 값 (100)이 할당되면, * P는 주요 기능은 알려지지 않았다.

원본 변경 :

1 #INCLUDE <STDIO.H>
 2  INT test_num;
3 공극 FUNC ( INT ** P)
 -4-  {
 5      * 피 = test_num;
6  }
 7  INT 본체 (공극)
 (8)  {
 도 9      의 INT *의 P;
10      FUNC ( P);
11      *의 p = 1,000 ;
12      반환 0 ;
13 }

분해 과정 :

1      . 파일     " t3.c " 
2      .comm의 test_num, 4 , 4 
(3)      는 .text
 4      .globl의 FUNC
 5      .type의 FUNC, @function
 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      크기는 용 FUNC. - FUNC
 23      .globl 주
 24      주 .type, @function
 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      크기는 주, .- 메인
 46      .ident     " GCC (우분투 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