为什么我可以mov进入eax,进入ax,但不进入al,甚至可能进入ah?
如果我mov, eax 12345
及更高版本mov var, eax
(假设var是一个32位int等..等等),并输出var
它会输出正确。为什么我可以mov进入eax,进入ax,但不进入al,甚至可能进入ah?
与ax
相同。 mov ax, 65535
- >mov var16, ax
会正确输出。
但是,如果我mov
到al
甚至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;
}
这个问题不是(仅)与y我们的汇编代码,这是您打印值的方式:
cout << c1 << endl;
即使C1是无符号的字符(又名UINT8),C++输入输出流对待它,他们对待一个普通的字符以同样的方式。换句话说,该代码大致相当于:
printf("%c\n", c1);
只需将其转换为无符号整型,它应该可以正常工作。
顺便说一句,在某些平台(例如Linux PowerPC)上,普通字符实际上是无符号的。
256
等于2^8
当您使用int8
,它采用二进制补码的方法,所以数量为[-128 , 127]
之间我认为,如果你改变它的类型无符号整数 ,它必须工作
@ zx485是的,你说的是实话,谢谢! –
unsigned int是32位,不能将8位寄存器的值移动到32位整数。错误C2443:操作数大小冲突 –
8位无符号字节的最大值为255(基于零)。 –
请注意256对于8位变量来说太大了。 – fuz
“AX”有相同的范围错误。一个'WORD'的范围是0..65535和_not_ 65536. – zx485