探索汇编语言:开发全规模应用

在软件开发领域,使用汇编语言来创建全规模应用,尤其是DirectX游戏,是一个颇具争议的话题。绝大多数人对此持反对意见,认为这种做法不切实际。然而,本文系列旨在解释如何实现这一目标。假设已经足够成熟,能够做出这样的选择,并且已经清楚为什么要进行这样的尝试(主要是因为创造的东西在许多方面都会超越现有的一切),并且偏离“其他人都在做什么”并不会阻止努力。

常见的反对意见

最常见的论点是:用汇编语言编写一个完整的游戏会花费很长时间,以至于胡子会比ZZ Top乐队成员的胡子还要长。这个论点深植于每个人的脑海中。实际上,几乎没有人真正坐下来用汇编语言创建一个全规模的游戏,因此这个论点也就不攻自破了。这是一个完全的神话。发现,由于其简单性、直接性以及完全不需要类型转换(即,将开发者从无尽的微观管理中解放出来),使用汇编语言编程的速度通常比使用其他任何语言都要快。

面临的挑战

然而,努力有时会受到阻碍,主要是因为几乎没有在线支持。不太可能找到汇编语言的源代码样本;可能需要从C++或其他偏好的语言中转换。此外,对于来说,头文件是不存在的。必须自己构建它们,从C++(或其他)头文件中提取需要的信息。这可能会很繁琐,尤其是当需要转换DirectX数据结构时。

在经验中,发现仅仅从这些结构声明中读取类型是不够的。例如,什么时候一个LONG不是一个LONG?在DirectX中总是这样!虽然记不得确切的在线位置,但曾就此发表过文章,给出了具体的例子:同一个数据类型在一种结构中被编码为64位,在另一种结构中被编码为32位。更糟糕的是,DirectX喜欢将结构嵌套到绝对荒谬的程度,手动解开所有这些信息需要花费大量的时间和耐心。如果真的想为游戏设定性能记录,那么请准备好面对这些挑战。

转换数据结构

转换数据结构的方法是打开一个C++应用程序,为数据结构的每一个成员设置一个指针,然后在函数调用中使用这个指针,这样有用的C++编译器就不会因为其未使用而删除引用。当这一切都完成后,必须逐步(在反汇编级别)查看每一行代码,看看实际放置到CPU寄存器中的指针。这告诉每个结构成员的实际大小。这很痛苦,讨厌这样做。但是没有可行的选择。

时间和地点的挑战

总的来说,开发社区总是朝着抽象化的方向发展。在这个过程中,编码变得越来越繁琐,充满了仪式和管理。这被视为“进步”,但实际上应用程序变得更大,运行得更慢,开发者的生产力随着他们的学习曲线不断增加而降低。重复这个过程。在更多的无意义管理层之上再加上更多的无意义管理层,这是所有人都生活在这个现实。

汇编语言非常、非常不同。它非常直接。数据就是数据;没有类型转换。作为一个开发者,可能知道什么时候想将一个值用作浮点数或整数,可能会很快上瘾,最终摆脱对类型转换的痴迷,这种痴迷将置于绝对压抑的水平之下。一个字节就是一个字节,仅此而已。数据就是数据;想怎么用就怎么用。控制一切。

直接访问数据的好处

一个直接访问数据而不需要类型转换的好例子是翻转一个浮点值的符号。如果使用的是一个32位实数(DirectX在64位模式下也使用这些),不需要将值加载到寄存器中,发出一些指令(或指令)来翻转符号,然后将值放回内存。相反,可以简单地将其视为整数并翻转第31位(0基数,位0到31):

xor dword ptr Foo, 80000000h ;

现在,这个浮点数的符号已经被反转了。

像这样的优势贯穿了汇编语言。这些优势中的大多数只有在自己的创造力发挥作用时才会显现出来,但它们会累积。只有通过直接经验,通过广泛使用汇编语言来创建一个全规模的应用程序,才会开始构建一个清晰、现代、准确的任务图景,与使用任何其他语言相比。不会只是重复被教导要相信的东西。会去过那里,知道。这是一个非常少的人拥有的区别。

在继续讨论具体内容之前,最后一点:使用汇编语言是自己私下的事情。这将使与开发社区对立,不太可能因此而找到工作——除非有政治联系,可以进入一些从事政府情报或航空航天工作的公司;一份需要25k安全许可的工作。通过承担一个全规模的汇编语言应用程序,将直接与每个招聘经理想要看到的东西相矛盾。这不会帮助职业生活。要么自己在市场上得到一些东西,最终用户不关心是如何创造它的,或者以某种方式得到了创建一个平台依赖(即任何游戏机)应用程序的许可。所以,知道在做什么,不要想象一个因为而不存在的未来。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485