[STM8] 为何会出现这个结果?

[复制链接]
1168|20
 楼主| xxrs 发表于 2022-4-7 21:48 | 显示全部楼层 |阅读模式
ic, AC, TI, TE, IDT, ST
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;
}
 楼主| xxrs 发表于 2022-4-7 21:51 | 显示全部楼层
 楼主| xxrs 发表于 2022-4-7 21:53 | 显示全部楼层
 楼主| xxrs 发表于 2022-4-7 21:56 | 显示全部楼层
变量保存地址
heweibig 发表于 2022-4-7 21:58 | 显示全部楼层
你有什么打算呢?或者你想知道什么?
 楼主| xxrs 发表于 2022-4-7 22:00 | 显示全部楼层
入参IDToBeActivated为0x12345678(其他值也结果也类似),执行完“u8 micIDMSBL = (u8) (IDToBeActivated >> 8);” 这一步之后,IDToBeActivated的值已经变为0x12565678。
可以看到利用到了虚拟寄存器b8-b11,不明白为什么这一行代码的汇编指令是“MOV  b9  b10”,会直接导致变量的值改变。
xxmmi 发表于 2022-4-7 22:02 | 显示全部楼层
请问各位大神这是什么原理?需要怎样修改才可以实现功能呢?
chuxh 发表于 2022-4-7 22:04 | 显示全部楼层
那个参数本身就存在?b9~?b12之中
juventus9554 发表于 2022-4-7 22:07 | 显示全部楼层
汇编程序一开始就压栈了?b12
 楼主| xxrs 发表于 2022-4-7 22:09 | 显示全部楼层
结果确实是这样,但是这个操作明显跟我的意图不符啊,需要怎样改写C代码呢?
 楼主| xxrs 发表于 2022-4-7 22:13 | 显示全部楼层
然后呢?你是怎么应对这个的呢        
 楼主| xxrs 发表于 2022-4-7 22:15 | 显示全部楼层
试了好多种写法,但是汇编出来都是这样。
zhenykun 发表于 2022-4-7 22:16 | 显示全部楼层
那没有关系的,最终的结果不会有影响
wyjie 发表于 2022-4-7 22:21 | 显示全部楼层
可以这样试试
void TASKComm_ActiveCurrentRequest(const u32 IDToBeActivated){
xxmmi 发表于 2022-4-7 22:23 | 显示全部楼层
并没有变化,还是一样 o(╥﹏╥)o
renyaq 发表于 2022-4-7 22:27 | 显示全部楼层
void TASKComm_ActiveCurrentRequest(volatile const u32 IDToBeActivated){
 楼主| xxrs 发表于 2022-4-7 22:29 | 显示全部楼层
好吧,我把activeMic这个函数的内容直接提取出来放到这个函数里,编译器终于把u32 IDToBeActivated这个参数放在了RAM里而不是用虚拟寄存器保存了。。。
chuxh 发表于 2022-4-7 22:33 | 显示全部楼层
不动汇编,都是看C和运行jieguo
pengf 发表于 2022-4-7 22:36 | 显示全部楼层
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;
}
不要去强制转换,直接赋值自然会把超过的位溢出抛弃掉
heweibig 发表于 2022-4-7 22:37 | 显示全部楼层
原因百度会有,不过讲的很隐晦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

405

主题

7415

帖子

1

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