下面介紹簡單的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
那對於結構體、指針等數據類型將會生成怎樣的彙編代碼呢,下一節將一一道來。