打印
[STM8]

为何会出现这个结果?

[复制链接]
461|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 | 只看该作者
变量保存地址

使用特权

评论回复
5
heweibig| | 2022-4-7 21:58 | 只看该作者
你有什么打算呢?或者你想知道什么?

使用特权

评论回复
6
xxrs|  楼主 | 2022-4-7 22:00 | 只看该作者
入参IDToBeActivated为0x12345678(其他值也结果也类似),执行完“u8 micIDMSBL = (u8) (IDToBeActivated >> 8);” 这一步之后,IDToBeActivated的值已经变为0x12565678。
可以看到利用到了虚拟寄存器b8-b11,不明白为什么这一行代码的汇编指令是“MOV  b9  b10”,会直接导致变量的值改变。

使用特权

评论回复
7
xxmmi| | 2022-4-7 22:02 | 只看该作者
请问各位大神这是什么原理?需要怎样修改才可以实现功能呢?

使用特权

评论回复
8
chuxh| | 2022-4-7 22:04 | 只看该作者
那个参数本身就存在?b9~?b12之中

使用特权

评论回复
9
juventus9554| | 2022-4-7 22:07 | 只看该作者
汇编程序一开始就压栈了?b12

使用特权

评论回复
10
xxrs|  楼主 | 2022-4-7 22:09 | 只看该作者
结果确实是这样,但是这个操作明显跟我的意图不符啊,需要怎样改写C代码呢?

使用特权

评论回复
11
xxrs|  楼主 | 2022-4-7 22:13 | 只看该作者
然后呢?你是怎么应对这个的呢        

使用特权

评论回复
12
xxrs|  楼主 | 2022-4-7 22:15 | 只看该作者
试了好多种写法,但是汇编出来都是这样。

使用特权

评论回复
13
zhenykun| | 2022-4-7 22:16 | 只看该作者
那没有关系的,最终的结果不会有影响

使用特权

评论回复
14
wyjie| | 2022-4-7 22:21 | 只看该作者
可以这样试试
void TASKComm_ActiveCurrentRequest(const u32 IDToBeActivated){

使用特权

评论回复
15
xxmmi| | 2022-4-7 22:23 | 只看该作者
并没有变化,还是一样 o(╥﹏╥)o

使用特权

评论回复
16
renyaq| | 2022-4-7 22:27 | 只看该作者
void TASKComm_ActiveCurrentRequest(volatile const u32 IDToBeActivated){

使用特权

评论回复
17
xxrs|  楼主 | 2022-4-7 22:29 | 只看该作者
好吧,我把activeMic这个函数的内容直接提取出来放到这个函数里,编译器终于把u32 IDToBeActivated这个参数放在了RAM里而不是用虚拟寄存器保存了。。。

使用特权

评论回复
18
chuxh| | 2022-4-7 22:33 | 只看该作者
不动汇编,都是看C和运行jieguo

使用特权

评论回复
19
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;
}
不要去强制转换,直接赋值自然会把超过的位溢出抛弃掉

使用特权

评论回复
20
heweibig| | 2022-4-7 22:37 | 只看该作者
原因百度会有,不过讲的很隐晦

使用特权

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

本版积分规则

405

主题

7415

帖子

1

粉丝