打印
[STM8]

8位单片机是如何进行32为数据运算的

[复制链接]
1957|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小将wzj|  楼主 | 2017-9-18 19:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好!本人现在有一个疑问,想请大家支支招
今天看到了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位的,但是今天仔细想了一下这是否也是单片机内核决定的,有点晕,这个问题和上面的问题是否有相通之处



沙发
mcu5i51| | 2017-9-19 16:37 | 只看该作者
16位数据少些,原理一样
u32 a;
u16 b,c;
a = b*c;
--------------------
a = b[l] * c[l];
a += ( b[l] * c[h] ) << 8;
a += ( b[h] * c[l] ) << 8;
a += ( b[h] * c[h ) << 16;
---------------------------------
没有测试,大概就是这样了,就是小学中的竖式计算;
没有乘法指令的芯片的多数用的移位方式



使用特权

评论回复
板凳
小将wzj|  楼主 | 2017-9-19 16:52 | 只看该作者
那如果是加法的话就是先低8位相加,然后依次8位8位的相加,然后再把结果放到内存中。那也就是说8位CPU一次截取8位运算,每次计算的结果放到左值的内存中,32位数据截成4份,那么在进行运算的时候,有进位要怎么运算,怎么将进位传递给左值

使用特权

评论回复
地板
Houtz| | 2017-9-19 16:57 | 只看该作者
现在8位机已经没有什么优势了,直接用Cortex-M3的单片机吧,GD32F130最低才2块出头,比8位机还便宜。
有问题可联系GD32技术FAE QQ:375880228

使用特权

评论回复
5
kingkits| | 2017-9-19 17:32 | 只看该作者
8位机功耗会小很多

使用特权

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

本版积分规则

13

主题

44

帖子

1

粉丝