用汇编语言编写,兼容性如何工作?

时间:2016-01-10 21:17:49

标签: assembly

我最近读到游戏过山车大亨2是用汇编语言写的。

我有兴趣主要是出于好奇而学习汇编语言的基础知识,但有一点我无法理解它是如何在一系列CPU上运行的。

我是否理解汇编语言是否特定于指令集?那么如果这个游戏是用汇编语言编写的,那么这个游戏如何在intel和AMD CPU上运行?

4 个答案:

答案 0 :(得分:2)

Rollercoaster Tycoon 2仅在运行Windows的PC上运行。从这个意义上说,PC意味着IBM PC兼容,它与使用Intel 8088 CPU的原始IBM PC向后兼容。 8088是8086的更便宜版本,因此这意味着所有PC都使用8086指令集的版本。多年来,英特尔发布了扩展该指令集的CPU。最值得注意的是英特尔80386增加了32位支持。

作为最低要求的Pentium II CPU的32位Windows游戏,RCT2将完全或几乎全部使用80386支持的指令编写。没有那么多指令由后来的80486,Pentium添加和奔腾II处理器。一个明显的例外是MMX指令,但这些很难使用,可能对这种游戏没用。最初的铁路大亨也支持Pentium CPU,但只有后来的“MMX”版Pentium支持这些指令。

因此,该游戏适用于支持8086指令集的现代版本的Windows PC。这包括Intel PC和AMD PC(以及Via PC),因为所有PC都有使用8086指令集的CPU。任何具有足够快的AMD CPU以使游戏以可接受的速度运行的PC都将支持8086指令集的现代版本。这将包括过去15年内销售的所有AMD PC。

请注意,游戏是用汇编语言编写的,这并不会对最终用户产生任何影响。完全用C ++编写的游戏在交付给客户之前将被编译成机器代码。类似地,完全用汇编编写的游戏被组装到机器代码中。无论是用C ++还是汇编语言编写的Windows游戏,只能在支持8086指令集的现代版本的Windows PC上运行。

RCT2是用汇编语言编写的,这对游戏的开发者和发行者来说有很大的不同。用C ++编写的游戏可以相对容易地移植到其他平台。它通常不像重新编译游戏那样简单,以便为其他平台生成机器代码,但通常只需要更改C ++代码中相对较小的一部分。将RCT2移植到基于PlayStation 2或PowerPC的Apple Macs需要完全重写每一行源代码。

这个名为OpenRTC2项目的项目已经有效地完成了这项工作。他们颠覆了游戏的设计并在C中从头开始重写。这使他们能够生成在Windows PC以外的平台上运行的游戏版本。

答案 1 :(得分:1)

据我了解,在不兼容的处理器类型上本机执行为一种处理器类型生成的机器代码是不可能的。但是,virtual machine(也称为模拟器)可用于实现机器代码的非本机执行,实际上这些机器代码在不同的处理器类型上进行了操作。

答案 2 :(得分:1)

您如何定义汇编语言是一个微妙之处。一种经历重大转换并且没有完全映射到生成的机器指令的语言显然不是汇编语言,但这并不一定使它成为特定的指令设置,或者。

理论上,您可以使用一种汇编语言,通过将其限制为广泛支持的操作的公共子集,例如添加,乘法,除法等,为多个体系结构生成机器代码。只要架构类似足够他们如何实现这个指令子集,你可以用这个子集编写一个工作程序,可以合理地说可以在所有这些子集上运行相同的汇编列表;它可能需要转换为不同的操作码,但二进制的结构在所有情况下都是相同的。如果您愿意接受,例如,情况尤其如此。装配操作和机器指令之间的1:N而不是1:1的对应关系(其中N在架构之间是可变的,但在一个上是恒定的),以允许例如三个地址式的汇编,在ARM上是1:1,到"汇编"对于x86,通过将所有汇编指令扩展为两个x86操作而不是一个。

这种汇编程序的一个可能示例是PicoLisp assembly language,用于编写64位版本的解释器。它声称在ARM,PPC,x86和C之间大部分都是可移植的(有一些特定于平台的代码可以将这些块绑在一起)。

答案 3 :(得分:1)

所有x86 microarchitectures(Intel的386/486 / Pentium / P6系列(PPro到Nehalem)/ P4 / Sandybridge系列/ Atom / Silvermont,AMD的K6 / K7 / K8 / K10 / Bulldozer系列/ Bobcat / Jaguar / etc,Via's Nano,Transmeta's Crusoe等等)是x86 ISA(Instruction Set Architecture)的实现。

这就是使他们x86微体系结构。它们具有不同的内部结构,您需要optimize for each one slightly or a lot differently,但相同的指令序列对其架构状态具有相同的效果。即它们运行相同的代码,您可以根据它们实现的x86机器模型来考虑它们,而不是考虑它们的内部结构,这些内部结构可能完全不同,在Transmeta的情况下最为壮观-the-fly基于软件的二进制翻译到VLIW机器代码。英特尔和AMD的无序执行CPU的内部结构也与x86架构状态有很大不同,但它们使用硬件解码器解码指令。但是,英特尔SnB系列CPU会将解码x86机器代码的结果缓存到内部微操作中。

某些x86实现将支持其他人不支持的指令集扩展,但您可以编写使用CPUID指令的代码,以便在运行时根据CPU的功能来决定使用哪些版本的函数正在运行:例如基线版本,SSE2版本,SSSE3版本或AVX版本。)

在制作x86二进制文件时,您的目标是x86 ISA,它由Intel标准化。请参阅 wiki中的链接。 pdf是免费提供的。