C言語のコンパイル、ARMアーキテクチャの下で分析

.textの
.GLOBAL _start 

_start:

    LDR属、= 4096   

    BLメイン

停止:
    B停止
INT ()は、メイン
{ 
    符号なし整数 * pGPFCON =(符号なし整数 *)0x56000050 
    符号なし整数 * pGPFDAT =(符号なし整数 *)0x56000054 ; 


    * pGPFCON = 0x100を

    * pGPFDAT = 0 ; 

    リターン 0 ; 
}
LED。ELF:     ファイル・littlearm形式ELF32 

sectionTopの分解。テキスト:

00000000 <_start>:
    0:e3a0da01の      MOVの     SP、#4096     ; 4096にスタックを設定0x1000番地// 
   。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メモリへとPCの値が4096から4093で言及
                                    した後、4 // SP値4088を保存し、その後、LRの値が4092から4089を配置メモリを指す
                                    // SP値、その後4084 4まで減少し、その後メモリにIPの値が4088から4085を呼ぶ
                                    4 @その後に4083にSP値4080、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     ; 0x50を// 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     ; R3のが0x54 //値をプラス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] //メモリに[0x56000054]は0x0を書き込む
  
  4。C:     e3a03000      MOV     R3、#0     0x0の                   
  50:e1a00003      MOV     R3、のR0 
  
  54である:e24bd00cの      サブ     SP、FP、#12であります    ; から0xC // FP-12であり、SP = 4092から12 = 4080 = 
  58:LDMIAのe89da800のSP、{FP、SP、PC} // FPへ4083にメモリ4080内の最初の値、及び4087のメモリ4084 SP、SP = 4096 
                                                      //最後に、メイン関数呼び出しが終了しているPCに4088から4091まで値、
                                                      //そこLR後の次の命令のアドレスを呼び出す前に、登録
                                                     
  
  
sectionTopの分解を。コメント:

00000000 <.comment>:
    043434700      cmpmi R3、#0     ; 0x0の
   4。:47282 03A      未定義
    8。:2 029554e      eorcs R5、R9 、LR、ASR#10 
   C:     2e342e33 mrccs     141、R2、CR4、CR3、{ 1 }
   10:アドレス0x10のはIS OUT境界の。

 

おすすめ

転載: www.cnblogs.com/tian1996/p/11618547.html