Assembly 汇编语言与平台无关性

Assembly 汇编语言与平台无关性,assembly,Assembly,我对平台依赖性感到困惑。我想澄清一下。所以,如果我理解正确,特定的硬件架构将有特定的指令集 对吧??如果我们说的是英特尔8086处理器,那么这个处理器有一个特定的指令集。如果我在这个指令集中编码,这意味着我在用英特尔8086支持的汇编语言编码。对吧? 现在,这种特殊的处理器体系结构可以被各种机器和操作系统使用。例如,一台使用Mountain Lion OSX的MAC电脑,一台使用Ubuntu作为操作系统的联想电脑,以及一台使用Windows 7作为操作系统的索尼VAIO电脑,所有这些机器的底层处

我对平台依赖性感到困惑。我想澄清一下。所以,如果我理解正确,特定的硬件架构将有特定的指令集

对吧??如果我们说的是英特尔8086处理器,那么这个处理器有一个特定的指令集。如果我在这个指令集中编码,这意味着我在用英特尔8086支持的汇编语言编码。对吧?

现在,这种特殊的处理器体系结构可以被各种机器和操作系统使用。例如,一台使用Mountain Lion OSX的MAC电脑,一台使用Ubuntu作为操作系统的联想电脑,以及一台使用Windows 7作为操作系统的索尼VAIO电脑,所有这些机器的底层处理器架构都可以是Intel 8086。对吧?

所以现在,如果我用汇编语言为英特尔8086处理器编写代码(比如说添加2个数字),那么这段代码在上面提到的3台机器上运行时应该不会出现任何问题。一个普通的汇编程序应该能够将这段代码转换成这3台机器上的机器级代码。对吧?

那么现在,平台依赖性从何而来?既然asm代码是为相同的底层处理器体系结构编写的,那么它不应该只在所有平台上运行吗


我只是想弄清楚我哪里做错了,哪里弄糊涂了。我错过了什么?如果这个问题听起来令人困惑或愚蠢,请耐心听我说

不幸的是,如果不使用API和ABI进行输入和输出,您的汇编语言程序将走不远。API和ABI依赖于平台。

我会给你一个糟糕的汽车类比,解释为什么会出现问题

所有品牌的汽车均采用相同类型的螺钉和螺栓(8086代码)

尽管你可以从福特(Windows)上取一个螺丝钉,然后把它拧到丰田(OSX)上,但你不能从福特(Internet explorer)上取一个车身面板,然后把它栓到丰田(OSX)上

面板可能用相同种类的螺钉和螺栓连接,但面板永远无法安装在两个品牌之间

因此,尽管您可以在Windows和OSX之间使用相同的基本指令来构建基本的东西,但一旦您开始构建操作系统风格的东西,您就不能再交换它们了。这将引导你走上平台依赖的道路

(我告诉过你这是一个糟糕的类比)

首先,“8086”不再严格准确。自从第一次发布以来,指令集就有了数字扩展,特别是当它扩展到64位时。因此,不兼容的一个根源已经是代码是否打算在64位或32位模式(甚至16位模式)下运行

无论如何,问题是硬件和操作系统之间的接口。x86指令集的汇编代码对于这三个指令集都是相同的,但生成的机器代码可能/将仍然不兼容。不同的操作系统可能会使用不同的常量、约定或示意图,例如系统调用表、函数入口和出口以及堆栈分配。例如,在64位中,大多数x86 Unice对前6个参数使用寄存器,然后将其余参数推送到堆栈中,而Windows仅对前4个参数使用寄存器,并将额外的32字节字段推送到堆栈中,以便在每次函数调用时镜像这些寄存器。使用的寄存器也各不相同,例如Windows将第一个非浮点参数放在RCX中,而Unix使用RDI。 你
使用编译器宏可以解释所有这些问题,但是没有二进制兼容性。

x86在许多方面都是一个特别痛苦的指令集。特别是,您甚至不能说汇编语言中两个数字的简单相加在许多x86计算机上是可移植的,因为已经有太多不同的汇编程序具有至少两种主要语法风格

所以不,你不能说,如果你用一行asm加上两个数字,它就可以移植

对于其他一些指令集,你可能会这么说,但那只是学术性的,因为正如Peter M所说,螺栓和金属板可能都来自同一个地方,但门是不能互换的

我可以用同样的砖头和砂浆建造不同的、不兼容的建筑,用于不同的目的。因此,砌砖技术是可移植的,但我们用它们建造的却不是


许多其他编程语言也是如此,其中一些最初设计为可移植的。

物理硬件并不是唯一的“平台”。您将如何运行您的程序?有些东西必须运行它(BIOS、Windows系统、Linux系统……)这个问题应该转移到程序员身上stackexchangeAdding 2数字是最简单的一点。现在考虑一下如何在不需要与特定操作系统交互的情况下,将这些数字放入和退出处理器……“每个处理器家族都有自己的指令集,用于处理各种操作,如从键盘获取输入、在屏幕上显示信息以及执行各种其他任务。这些指令集称为“机器语言指令”。“那么它还需要与操作系统交互吗?从另一个角度来看:实现Windows平台ABI(包括可执行加载程序等),以允许Windows程序在其他平台上运行。也就是说,不同的平台(操作系统)实现不同的ABI,但这并没有什么神奇之处,是的,底层机器代码是“平台独立的”,组件之间的接口是平台特定的。