[STM8] 帮忙看看这段代码,为何会出现这个结果?

[复制链接]
1094|9
 楼主| kevicki 发表于 2018-8-11 18:33 | 显示全部楼层 |阅读模式
环境:IAR for STM8 2.20,优化等级为none
这样一段C代码:
  1. void TASKComm_ActiveCurrentRequest(u32 IDToBeActivated){
  2.         u8 micIDLSB = (u8)(IDToBeActivated);
  3.         u8 micIDMSBL = (u8) (IDToBeActivated >> 8);
  4.         u8 micIDMSBH = (u8) (IDToBeActivated >> 16);
  5.         activateMic(micIDMSBH, micIDMSBL, micIDLSB);

  6.         global_requestHandleStatus = REQUEST_HANDLE_OVER;
  7. }



汇编为:

反汇编

反汇编


变量保存地址为:

变量地址

变量地址


问题现象:
入参IDToBeActivated为0x12345678(其他值也结果也类似),执行完“u8 micIDMSBL = (u8) (IDToBeActivated >> 8);” 这一步之后,IDToBeActivated的值已经变为0x12565678。
可以看到利用到了虚拟寄存器b8-b11,不明白为什么这一行代码的汇编指令是“MOV  b9  b10”,会直接导致变量的值改变。

请问各位大神这是什么原理?需要怎样修改才可以实现功能呢?


十分感谢!
ayb_ice 发表于 2018-8-13 09:01 | 显示全部楼层
那个参数本身就存在?b9~?b12之中

汇编程序一开始就压栈了?b12
 楼主| kevicki 发表于 2018-8-13 09:08 | 显示全部楼层
ayb_ice 发表于 2018-8-13 09:01
那个参数本身就存在?b9~?b12之中

汇编程序一开始就压栈了?b12

结果确实是这样,但是这个操作明显跟我的意图不符啊,需要怎样改写C代码呢?试了好多种写法,但是汇编出来都是这样。。
ayb_ice 发表于 2018-8-13 09:12 | 显示全部楼层
kevicki 发表于 2018-8-13 09:08
结果确实是这样,但是这个操作明显跟我的意图不符啊,需要怎样改写C代码呢?试了好多种写法,但是汇编出 ...

那没有关系的,最终的结果不会有影响

但可以这样试试
void TASKComm_ActiveCurrentRequest(const u32 IDToBeActivated){
八层楼 发表于 2018-8-13 09:42 | 显示全部楼层
卡不动汇编啊
 楼主| kevicki 发表于 2018-8-13 10:00 | 显示全部楼层
ayb_ice 发表于 2018-8-13 09:12
那没有关系的,最终的结果不会有影响

但可以这样试试

并没有变化,还是一样 o(╥﹏╥)o
ayb_ice 发表于 2018-8-13 10:02 | 显示全部楼层
kevicki 发表于 2018-8-13 10:00
并没有变化,还是一样 o(╥﹏╥)o

void TASKComm_ActiveCurrentRequest(volatile const u32 IDToBeActivated){
 楼主| kevicki 发表于 2018-8-13 10:05 | 显示全部楼层
ayb_ice 发表于 2018-8-13 09:12
那没有关系的,最终的结果不会有影响

但可以这样试试

好吧,我把activeMic这个函数的内容直接提取出来放到这个函数里,编译器终于把u32 IDToBeActivated这个参数放在了RAM里而不是用虚拟寄存器保存了。。。
xuanhuanzi 发表于 2018-8-13 10:28 | 显示全部楼层
不动汇编,都是看C和运行jieguo
一事无成就是我 发表于 2018-8-13 17:57 | 显示全部楼层

RE: 帮忙看看这段代码,为何会出现这个结果?

void TASKComm_ActiveCurrentRequest(u32 IDToBeActivated)
{
        u8 micIDLSB = IDToBeActivated;
        u8 micIDMSBL = IDToBeActivated >> 8;
        u8 micIDMSBH = IDToBeActivated >> 16;
        activateMic(micIDMSBH, micIDMSBL, micIDLSB);
        global_requestHandleStatus = REQUEST_HANDLE_OVER;
}
不要去强制转换,直接赋值自然会把超过的位溢出抛弃掉
原因百度会有,不过讲的很隐晦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

158

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部