最近,我看到一个有人写ASM的视频,他们只提到代码是针对x86_64架构的,没有提到具体的CPU。在大学里,我被教导看CPU的指令集,OP代码,内存Map等。(Intel 8051)所以我觉得很奇怪。我有兴趣为我的M系列MacBook编写汇编,ARM64汇编也能在所有ARM CPU上运行吗?
pcww981p1#
是的,正确。指令集体系结构(伊萨)规定了机器代码的外观和它的指令。一些ISA支持多个指令集,应用程序能够在它们之间切换。例如,x86有三个指令集:16位、32位和64位指令集。虽然非常相似,但为这三个中的一个编写的代码如果没有重新组装和轻微更改,就不能在其他上运行。您的Apple M1处理器采用ARMv8.4-A指令集架构。在此架构中指定的三种指令集(A32,T32,A64)中,它仅支持A64。为Apple M1编写的代码原则上可以在具有相同指令集的任何其他处理器上运行,但可能会由于不同的操作系统和库而失败。还要注意,指令集架构经常具有扩展。使用指令集扩展的代码仅在支持此扩展的处理器上运行。例如,x86具有流行的SSE、SSE 2、SSE 3、SSSE 3、SSE4.1、SSE4.2、AVX、AVX 2、AVX-512、…扩展。ARMv8.4也有扩展,但它们对初学者来说并不重要。
1tuwyuhd2#
是的,如果你为特定的指令集提供了足够的细节,那么是的。例如,如果你说x86,那么当然不是,就像大多数指令集一样,它随着时间的推移而发展,所以指令会随着时间的推移而增加或改变。ARM当然也一样,ARM提供了更多的架构信息,知道参考什么规范。今天,如果你说像arm 64这样的东西,你可能会幸存下来,但人们预计,在未来的某个时候,这将不是真的。已经从fuz的回答“你的苹果M1处理器有ARMv8.4-A”aarch 64开始与ARMv 8-A ARMv8.4-A是一个不同的ISA。现在它可能碰巧共享相同的“指令”,但变化是在“架构”方面,我不知道64位方面的手臂像其他手臂变种。ARM和x86通常可以构建一个跨多个目标工作的二进制文件,因为有很多反向兼容性,但显然不是每个ARM都能像x86和x86一样运行“ARM”代码。8051和其他一些(6502我想,也许z 80可能不,但不是PIC,可能是msp430)由于各种原因从指令集的Angular 来修复,虽然...在英特尔停止制造它们之后,8051进化了,实际上有,忘记名字,特殊寄存器在一个8051和另一个之间非常不兼容。8051 s至今仍在使用,这个网页通过,以及旁边,其中许多不同的你和我之间。指令可能是兼容的,但实现的其他部分不是,整个事情需要匹配才能在它们之间运行“代码”。你使用的语言是高级语言,最终编译成机器码,还是从汇编语言开始编译成机器码。只是“在所有arm cpu上运行”等式的一部分。尤其是ARM。指令集就像字母表或语言一样。你可以用英语或西班牙语或俄语等写一本数学教科书。仍然有相同的内容、信息和有用性。这是同一本书,只是不同的语言和字母表。同样,你可以用英语写一本生物书,它对数学课完全没用。绝大多数代码与处理器核心本身无关,它与核心之外的东西有关,是系统的一部分。外围设备、操作系统等而且这些都不兼容从移动的到mac m1再到raspberry pi。因此,虽然您可以使用来自相同arm规范的完全相同的指令集,但生成的代码可能与具有相同架构的基于arm的处理器完全不兼容,并且不会在这些arm处理器上“运行”,它会崩溃。
2条答案
按热度按时间pcww981p1#
是的,正确。指令集体系结构(伊萨)规定了机器代码的外观和它的指令。一些ISA支持多个指令集,应用程序能够在它们之间切换。例如,x86有三个指令集:16位、32位和64位指令集。虽然非常相似,但为这三个中的一个编写的代码如果没有重新组装和轻微更改,就不能在其他上运行。
您的Apple M1处理器采用ARMv8.4-A指令集架构。在此架构中指定的三种指令集(A32,T32,A64)中,它仅支持A64。为Apple M1编写的代码原则上可以在具有相同指令集的任何其他处理器上运行,但可能会由于不同的操作系统和库而失败。
还要注意,指令集架构经常具有扩展。使用指令集扩展的代码仅在支持此扩展的处理器上运行。例如,x86具有流行的SSE、SSE 2、SSE 3、SSSE 3、SSE4.1、SSE4.2、AVX、AVX 2、AVX-512、…扩展。ARMv8.4也有扩展,但它们对初学者来说并不重要。
1tuwyuhd2#
是的,如果你为特定的指令集提供了足够的细节,那么是的。例如,如果你说x86,那么当然不是,就像大多数指令集一样,它随着时间的推移而发展,所以指令会随着时间的推移而增加或改变。ARM当然也一样,ARM提供了更多的架构信息,知道参考什么规范。今天,如果你说像arm 64这样的东西,你可能会幸存下来,但人们预计,在未来的某个时候,这将不是真的。已经从fuz的回答“你的苹果M1处理器有ARMv8.4-A”aarch 64开始与ARMv 8-A ARMv8.4-A是一个不同的ISA。现在它可能碰巧共享相同的“指令”,但变化是在“架构”方面,我不知道64位方面的手臂像其他手臂变种。ARM和x86通常可以构建一个跨多个目标工作的二进制文件,因为有很多反向兼容性,但显然不是每个ARM都能像x86和x86一样运行“ARM”代码。
8051和其他一些(6502我想,也许z 80可能不,但不是PIC,可能是msp430)由于各种原因从指令集的Angular 来修复,虽然...在英特尔停止制造它们之后,8051进化了,实际上有,忘记名字,特殊寄存器在一个8051和另一个之间非常不兼容。8051 s至今仍在使用,这个网页通过,以及旁边,其中许多不同的你和我之间。指令可能是兼容的,但实现的其他部分不是,整个事情需要匹配才能在它们之间运行“代码”。
你使用的语言是高级语言,最终编译成机器码,还是从汇编语言开始编译成机器码。只是“在所有arm cpu上运行”等式的一部分。尤其是ARM。指令集就像字母表或语言一样。你可以用英语或西班牙语或俄语等写一本数学教科书。仍然有相同的内容、信息和有用性。这是同一本书,只是不同的语言和字母表。同样,你可以用英语写一本生物书,它对数学课完全没用。绝大多数代码与处理器核心本身无关,它与核心之外的东西有关,是系统的一部分。外围设备、操作系统等而且这些都不兼容从移动的到mac m1再到raspberry pi。因此,虽然您可以使用来自相同arm规范的完全相同的指令集,但生成的代码可能与具有相同架构的基于arm的处理器完全不兼容,并且不会在这些arm处理器上“运行”,它会崩溃。