为什么我可以进入eax,进入斧头,但不进入al,甚至可能进入啊?

时间:2017-01-01 22:01:18

标签: c++ assembly

如果我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;
}

2 个答案:

答案 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]

之间

我认为如果您将其类型更改为无符号 整数,则必须正常工作