打印
[STM8]

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

[复制链接]
891|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kevicki|  楼主 | 2018-8-11 18:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
环境:IAR for STM8 2.20,优化等级为none
这样一段C代码:
void TASKComm_ActiveCurrentRequest(u32 IDToBeActivated){
        u8 micIDLSB = (u8)(IDToBeActivated);
        u8 micIDMSBL = (u8) (IDToBeActivated >> 8);
        u8 micIDMSBH = (u8) (IDToBeActivated >> 16);
        activateMic(micIDMSBH, micIDMSBL, micIDLSB);

        global_requestHandleStatus = REQUEST_HANDLE_OVER;
}



汇编为:


变量保存地址为:


问题现象:
入参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){

使用特权

评论回复
5
八层楼| | 2018-8-13 09:42 | 只看该作者
卡不动汇编啊

使用特权

评论回复
6
kevicki|  楼主 | 2018-8-13 10:00 | 只看该作者
ayb_ice 发表于 2018-8-13 09:12
那没有关系的,最终的结果不会有影响

但可以这样试试

并没有变化,还是一样 o(╥﹏╥)o

使用特权

评论回复
7
ayb_ice| | 2018-8-13 10:02 | 只看该作者
kevicki 发表于 2018-8-13 10:00
并没有变化,还是一样 o(╥﹏╥)o

void TASKComm_ActiveCurrentRequest(volatile const u32 IDToBeActivated){

使用特权

评论回复
8
kevicki|  楼主 | 2018-8-13 10:05 | 只看该作者
ayb_ice 发表于 2018-8-13 09:12
那没有关系的,最终的结果不会有影响

但可以这样试试

好吧,我把activeMic这个函数的内容直接提取出来放到这个函数里,编译器终于把u32 IDToBeActivated这个参数放在了RAM里而不是用虚拟寄存器保存了。。。

使用特权

评论回复
9
xuanhuanzi| | 2018-8-13 10:28 | 只看该作者
不动汇编,都是看C和运行jieguo

使用特权

评论回复
10
一事无成就是我| | 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

粉丝