8位NES程序存储器限制

时间:2013-11-25 15:47:15

标签: c 6502

我正在学习C编译器中的8位6502编程(www.cc65.org)

NES FC拥有8位6502处理器和2K RAM。但是,以下C编译(到nes文件中)并在VirtualNES模拟器中成功加载。

#include "conio.h"
#include "stdlib.h"

int dump[1000];

void main()
{
    int *a;
    a = (int*)malloc(19222999);
    cputs("Hello, World!");
    a[0] = 1;
    for(;;); // loop forever, never ends
}

为什么这样可以?显然我在上面的C代码中分配了比2K更多的内存。

2 个答案:

答案 0 :(得分:7)

Segfaults是现代时代奇妙而神奇的恩赐;他们代表我们的计算机自我诊断他们自己的错误,时刻刻刻。

相比之下,相比之下,计算机“崩溃”的方式很少,因为计算机会意识到某些事情出了问题,导致它做了别的事情。在这里,你已经在内存中写了一个1(很可能覆盖了一些重要的东西!),然后计算机继续运行。

外卖:在旧架构和嵌入式系统中,“不崩溃”是一个非常低的清除栏,并不表示事情没问题。

答案 1 :(得分:3)

您不检查a的值。 (顺便说一句,为什么要投出返回值?)

我想是NULL。因此,对a[0]的写访问权限不是有效的C,但它可能(取决于架构)工作 - 并且在那里造成破坏和破坏。

编译过程按预期工作,因为对于编译器和链接器,malloc()是一个函数。这个错误只发生在运行时。