我正在开发一个简单的 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计算像素位置),都会发生相同的行为。据我所知,每当我尝试在循环中进行这种类型的直接内存修改时,我都会在更高的优化级别上遇到损坏。
这里发生了什么?什么优化破坏了代码?这是否表明我做事的方式存在问题?谢谢你的帮助!
更多细节:
arm-none-eabi-gcc -MMD -MP …Run Code Online (Sandbox Code Playgroud)