[STM32]

8位单片机如何运行32位数据运算

[复制链接]
2726|4
手机看帖
扫描二维码
随时随地手机跟帖
小将wzj|  楼主 | 2017-9-19 15:00 | 显示全部楼层 |阅读模式

大家好!本人现在有一个疑问,想请大家支支招
今天看到了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位的,但是今天仔细想了一下这是否也是单片机内核决定的,有点晕,这个问题和上面的问题是否有相通之处

相关帖子

feelhyq| | 2017-9-19 16:31 | 显示全部楼层
楼主的C语言基础不够牢固啊,

char Dat = 0XFF;
short NUM = 0X0000;
NUM = Dat << 8;//NUM = 0XFF00

看第3行NUM = Dat << 8; NUM是short型的,Dat是 char型的,C语言规定 单位小的和单位大的进行运算,在运算之前,单位小的先要转换为单位大的,也就是说 NUM = Dat << 8;运算时 Dat先变成单位大的short型
0x00FF,再左移8位变成0xFF00,在进行运算。

而Dat <<= 8;  是同一个单位char型,自然就不会存在转换关系啦,楼主多写几个程序试试,在PC机上试

使用特权

评论回复
小将wzj|  楼主 | 2017-9-19 16:57 | 显示全部楼层
feelhyq 发表于 2017-9-19 16:31
楼主的C语言基础不够牢固啊,

char Dat = 0XFF;

那就是说关于移位的运算,C中有专门的规定,这个与具体的编译器有关,编译器的位数决定了位移的溢出位数,这与内核没有关系,那么在运算中8位的内核如何处理这些多位的数据运算,他们在累加器中如何进行换算的啊???

使用特权

评论回复
JerryWu75| | 2017-9-20 09:19 | 显示全部楼层
Dat<<=8这些操作应该不是在RAM中执行的,而是在reg中执行,然后在mov到RAM。一些8位单片机同样支持16位的寄存器操作,这样的话无论你的变量是8位还是16位,在reg中都是16位的,只是在mov是,截取成8位送到ram中。

使用特权

评论回复
Atom2004| | 2017-10-10 10:54 | 显示全部楼层
你所说的问题 NUM = Dat << 8;//NUM = 0XFF00 并不是和编译器有关,而是C语言规定的。
无论是8位内核还是32位内核,都可以计算32位运算,只是32位内核一次运算就能完成32位的运算(一次运算并非一个时钟周期),而在8位内核里计算32位就需要多很多次运算才能得到结果,但这个过程编译器会帮你搞定,只是运算时间比8位运算长。

8位内核运算32位要比运算8位时间长,但32位内核运算32位不会比运算8位长(甚至还更快)。

在C语言里面直接用 int 定义变量就可以运算32位了,或者你用 int32_t 会更稳妥地定义了32位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

44

帖子

1

粉丝