发新帖我要提问
12
返回列表
打印
[国产单片机]

test2 等于 0x55,test 等于 test2与0x0F,结果等于 0x55 ?

[复制链接]
楼主: panxiaoyi
手机看帖
扫描二维码
随时随地手机跟帖
21
panxiaoyi|  楼主 | 2023-9-5 18:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 panxiaoyi 于 2023-9-5 19:32 编辑

多谢lelouchly能帮我看汇编,回复840A,是的,是数组,也多谢大家,是的,我之前一直都是这样认为:
AAA = &*~@!%#¥*&
只要 AAA 是 8 位的变量,并且等号的优先级在最后,那么,AAA 要么就是原始数据,要么就是等号后面的最终的运算结果。
没有想到,IDE 竟然会把这个 AAA 拿来当草稿,拿来存放中间结果,也算是学习了。
后面有空用 51 试试,或者,玩 51 或者其它内核的朋友,帮我仿真试试,看看是否也是这样的?

使用特权

评论回复
22
panxiaoyi|  楼主 | 2023-9-5 20:21 | 只看该作者

我用东软载波的 8 位 OTP 单片机 HR7P153 ( RISC 内核 ) 仿真测试了,不会出现上面的情况,test 的值总是在 0,1,2,3 之间变化,属于正常。辉芒微的也是 RISC 内核,当然,RISC 有很多种不同的内核。

下面是截图



1.png (305.22 KB )

1.png

2.png (208.9 KB )

2.png

使用特权

评论回复
23
panxiaoyi|  楼主 | 2023-9-5 20:35 | 只看该作者
本帖最后由 panxiaoyi 于 2023-9-5 20:39 编辑

还有一个也是类似的问题
辉芒微芯片
在主程序中,例如test=1;
编译后看汇编,汇编第一步,清零 test,第二步,test 加 1
如果是 test=2; 则结果正常,汇编也是正常赋值

这个也是因为我中断需要用到 test ,发现程序老是出现不规则的错误,然后一步一步精简问题,才发现的
具体请看这个贴子

请教:辉芒微,就几条C语句,有些芯片编译正确,有些芯片编译报错
bbs.21ic.com/icview-3294726-1-1.html


使用特权

评论回复
24
shenxiaolin| | 2023-9-5 22:36 | 只看该作者
结果是0x05,你最好使用全局变量测试就知道结果了,然后优化等级设置为0

使用特权

评论回复
25
William1994| | 2023-9-6 08:28 | 只看该作者
你的ANDWR这种指令的第二个参数还是0和1,我印象里面PIC的IDE应该会用F和W来替换了吧?
你把编译器的优化等级设置到0看看,看反汇编明显是窥孔优化的时候把无用的代码给删了导致的,加volatile应该就好了。

使用特权

评论回复
26
trucyw| | 2023-9-6 08:53 | 只看该作者
没有关注中间数据

使用特权

评论回复
27
zlf1208| | 2023-9-6 09:30 | 只看该作者
本帖最后由 zlf1208 于 2023-9-6 09:39 编辑
panxiaoyi 发表于 2023-9-5 20:35
还有一个也是类似的问题
辉芒微芯片
在主程序中,例如test=1;

我看了汇编,虽然不知道指令的细节,但是出问题的地方指可能是地1982和1985二行,汇编指令复制如下:

ANDWR   38H,1
LDR         38H,0

从这二条指令看
第一条是将 通用寄存器1 中的值与 38H 单元做与运算,将结果存入 通用寄存器0
第二条是将 通用寄存器0 的值存入 38H 单元

所以,如果可能的话,在程序运行到断点处,看一下这二个通用寄存器的内容,通用寄存器1 的值应该是0x0F,通用寄存器0 在这二条程序运行前后会发生变化。

另外,你可以在不开启中断的情况下运行这段程序,将二种运行情况进行对比,以验证究竟是中断引起的问题还是编译器的问题。


使用特权

评论回复
28
hjl2832| | 2023-9-7 08:04 | 只看该作者
这个有什么毛病?没有啊,你自己看看汇编的指令你是执行到了哪里?你自己说的出问题的时候,汇编只是跑到了LD命令,下一步才是AND,这时候只是把变量装载到寄存器,下一步AND才开始计算。

使用特权

评论回复
29
panxiaoyi|  楼主 | 2023-9-7 09:00 | 只看该作者
大家好,我上面的代码,都是屏蔽了中断的,然后再汇编单步仿真的结果。
发现这样的问题,是因为有中断的干扰,导致程序时不时的出现错误,最后才查出这个问题的。

我现在的意思是 : 如果抛开单片机 ,按照单纯的 C 语言的思想,下面的语句

unsigned char test, test2 ;

test = test2 & 0x0F ;

在任何时候,包括汇编,test 是不是绝对不会大于 0x0F 的?

使用特权

评论回复
30
zlf1208| | 2023-9-8 08:34 | 只看该作者
panxiaoyi 发表于 2023-9-7 09:00
大家好,我上面的代码,都是屏蔽了中断的,然后再汇编单步仿真的结果。
发现这样的问题,是因为有中断的干 ...

软件是在硬件上运行的,硬件是基础,抛开硬件谈软件是毫无意义的。

使用特权

评论回复
31
zhxzhxzzhhxx| | 2023-9-8 21:40 | 只看该作者
panxiaoyi 发表于 2023-9-5 18:30
多谢lelouchly能帮我看汇编,回复840A,是的,是数组,也多谢大家,是的,我之前一直都是这样认为:
AAA =  ...

对的,AAA在没有赋值之前,编译器认为这个值是没有用的,就先借用为中间变量了,反正后面要重新赋值的
AAA= BBB  & 0xF0
实际是
AAA <- BBB
AAA & 0xF0
因为 BBB 要保留不变

使用特权

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

本版积分规则