laujc 发表于 2023-4-22 12:19:32

51单片机这里是不是编译BUG?

左移2位编译为连加2次,是不是BUG?
感觉数据送回的话,加2次是对的,但数据没有送回,加2次变成原来3倍。请大神指教。

1a2b3c 发表于 2023-4-22 12:33:46

我认为肯定没有问题的,即使有,也是你哪里写法可能有些不严谨。
因为我是经常做移位啊等等位操作的运算太多了,几乎自己所做的所谓c语言代码,可以说都是这一类的操作,同样的代码在51/arm上面都是正常的。
你的那个代码看的不全,你可以多放点前后的语句来看看
左移2位是x4运算,怎可会是3倍啊?没搞懂你说的呢,

1a2b3c 发表于 2023-4-22 12:36:00

最简单的就是你单独验证。
用几个简单的变量来验证下就行了,不要搅在你的应用中和其它信息混合来看

modbus 发表于 2023-4-22 13:04:12

要看R7的值

czzhouyun 发表于 2023-4-22 13:09:44

不是bug,左移两次不就是*4么,51编译这么成熟的东西,怎么可能还有bug

lyl1070 发表于 2023-4-22 13:16:57

我认为肯定没有问题的,即使有,也是你哪里写法可能有些不严谨。
但是你这个芯片~,还行。

laujc 发表于 2023-4-22 13:30:36

1a2b3c 发表于 2023-4-22 12:33
我认为肯定没有问题的,即使有,也是你哪里写法可能有些不严谨。
因为我是经常做移位啊等等位操作的运算太 ...
(引用自2楼)

只看tmp4赋值这一句,E0应该放的是BUF[2],对于左移2位,他直接连续加了2次E0地址的值。有点搞不懂。
keil编译确实挺智能的。

1a2b3c 发表于 2023-4-22 14:01:50

laujc 发表于 2023-4-22 13:30
只看tmp4赋值这一句,E0应该放的是BUF[2],对于左移2位,他直接连续加了2次E0地址的值。有点搞不懂。
k ...
(引用自7楼)

你不能这样单独看某一行的汇编,那个显示的对应关系不一定准确,而且这里又是间接寻址了,看起来不直观,你后面又有关联的运算,完全有可能编译器自己结合上下文关系处理了的,而不是按照你的思路一条条的来,这个很正常
如果你能看懂汇编那直接上下文看完就行了,自己计算一下结果对不对
否则的话就麻烦,所以我就叫你单独验证一下不就清楚了。或者在你那个上面你自己模拟仿真运行看下结果是不是你要的就好了,

矩阵时间 发表于 2023-4-22 14:04:16

25E0 的汇编代码。
25 指令是:ADD A, direct。
这里头的 direct 就是 ACC(E0 地址)。
也就是:ADD A, ACC
ADD A, ACC 一次就是 <<1
连续 ADD A, ACC 两次就是 <<2
连续 ADD A, ACC 三次就是 <<3
简单的汇编技巧而已

1a2b3c 发表于 2023-4-22 14:36:44

矩阵时间 发表于 2023-4-22 14:04
25E0 的汇编代码。
25 指令是:ADD A, direct。
这里头的 direct 就是 ACC(E0 地址)。

(引用自9楼)

看了你的我才仔细回去看了楼主的汇编句子,的确没有任何问题,我也不知道楼主为啥说哪里不对了
汇编里面是连着两次累加器A自己加自己,那么就是X4了,就是左移2次。开始没有注意到地址值0xE0(就是A自己)
所以为啥楼主觉得不对,一直在问你自己验证过了吗?

wye11083 发表于 2023-4-22 14:49:12

矩阵时间 发表于 2023-4-22 14:04
25E0 的汇编代码。
25 指令是:ADD A, direct。
这里头的 direct 就是 ACC(E0 地址)。

(引用自9楼)

你说的这个是不正确的。

51汇编手册,0x25 指ADD A,direct
ADD
(A)<-(A)+(direct)

,并没有涉及到A连续累加,所以连续加2次理论上确实是*2,而不是*4。所以推测,前面的R7存放的已经是*2的数值了,这样2倍数值+2倍数值=*4,这类优化在编译器优化时非常常见。

wye11083 发表于 2023-4-22 14:50:17

1a2b3c 发表于 2023-4-22 14:36
看了你的我才仔细回去看了楼主的汇编句子,的确没有任何问题,我也不知道楼主为啥说哪里不对了
汇编里面 ...
(引用自10楼)

根据51指令手册,那两个add是加2次,不是加4次。因此r7应该是存放*2的值,否则解释不通加2次=*4。

1a2b3c 发表于 2023-4-22 15:12:43

wye11083 发表于 2023-4-22 14:50
根据51指令手册,那两个add是加2次,不是加4次。因此r7应该是存放*2的值,否则解释不通加2次=*4。 ...
(引用自12楼)

这个你不用纠结了,肯定是对的。
我都这么多年了,这点还是熟悉了,只是好久没看汇编忘记了地址和寄存器之间的关系了,上面的提醒了我一下就明白过来了

1a2b3c 发表于 2023-4-22 15:22:20

你看我这个嘛,一样的:2次A和Acc自己加就是x4,太明显不过了。而且就是地址E0,现在记起来了A就是E0
所以楼主的是没有问题的,只是他没看懂,觉得不对。

1a2b3c 发表于 2023-4-22 15:26:37

wye11083 发表于 2023-4-22 14:49
你说的这个是不正确的。

51汇编手册,0x25 指ADD A,direct
(引用自11楼)

这里的direct就是A自己啊,没毛病
A加自己以后再返回到A不就是翻番嘛,连续2次翻番不就是x4啊。{:lol:}

mcu5i51 发表于 2023-4-22 15:27:07

wye11083 发表于 2023-4-22 14:50
根据51指令手册,那两个add是加2次,不是加4次。因此r7应该是存放*2的值,否则解释不通加2次=*4。 ...
(引用自12楼)

你也知道自加倍增两次呀 初始 1 第一次 1+1 = 2,第二次 2+2 = 4;正好4倍

laujc 发表于 2023-4-22 15:54:24

E0地址,我刚才理解成RAM地址了,如果是ACC地址,那就没问题了

laujc 发表于 2023-4-22 15:55:56

是接收RF数据,总共10位,前5位与后5位是取反校验关系。所以有这个计算。
不过我现在接收时直接前5位放1个byte,后5位放1个byte,就没这个运算了

wye11083 发表于 2023-4-22 16:07:02

mcu5i51 发表于 2023-4-22 15:27
你也知道自加倍增两次呀 初始 1 第一次 1+1 = 2,第二次 2+2 = 4;正好4倍
(引用自16楼)

。。所以E0=ACC,51和x86的复杂的寻址方式很无语{:sweat:} {:sweat:} 所以x86才会被2家公司彻底垄断{:sweat:} 。idata和sfr竟然是重合的(overlapped),不是天天做51确实很费解{:sweat:}

诸如avr,arm,mips,riscv之类,都是plain 4G address模式,不存在各种直接/间接/立即数寻址,也不存在各种SFR之类,全部都是直接volatile DTYPE* ptr访问。

矩阵时间 发表于 2023-4-22 18:26:07

wye11083 发表于 2023-4-22 16:07
。。所以E0=ACC,51和x86的复杂的寻址方式很无语所以x86才会被2家公司彻底垄断{:swe ...
(引用自19楼)

哈哈哈哈哈,大神不用理会 51 单片机的,你们做高端的就好,留一条小路出来让大家挤挤、揾三餐

laujc 发表于 2023-4-22 19:45:06

wye11083 发表于 2023-4-22 16:07
。。所以E0=ACC,51和x86的复杂的寻址方式很无语所以x86才会被2家公司彻底垄断{:swe ...
(引用自19楼)

是的,所以其他单片机速度比51快很多。代码密度也高不少。
51的很多地址是重合的,需要用寻址方式来区分。

laujc 发表于 2023-4-22 19:47:07

矩阵时间 发表于 2023-4-22 18:26
哈哈哈哈哈,大神不用理会 51 单片机的,你们做高端的就好,留一条小路出来让大家挤挤、揾三餐 ...
(引用自20楼)

这几年国内新出的8位mcu基本都是51核的

chendaon 发表于 2023-4-24 07:15:31

矩阵时间 发表于 2023-4-22 18:26
哈哈哈哈哈,大神不用理会 51 单片机的,你们做高端的就好,留一条小路出来让大家挤挤、揾三餐 ...
(引用自20楼)

哈佛结构的8位机确实麻烦,51的xdata也就64k的地址范围,估计当年设计的时候,64k已经是巨大无比内存了,毕竟指令集设计年代久远。

laujc 发表于 2023-4-25 21:43:17

chendaon 发表于 2023-4-24 07:15
哈佛结构的8位机确实麻烦,51的xdata也就64k的地址范围,估计当年设计的时候,64k已经是巨大无比内存了, ...
(引用自23楼)

前几年有些51单片机将64K之外的Flash分成不同的bank
函数超过64K就要分bank了,那时候真能折腾。

chendaon 发表于 2023-4-27 17:37:29

laujc 发表于 2023-4-25 21:43
前几年有些51单片机将64K之外的Flash分成不同的bank
函数超过64K就要分bank了,那时候真能折腾。
...
(引用自24楼)

pic系列是bank的代表,当年用pic的芯片,bank来,bank去,很容易绕晕。

laujc 发表于 2023-4-27 22:38:50

chendaon 发表于 2023-4-27 17:37
pic系列是bank的代表,当年用pic的芯片,bank来,bank去,很容易绕晕。
(引用自25楼)

好像合泰也是这样

tang_qianfeng 发表于 2023-4-27 23:16:35

laujc 发表于 2023-4-25 21:43
前几年有些51单片机将64K之外的Flash分成不同的bank
函数超过64K就要分bank了,那时候真能折腾。
...
(引用自24楼)

那是10多年前了吧
我记得好像st的psd芯片就大于64k的,要分bank

dz20062008 发表于 2023-5-7 18:15:41

51浮点运算能力很差,所以通过位移来做数据运算优化很常见

laujc 发表于 2023-5-7 18:31:53

dz20062008 发表于 2023-5-7 18:15
51浮点运算能力很差,所以通过位移来做数据运算优化很常见
(引用自28楼)

这里没用浮点数,移位也被与自身相加优化了。。。

dz20062008 发表于 2023-5-7 18:32:17

laujc 发表于 2023-4-25 21:43
前几年有些51单片机将64K之外的Flash分成不同的bank
函数超过64K就要分bank了,那时候真能折腾。
...
(引用自24楼)

mcs51最大寻址能力就是64k超过的空间的访问类似与ce切换片外rom
页: [1]
查看完整版本: 51单片机这里是不是编译BUG?