C 언어 컴파일, ARM 아키텍처에서 분석

는 .text 
.global _start 

_start : 

    선량률 SP = 4096   

    BL 메인 

정지 : 
    B 정지
INT 의 main () 
{ 
    부호 INT * pGPFCON = (부호 의 INT *) 0x56000050 ; 
    부호 INT * pGPFDAT = (부호 의 INT *) 0x56000054 ; 


    * = pGPFCON 로 0x100 ; 

    * pGPFDAT = 0 ; 

    반환  0 ; 
}
. LED ELF :      파일 - littlearm 포맷 ELF32 

이동 섹션의 분해. 텍스트 : 

00000000 <_start>
    0 : e3a0da01의      MOV의     SP, # 4096     ; 가 0x1000 // 4096 스택 설정 
   4. : BL의 eb000000 C // 이동 <주> 주요 기능 수행 

00000008 <HALT을>
    . 8 : B의 eafffffe     . 8 <HALT> 

0000000c <주> :
    C :     e1a0c00d      MOV     IP // 과제로 SP의 SP 값 = IP 4096 
  10 ! e92dd800의 STMDB SP는 {FP, IP, LR , PC} // PC가 R15의 LR 인 R14의 IP는 R11입니다 R12 FP이다 
                                    값 // 제 환원 SP 4, SP = 4092 및 4096-4093에 규정 된 메모리에 PC의 값을 
                                    다음 4 // 4088 SP 값을 저장 한 후, LR의 값은 4092-4089 배치 메모리를 참조 
                                    // SP 값 후 4084 4로 감소하고 메모리에 IP 값은 4088-4085 함 
                                    4 @ 다음 SP 값 (4080), 행 4083로 IP의 다음 값을 감소 메모리 (4080)이라 
               // 상기 명령어는 메인 레지스터 호출하기 전에 저장하는 것이 필요하다 



                                                    
  (14) : e24cb004      서브     FP, IP # 4.     , 0x4로 // IP-FP 4 = 4092 =.       
  18 인 : e24dd008의      하위     SP, SP를 # . 8     ] 을 0x8 = 4 // SP = SP-4072. 
  
  1. C :     e3a03456의      MOV    R3, # 1442840576     ; 0x56000000 0x56000000 // R3로, 
  20은 : e2833050      추가     R3, R3, # 80     , 0 × 50 // R3의 값에 80을 추가된다 0x56000050 
  24 : e50b3010      STR     R3, [FP, # - 16 ] 에서 [0x56000050로 // 4076 ] 제 로컬 변수 
  
  28 e3a03456의 :      MOV의     R3, # 1442840576     ; 에서 0x56000000 // R3 상 0x56000000 
  2 C :     e2833054      추가     R3를, R3, # 84     ; 0x54 // R3의 값 플러스 84 0x56000054하게 
  30 : e50b3014의      STR의     R3, [FP, # -20 ]을 [0x56000050로 // 4072 ] 제 로컬 변수 
   
  (34)는 : e51b2010 LDR R2, [FP, # - 16 ] // 메모리 [에 4076 가치] R2 들어갈 0x56000050
   38 : e3a03c01      MOV     R3, # 256     ; 로 0x100             
  3. : C     e5823000      STR     R3은 [R2]를 메모리에 0x100에서 [0x56000050]를 물품 // 
  
  40 - e51b2014 LDR R2, [FP는 번호 : 20 인 // 메모리 [] 4072 값 0x56000054이]는 들어갈 R2
   (44)는 : e3a03000      MOV     R3, # 0     ; 0x0으로                 
  48 : e5823000      STR     R3은 [R2]를 메모리에이 0x0 [0x56000054]를 물품 // 
  
  4. C가 :     e3a03000      MOV     R3, # 0     ; 0x0으로                   
  50 : e1a00003      MOV     의 R0는 R3 
  
  (54)는 : e24bd00c의      서브     SP (FP)는, # 12이다     ] 에서 0xc // FP-12 SP = 4092-12 = 4080 = 
  58 : LDMIA의 e89da800의 SP {FP, SP, PC} // FP로 4083에 메모리 (4080)의 첫 번째 값, 메모리 4084에서 4087의 SP = SP에 4096 
                                                      // 마지막 주 함수 호출이 완료되는 PC, 4088-4091에 값
                                                      //이 LR 후의 다음 명령의 어드레스를 호출하기 전에 레지스터 
                                                     
  
  
이동 섹션의 분해한다. 코멘트 : 

00000000 <.comment>
    0 :     43,434,700      cmpmi R3, # 0     ; 0x0으로 
   4. : 47,282 03A      정의
    8. 2 029554e      eorcs R5, R9 , LR, ASR # 10 
   C :     2e342e33 mrccs     14 , . 1 , R2, CR4, CR3, { 1. }
   10 : 주소 0x10으로는 OUT 경계.

 

추천

출처www.cnblogs.com/tian1996/p/11618547.html