打印
[STM8]

为何会出现这个结果?

[复制链接]
275|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxrs|  楼主 | 2020-3-21 11:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ic, AC, TI, TE, IDT
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|  楼主 | 2020-3-21 11:56 | 只看该作者

使用特权

评论回复
板凳
xxrs|  楼主 | 2020-3-21 11:57 | 只看该作者

变量保存地址


使用特权

评论回复
地板
houcs| | 2020-3-21 11:59 | 只看该作者

你有什么打算呢?或者你想知道什么?

使用特权

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

使用特权

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

使用特权

评论回复
7
lium| | 2020-3-21 12:04 | 只看该作者
那个参数本身就存在?b9~?b12之中

使用特权

评论回复
8
wangpe| | 2020-3-21 12:06 | 只看该作者
汇编程序一开始就压栈了?b12

使用特权

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

使用特权

评论回复
10
llia| | 2020-3-21 12:12 | 只看该作者
然后呢?你是怎么应对这个的呢        

使用特权

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

使用特权

评论回复
12
zhuww| | 2020-3-21 12:17 | 只看该作者
那没有关系的,最终的结果不会有影响

使用特权

评论回复
13
gongche| | 2020-3-21 12:19 | 只看该作者
可以这样试试
void TASKComm_ActiveCurrentRequest(const u32 IDToBeActivated){

使用特权

评论回复
14
xxrs|  楼主 | 2020-3-21 12:21 | 只看该作者
并没有变化,还是一样 o(╥﹏╥)o

使用特权

评论回复
15
zhuhuis| | 2020-3-21 12:23 | 只看该作者
void TASKComm_ActiveCurrentRequest(volatile const u32 IDToBeActivated){

使用特权

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

使用特权

评论回复
17
chuxh| | 2020-3-21 12:27 | 只看该作者
不动汇编,都是看C和运行jieguo

使用特权

评论回复
18
pengf| | 2020-3-21 12:29 | 只看该作者
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;
}
不要去强制转换,直接赋值自然会把超过的位溢出抛弃掉

使用特权

评论回复
19
renyaq| | 2020-3-21 12:30 | 只看该作者
原因百度会有,不过讲的很隐晦

使用特权

评论回复
20
xxrs|  楼主 | 2020-3-21 12:34 | 只看该作者

嗯,那我按大家的说法挨个排查一下,谢谢哈

使用特权

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

本版积分规则

405

主题

7415

帖子

1

粉丝