從彙編角度理解C語言(二) 原

下面介紹簡單的C代碼會生成怎樣的彙編。

當定義一個變量時,其類型就說明了他在內存中所佔的字節數,編譯器會生成一個符號表,用來映射變量名及變量在內存中的存儲位置。

在我們的例子中,默認int型總佔四個字節,並且不考慮變量在內存中實際位置。


例1

  int i;

  i = 6;

  i++; 


翻譯成彙編代碼可如下:

M[R1] = 6    ; assign i the value 6 

R2 = M[R1]    ; load i's value into a register

R2 = R2 + 1   ; do the addition 

M[R1] = R2    ; store new value into i  


由此可以看出一條較高層次的指令(C語言)指令往往需要幾條較低層次的指令(彙編)來解釋。所以有時候編譯器生成的彙編往往沒有手動直接寫的彙編效率高,當然聰明的編譯器可能會把如上C語言代碼直接翻譯成 M[R1] = 7;


例2

  char ch; 

  ch = 'A'; 


char 類型的變量只佔有一個字節,所以翻譯成彙編代碼如下:


M[R1] =.1 65  ; 65 is ASCII value of 'A' 


在C語言中char、 short、 int以及long都是屬於同一系列的變量,他們在內存中採樣的是同樣方式的二進制表示方式。 當把小的變量類型轉換成較大的變量類型時,是沒有什麼問題的,


例3

  char ch; 

  int i; 

  ch = 'A';

  i = ch; 

翻譯成彙編如下:

M[R1 + 4] =.1 65  ; assign ch ASCII value 'A' 

R2 =.1 M[R1 + 4]  ; load ch into R2 (upper bytes of R2 are zeroed) 

M[R1] = R2      ; assign value in R2 to i 


但是作相反的轉換有時就不這麼簡單了,如下代碼他只把i變量的代字節數據複製到ch中去,而其它的高字節都會丟棄了,


例4

  char ch; 

  int i; 

  i = 1025; 

  ch = i;  

翻譯成彙編如下:

M[R1] = 1025      ; assign i the value 1025 

R2 = M[R1]        ; load value of i into R2 

M[R1 + 4] =.1 R2    ; copy lower byte of R2 to ch 


浮點數與整型數據之間需要轉換,


例5

 { 
  int i; 
  float f; 
  f = 3.14159 
  i = f; 
}

翻譯成彙編代碼:

M[R1] = 3.14159  ; assign f the value 3.14159 

R2 = M[R1]      ; load value of f into R2 

R3 = FtoI R2    ; convert value in R2 from float to int, store in R3 

M[R1 + 4] = R3   ; copy value in R3 to i 


再次強調此彙編代碼只作示例用,還是屏蔽掉很多細節的。


再複雜點的例子如


例6

  int total, count; 

  float average; 

  average = ((float) total)/((float) count); 


假設average存存地址存於R1中,則翻譯成的彙編如下:

R2 = M[R1 + 8]   ; load value of total 

R3 = ItoF R2    ; convert int to float 

R4 = M[R1 + 4]   ; load value of count 

R5 = ItoF R4    ; convert int to float 

R6 = R3/R5      ; divide (floating point version) 

M[R1] = R6      ; store in average 

 

那對於結構體、指針等數據類型將會生成怎樣的彙編代碼呢,下一節將一一道來。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章