2017-01-01 7 views
2

mov, eax 12345以降のmov var, eax(varが32bit int等の場合)、varを出力すると正しく出力されます。私はmovをeax、axに入れることはできますが、alに入れることはできません。

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

8ビット変数の場合、256が大きすぎることに注意してください。 – fuz

+0

「AX」と同じ範囲エラーがあります。 'WORD'は0..65535と_not_65536の範囲を持っています。 – zx485

答えて

4

問題は(のみ)yでない私たちのアセンブリコード、それはあなたがあなたの価値を印刷する方法です:

cout << c1 << endl; 

c1がunsigned char型(別名UINT8)であっても、C++のiostreamはそれを彼らは普通の文字を扱うのと同じ方法を扱います。言い換えれば、そのコードはおおよそ次のコードに相当します:

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

これをunsigned intにキャストするだけで正常に動作します。

ところで、一部のプラットフォーム(Linux PowerPCなど)では、通常のcharは実際には符号なしです。

+1

は 'unsigned char'を文字または数字として' cout'出力しますか? – Asu

+2

@Asu:文字として...それをintにキャストする(またはcoutストリーミング演算子以外のものを使う)必要があります: 'std :: cout <<(int)c;' – einpoklum

+2

レジスタには、出力上のデータ解釈のケースがあります。 –

0

256あなたがint8を使用する場合、それは2の補数のアプローチを補完する使用2^8

に等しいので、あなたは符号なし整数にそのタイプを変更した場合、私は思う

[-128 , 127]の間の数であります、それは動作する必要があります

+0

@ zx485ええ、あなたは真実を言った、ありがとう! –

+0

unsigned intが32ビットの場合、8ビットレジスタの値を32ビット整数に移動することはできません。エラーC2443:オペランドサイズの競合 –

関連する問題