如果我mov, eax 12345
以及之后mov var, eax
(假设var是32位int等等......)并输出var
以后它会正确输出。
与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;
}
答案 0 :(得分:4)
问题不在于(仅)您的汇编代码,而是您打印价值的方式:
cout << c1 << endl;
即使c1是unsigned char(又名uint8),C ++ iostreams也会像对待普通char一样对待它。换句话说,该代码大致相当于:
printf("%c\n", c1);
将它强制转换为unsigned int,它应该可以正常工作。
BTW,在某些平台上(例如Linux PowerPC),普通的char实际上是无符号的。答案 1 :(得分:0)
256
等于2^8
当您使用int8
时,它使用二进制补码方法,因此数字介于[-128 , 127]
我认为如果您将其类型更改为无符号 整数,则必须正常工作