Assembly 当高级语言存在时,为什么旧游戏是在汇编中编程的?

Assembly 当高级语言存在时,为什么旧游戏是在汇编中编程的?,assembly,Assembly,我注意到,大多数(如果不是所有的话)Nes/Atari等游戏都是在汇编中编写的,然而在那个时候,C、COBOL和FORTRAN已经存在,我认为这会使编写代码变得更容易,对吗?那么,为什么他们选择汇编而不是这些可用的高级语言呢?那些游戏有8位CPU芯片和微型内存,比如2kB。这个答案会占用一半以上的内存 编译代码是不可能的。即使在具有“大”内存的8位CPU上,如“64K”(whee!)编译代码也很难使用;直到16位微处理器出现,人们才经常看到它 此外,唯一可能有用的语言是C语言,它还没有在世界上流

我注意到,大多数(如果不是所有的话)Nes/Atari等游戏都是在汇编中编写的,然而在那个时候,C、COBOL和FORTRAN已经存在,我认为这会使编写代码变得更容易,对吗?那么,为什么他们选择汇编而不是这些可用的高级语言呢?

那些游戏有8位CPU芯片和微型内存,比如2kB。这个答案会占用一半以上的内存

编译代码是不可能的。即使在具有“大”内存的8位CPU上,如“64K”(whee!)编译代码也很难使用;直到16位微处理器出现,人们才经常看到它

此外,唯一可能有用的语言是C语言,它还没有在世界上流行。当时几乎没有用于8位微处理器的C编译器

但C帮不了那么多忙。那些游戏中有非常便宜的黑客,几乎需要特定于时间的指令循环。。。e、 例如,精灵的Y坐标可能取决于何时(在视频扫描中)写入其控制寄存器。(颤抖……)

现在有了一种很好的解释字节码语言,大约在那个时候,或者稍晚一点:在UCSD p系统上运行。虽然我不是一个帕斯卡迷,但对于那些早期的处理器来说,它远远领先于其他任何东西。不过,它不适合比赛,也跑得不够快

“使编写正确的代码更容易”

没关系

高性能、最少的内存使用至关重要

容易编码是不相关的


记住,早期的游戏在非常非常慢的处理器上有微小的内存量,没有实际的设备。基本上,这些东西直接与CPU芯片相连。

性能,性能,性能。游戏一直都是为了最大限度地利用硬件。即使是当今最好的C、COBOL或FORTRAN编译器也无法与精心编制的汇编代码竞争

正如DigitalRoss所指出的,也存在严重的内存限制,而assembly是唯一允许进行所需细粒度控制的工具


今天同样适用的东西,尽管过去的汇编程序或多或少都被C++取代了。即使存在诸如Python之类的编程语言(非常容易使用),对于要求最苛刻的应用程序,低级编程语言仍然是首选

在开发它们时,高级语言不可用,或者在它们必须运行的平台上表现不佳

当时的编译器不如现在的编译器好。因此,无论对错,许多人都认为他们可以优化编译器。

内存和速度一直是游戏的关键。我姐夫的系统远远超过了我运行虚拟服务器的PC机和台式机。他抱怨游戏刷新率太高。汇编代码可以提供优化代码的能力,这些代码不一定来自旧编译器。现代优化编译器可以进行优化,使生成的代码比手工编码的代码更快


旧游戏严重依赖CPU速度来计时。在运行速度快几倍的现代CPU上运行它们是致命的。延迟方法之一是运行一个循环,使计数器递增或递减一定次数。(这些可能会被编译器优化。)

我假设有更大比例的程序员都知道汇编程序,并且不会对汇编程序的编程三思而后行。甚至到了IBM-PC,在当时,除了汇编程序外,从来没有真正编程过任何东西的人仍然存在,他们可以很容易地围绕C和Pascal程序员编程

Pascal和C(对于台式计算机)非常棒一旦它们站稳脚跟,你就能买得起一个编译器,你很高兴只使用某种新语言编程,而且从来没有听说过优化器,你只是假设高级语言以与每个编译器相同的方式变成机器代码。您仍然可以轻松地将程序安装在一张5.25英寸的软盘上,而且还有大量640K的空闲空间

我认为我们需要带回或有更多的4K编程竞赛。为GBA或NDS编写一个游戏,但二进制、数据、代码、所有内容都不能超过4K。或者重新发明小行星、岩石、飞船、坏人、导弹的游戏性,不要担心视频像素,因为,第一个不是,第二个是由seco处理的nd处理器(硬件状态机),只需生成矢量绘图命令。现在有免费的6502C编译器,以及基于p代码的pascal编译器,可以很容易地在6502上运行输出,看看是否可以在1.5mhz或任何运行频率下实时获得帧速率。并且适合prom。我想这个练习将回答您的问题。或者。。。只要做一个运行时p代码解释器,看看是否适合(standardpascal.org,寻找p5编译器)

一小撮KB就像一千行或更少的代码。程序没有那么多,汇编一点也不难,当然在6502或其他类似的系统上也不难。你没有缓存、MMU、虚拟化和多核,至少没有我们今天遇到的麻烦。你可以自由选择需要的东西你想要的妹妹,每个子程序都可以使用自己的自定义调用约定,你不会为了能以标准方式调用函数而扔掉大量指令,比如寄存器、堆栈或内存。你只有一个中断,并用它来计时轮询/管理硬件(视频更新、按钮和其他用户输入的均匀定时轮询、甚至在玩游戏时轮询四分之一插槽检测器)

小行星号看起来大约有3000行汇编程序。以编译器的效率,我认为你需要