2015-01-08 41 views
3

CSAPP鍛鍊3.4彙編語言IA32 - 移動字符爲int

src_t v; 
dest_t *p; 

*p = (dest_t) v; 

src_tchardest_tint,答案是

movsbl %al, (%edx) 

v存儲在%eax%ax%al,p存儲在%edx)。當src_tchardest_tunsigned,答案是

movsbl %al, (%edx) 

了。

爲什麼我們不得不使用movsbl而不是movzlchar類型是非負數?

+2

這是因爲C語言標準使'char'實現的簽名性被指定和記錄。因此,類型'char'可以被簽名(並且需要符號擴展)或無符號的(並且要求零擴展)。看起來前者就是這種情況。 –

+2

char類型可以是有符號或無符號的,它取決於實現。 – didierc

回答

2

擴展指令的選擇反映了字符類型的符號。

gcc可以讓你控制字符的符號,所以你可以很容易地看到它會爲每種可能性產生什麼樣的轉換。

來源:

unsigned char_to_int(char *s) { 
    return *s; 
} 

缺省輸出:

movl 4(%esp), %eax 
movsbl (%eax), %eax 
ret 

輸出與-funsigned-char

movl 4(%esp), %eax 
movzbl (%eax), %eax 
ret 

輸出與-fsigned-char

movl 4(%esp), %eax 
movsbl (%eax), %eax 
ret 

請記住,這僅僅是一個平臺上的一個編譯器的輸出。對於不同的編譯器,或對於在不同平臺上運行的gcc,缺省簽名可能不同。