硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1332|回复: 8
收起左侧

[求解答] MDK编译问题 汇编代码异常

[复制链接]

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-11-1 15:52:13 | 显示全部楼层 |阅读模式
本帖最后由 wrk__ 于 2024-11-1 15:59 编辑

程序中有这么一行语句:
图片1.png
            (pStackContext->SlaveAddress)=((pStackContext->SlaveAddress) << 1) + 0;
使用AC5生成的汇编代码为:
图片2.png

|L0.28|
        LDRH     r0,[r4,#0x6c]!
        MOVS     r1,#0
        ADD      r0,r1,r0,LSL #1
        STRH     r0,[r4,#0]

最后一句STRH r0,[r4,#0]导致结构体被异常赋值

将编译器优化等级从原来的-O0修改为-O1后,新生成的汇编代码如下:
图片3.png

|L0.42|
        LDRH     r1,[r0,#0x6c]
        AND      r1,r6,r1,LSL #1
        STRH     r1,[r0,#0x6c]
程序运行正常

求解答为什么O0优化等级会编译出如此奇怪的汇编代码呢?

回复

使用道具 举报

6

主题

268

回帖

286

积分

高级会员

积分
286
发表于 2024-11-1 17:23:41 | 显示全部楼层
估计是volatile的问题吧
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-11-2 07:55:55 来自手机 | 显示全部楼层
fxyc87 发表于 2024-11-1 17:23
估计是volatile的问题吧

加了volatile还是不行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-2 10:48:54 | 显示全部楼层
测试了下,仅类似楼主的这行代码写法,O0和O1都没问题,应该是其它地方有影响。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-11-2 12:56:46 来自手机 | 显示全部楼层
eric2013 发表于 2024-11-2 10:48
测试了下,仅类似楼主的这行代码写法,O0和O1都没问题,应该是其它地方有影响。

好的谢谢,我在其他地方的赋值也都没问题,只有在这个位置会出问题,这个指针是经过几层函数传下来的
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-11-7 16:58:48 | 显示全部楼层
经过测试,使用CubeMX新建工程,使用以下代码会出错



[C] 纯文本查看 复制代码
#include "main.h"


/****************
当优化等级为o0和o1时会出错
如果rsv数组小于32不出错
后面不再使用该指针中的变量不出错
****************/
typedef struct
{
    uint8_t rsv[32];    //此处大于等于32时会出现汇编代码异常
    uint8_t val;
} test_typedef;

void unused(uint8_t n)
{
    
}
void testfunc(test_typedef *p)
{
    p->val=(p->val)+1;
    unused(p->val);     //如果后面会使用p-val,会出现汇编代码异常
}




o0等级和o1等级都会出错,o0等级下汇编代码如下
[Asm] 纯文本查看 复制代码
        AREA ||i.testfunc||, CODE, READONLY, ALIGN=1

testfunc PROC
        PUSH     {lr}
        MOV      r1,r0
        LDRB     r0,[r1,#0x20]!
        ADDS     r0,r0,#1
        STRB     r0,[r1,#0]
        LDRB     r0,[r1],#-0x20
        BL       unused
        POP      {pc}
        ENDP


是否出错与结构体中数组大小有关,数组小于32时不出错。

MDK工程见附件,欢迎交流指导


asm_test.7z

8.36 MB, 下载次数: 2

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-8 09:55:54 | 显示全部楼层
wrk__ 发表于 2024-11-7 16:58
经过测试,使用CubeMX新建工程,使用以下代码会出错

回头我试试
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2024-12-22 12:41:04 来自手机 | 显示全部楼层
eric2013 发表于 2024-11-8 09:55
回头我试试

麻烦硬汉哥把这一整篇帖子删一下吧,我把问题搞错了,等有了新发现再和大家分享,谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-12-23 10:18:58 | 显示全部楼层
wrk__ 发表于 2024-12-22 12:41
麻烦硬汉哥把这一整篇帖子删一下吧,我把问题搞错了,等有了新发现再和大家分享,谢谢

有回复的帖子就不能再删除了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 22:19 , Processed in 0.283154 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表