2017-01-01 117 views
2

如果我mov, eax 12345及更高版本mov var, eax(假設var是一個32位int等..等等),並輸出var它會輸出正確。爲什麼我可以mov進入eax,進入ax,但不進入al,甚至可能進入ah?

ax相同。 mov ax, 65535 - >mov var16, ax會正確輸出。

但是,如果我moval甚至ah它不會輸出任何東西。

也許搬到ah不起作用是有道理的。但爲什麼這兩個?

typedef int int32; 
typedef unsigned char int8; 
typedef short int16; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int8 c1 = 0; 
    int8 c2 = 0; 
    __asm 
    { 
     mov al, 255 
     mov c1, al 
    } 

    cout << c1 << endl; //outputs nothing, same if I used ah 

    //whereas 

    int32 n = 0; 
    __asm 
    { 
     mov eax, 10000 
     mov n, eax 
    } 

    cout << n << endl; // works fine, well, you get the picture 

    return 0; 
} 
+4

8位無符號字節的最大值爲255(基於零)。 –

+1

請注意256對於8位變量來說太大了。 – fuz

+0

「AX」有相同的範圍錯誤。一個'WORD'的範圍是0..65535和_not_ 65536. – zx485

回答

4

這個問題不是(僅)與y我們的彙編代碼,這是您打印值的方式:

cout << c1 << endl; 

即使C1是無符號的字符(又名UINT8),C++輸入輸出流對待它,他們對待一個普通的字符以同樣的方式。換句話說,該代碼大致相當於:

printf("%c\n", c1); 

只需將其轉換爲無符號整型,它應該可以正常工作。

順便說一句,在某些平臺(例如Linux PowerPC)上,普通字符實際上是無符號的。

+1

將'cout'作爲字符或數字打印一個'unsigned char'? – Asu

+2

@Asu:作爲一個角色......你需要將它轉換爲一個int(或者使用cout流操作符以外的東西):'std :: cout <<(int)c;' – einpoklum

+2

哦,所以我可以mov進入寄存器,這只是輸出數據解釋的一個例子 –

0

256等於2^8

當您使用int8,它採用二進制補碼的方法,所以數量爲[-128 , 127]

之間我認爲,如果你改變它的類型無符號整數 ,它必須工作

+0

@ zx485是的,你說的是實話,謝謝! –

+0

unsigned int是32位,不能將8位寄存器的值移動到32位整數。錯誤C2443:操作數大小衝突 –