小编Aub*_*pez的帖子

为什么 gcc -O1 优化会破坏在 Gameboy Advance ROM 的循环中修改 VRAM 的代码?

我正在开发一个简单的 Gameboy Advance ROM,并试图理解为什么以下代码适用于 gcc选项,但使用或以上-O0时会崩溃(白色模拟器屏幕) :-O1

int main () {
    // Set video mode 3 and background 2
    *(unsigned int*)0x04000000 = 0x0403;

    int x;
    for(x = 0; x < 1; x++){
        // Set a single pixel at position (120, 80) in VRAM to red
        ((unsigned short*)0x06000000)[120+80*240] = 0x001F;
    };

    while(1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该循环显然是不必要的,但我用它来创建一个崩溃行为的最小示例。如果没有循环,无论优化级别如何,代码都可以正常工作。通过循环,它会在-O1和更高处崩溃,但可以在-O0.

无论我是否实际x在循环体中使用(例如,用于x计算像素位置),都会发生相同的行为。据我所知,每当我尝试在循环中进行这种类型的直接内存修改时,我都会在更高的优化级别上遇到损坏。

这里发生了什么?什么优化破坏了代码?这是否表明我做事的方式存在问题?谢谢你的帮助!

更多细节:

  • 我正在使用 devkitpro/devkitarm
  • 我使用 NanoBoyAdvance 作为模拟器
  • 我在 Ubuntu 上运行
  • 完整命令:
arm-none-eabi-gcc -MMD -MP …
Run Code Online (Sandbox Code Playgroud)

c gcc arm devkitpro game-boy-advance

3
推荐指数
1
解决办法
92
查看次数

标签 统计

arm ×1

c ×1

devkitpro ×1

game-boy-advance ×1

gcc ×1