2017-01-01 86 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:操作数大小冲突 –