예를 들면
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는 주소)을 지적했다.