我正在开发一个简单的游戏男孩高级光盘,并试图理解为什么以下代码与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;
}
循环显然是不必要的,但我使用它创建了一个崩溃行为的最小示例.在没有循环的情况下,无论优化级别如何,代码都能正常工作.有了循环,它在-O1
或更高的地方崩溃,但在-O0
上可以工作.
无论我是否在循环体中实际使用x
(例如,使用x
来计算像素位置),都会发生相同的行为.就我所知,每当我try 在循环中进行这种类型的直接内存修改时,我都会在更高的优化级别上得到 destruct .
这里发生了什么事?是什么优化破解了代码?这是否表明我做事的方式有什么问题?谢谢你的帮助!
以下是更多细节:
- 我正在使用devkitpro/devkitarm
- 我使用NanoBoyAdvance作为模拟器
- 我用的是Ubuntu
- 完整命令:
arm-none-eabi-gcc -MMD -MP -MF /path/to/myfile.d -g -Wall -O1 -mcpu=arm7tdmi -mtune=arm7tdmi -mthumb -mthumb-interwork -iquote /path/to/include -I/opt/devkitpro/libgba/include -I/path/to/build -c /path/to/source/myfile.c -o myfile.o