大家好!本人现在有一个疑问,想请大家支支招
今天看到了stms单片机的手册中说到CPU中有一个累加器是一个8位通用目的寄存器,用于保存算术运算、逻辑运算以及数据操作的操作数及结果
那么现在假设一个函数里面要进行两个32位数据的运算比如A = B + C;(ABC都是32位的数据)
首先这3个数据在函数中是存放在栈或者数据区的,假定存在栈区(局部变量),那么在进行加法运算的过程中,CPU首先要从栈中取出相应的数,计算出结果,再把结果放到A的地址中
那么我现在不明白8位的CPU只有一个8位的累加器,如何进行运算,是一次去8位吗,还是说有其他的方式,麻烦大家帮忙解答,希望能详细点。
另外今天无意中发现一个问题,一个char型的数据经过左移8位后若直接赋值给一个short或者int类型的话会自动保存左移后的正常值,而赋值给char型的话就是0x00。
char Dat = 0XFF;
short NUM = 0X0000;
NUM = Dat << 8;//NUM = 0XFF00
Dat <<= 8;//Dat = 0x00;
如果NUM为int型数据,则Dat << 24 后NUM的值为0XFF000000,如果左移25位NUM的值就是0XFE000000。
运算过程中CPU会将char型的数据放到寄存器中,因为CPU是32位的所以数据在寄存器中移位的范围也是32位,运算后赋值给左值时会根据左值的字长进行数据的截取
个人认为上述现象是跟编译器有关,大部分编译器是32位的,但是今天仔细想了一下这是否也是单片机内核决定的,有点晕,这个问题和上面的问题是否有相通之处
|