assembly 微码和机器码是一回事吗?

bmp9r5qi  于 2022-11-30  发布在  其他
关注(0)|答案(2)|浏览(204)

几天前我上了第一堂微代码课,注意到Atmel AVR微控制器的一些微代码语法与汇编级语言非常相似。但是,有些语法与常见指令不匹配。那么,它们是相同的吗?
据我所知,汇编级语言只是一种编程语言,编译器将其转换为机器语言。微码是从哪里来的?
下面的句子是什么意思?“汇编指令ADD R1,R 0对应于十六进制的二进制指令字:OC(用于加法)01(0001用于寄存器1,0000用于寄存器0)”
我知道在执行ADD指令时,寄存器中的数据/操作数是十六进制的,但0 C 01是什么?

quhf5bfb

quhf5bfb1#

不,它们不是一回事。
我注意到Atmel AVR微控制器的一些微编码语法与汇编级语言非常相似。
您不是在为AVR编写微码-您将编写汇编。
据我所知,汇编级语言只是一种编程语言,编译器将其转换为机器语言。微码是从哪里来的?
微码在这里并不起作用。汇编确实是一种实现instruction set机器的语言(尽管是一种机器特定的语言)。然而,你的陈述在某种程度上过于简化了--你描述的是典型构建过程的部分
更常见的情况是,您将使用C语言(可能是avr-gcc工具链)对AVR进行编程。
编译C程序(这又需要几个步骤;预处理、链接等)汇编(如果您正在Microchip Studio中构建解决方案,请查看.lss输出文件,这是您生成的汇编)。
然后,将该程序集进一步处理为机器代码。
因此,当目标机器改变时,同样的C将导致在构建过程中不同的汇编。即,无论你是为AVR、PIC、STM、SAM等构建,机器代码也会改变。
然而,小型/简单的微控制器通常不实施微码。
微代码更常在更复杂/更强大的CPU上“使用”/实现。要理解这一点,你必须首先确信你理解了instruction set是什么,如果你不理解-我建议你在那里做一些挖掘。
在复杂的CPU上,微码是一个软件层,它使用通常更简单的底层硬件模拟给定的指令集。即,允许硬件不直接实现给定指令的机器通过使用自己的指令集来实现另一个指令集,从而支持该指令。
例如,一个没有硬件除法指令的CPU(现在我们把这个指令称为DIV...),可以通过执行一系列它自己的硬件实际上可以执行的指令来“假装”支持DIV,以模拟DIV的行为,即大量的加法、移位、旋转、进位等。
然而,在AVR上,您的指令集是固定的,它是它是什么,它不是它不是什么。例如,AVR上的除法是由编译器生成适当的指令来执行的,因为设备上没有除法指令,也没有任何微码来执行除法,使用它的底层本机指令。

zfciruhq

zfciruhq2#

微代码可以是机器代码,也可以被认为是机器代码,但一般来说我们说不,这是不一样的。有概念,也有实现。维基百科的链接在评论中提到的评论,在这里的答案。典型的候选微代码是CISC架构和RISC是故意不作为整个概念的一部分。有些人可能会有术语微架构使用,但这不是微代码,想想状态机
在一些CISC中,例如,您可以将寄存器X与内存位置y相加,并将结果存储在内存位置Z中。这是许多单独的步骤。在简单相加之上的内存事务。对于RISC或比方说加载存储架构,您的ALU类型操作ADD、SUB、XOR而结果只能落在一个登记簿上因此,要执行上述操作,需要三条指令从Y读入某个寄存器,将X和寄存器保存到某个寄存器中,然后将最后一个寄存器存储到位置Z。这与微代码根据微编码可能做的事情相同。但正如维基百科文章所描述的,这可能会进一步分解,设置多路复用器以将寄存器X连接到ALU的操作数A。将地址总线设置为Y,设置多路复用器以选择到ALU B的数据总线,等等...加上总线控制和定时以使读取和写入工作。
请理解,没有理由假设同一系列每次都使用相同的微码体系结构。例如,特别假设x86从一开始到现在都有不同的底层体系结构,在某个点上有两个独立的x86团队会相互超越,您可以在优化和性能方面看到这一点。但这也是一个问题,因为为一个程序调优的代码在下一个程序上会很慢,但在下一个程序上就可以了。显然,不管是不是微码,可以用完全不同的逻辑实现相同的指令集体系结构。拿100个工程师给予他们avr指令集文档,你会得到1到100个不同的实现,它们都会执行相同的二进制。(如果不是100的话也更接近)。对于像x86和mips这样的处理器也是如此,由于各种原因,实现会随着时间的推移而变化。
已经有一些实现使用已知的独立处理器/架构来对另一个架构(x86)进行微码。公平地说,这通常意味着位片/VLIW,而不仅仅是一些其他的RISC或CISC。
如果你看看visual 6502的东西,人们已经开始(嗯,这是很多年前开始的)对旧芯片进行切片和拍照,然后对它们进行逆向工程。但独立于此,想想6502和那一代其他处理器时的技术。掩模设置是由一个人在绘图台上手工完成的。大规模完成,然后缩小。我假设成本,但当时的风险比现在高得多,要制造出一个成功的芯片,全靠人工手动完成逻辑,然后手动实现门和迹线。因此,你没有提出RISC和实现一切所需的所有逻辑,而是创建了多路复用器和总线,你有严格的总线周期(输出地址、芯片选择和读/写,然后四个周期后,答案一定在那里)(这与当时的内存技术相匹配)一个实际的ALU等。您的微码是,您可以看到这一点,特别是在6502,非常明智的设计。你所要做的就是在实际逻辑中得到这些原始总线和复用器,然后你实现微码,例如操作码字节(这也解释了为什么当时的体系结构使用实际的操作码作为一个字节或更少)是进入rom的地址,例如,对于每条指令,可能有8个rom位置或16个。微代码系统,那么你必须重新旋转芯片,重新开始,非常昂贵。但如果有一个错误,在微代码处理器,你至少有机会,你可以改变微代码在rom(在6502为例),而不是旋转芯片。这是一个非常明智的,非常可以理解的道路,历史采取。
随着我们的工具和计算能力的发展,我们在模拟和仿真方面做了大量的工作。如果你能找到一个特定的处理器芯片有什么“步进”。(我们并不总是能得到)。

model name  : AMD FX(tm)-8350 Eight-Core Processor
stepping    : 0

你会发现步进随着时间的推移变低了。这并不是我们真正做步进的方式,它通常是一个字母,然后是数字A0,A1,A2... B 0,B1等等...数字中的步进是如果你能修复金属层中的问题,连接晶体管的层。如果你必须弄乱晶体管层,那么它会改变字母。过去,在你有一个可以交付的产品之前,你会对字母很感兴趣,今天你可以看到A0,A1产品。因为工具。但这都是芯片技术发展的一部分,其中包括非常合理的微编码解决方案。当然,没有微编码也可以实现x86。但你会不时看到微代码更新到bios或操作系统中。当然,微代码化一个risc是可能的,在一些著名的大学程序中,有非常简单的处理器,他们有一个精心设计的微引擎。你可以在几十行verilog中实现的东西就变成了这个巨大的东西,用于教育目的。
当你有ADD R1,R 0,这是汇编语言,它生成机器代码0X 0 C 01是你所指出的。这不是微码,这是机器代码或机器语言。和版本,更人可读的ADD R 0,R1是汇编语言。
在Atmel和AVR的情况下,我怀疑虽然可以重新实现设计,但我假设他们只是继续采用相同的设计,可能会添加更多内存或添加更多闪存或更多uart,或使用更小/更便宜的过程来构建它。这是AVR、PIC、msp430和其他一些类似产品的预期。x86、arm等已经发展,它们的体系结构以及实现。ARM恰好足够灵活,可以用在MCU中,但也可以完全用在PC或服务器上,因此它混淆了这里的概念。
如果你看看6502,z 80,x86,avr等,这些8位指令机,操作码只是一个代码,有时如果你看Map,可能会有一个模式,但我怀疑这只是人类保持跟踪所有的组合,而不是任何类型的解码。在ARM,MIPS,RISC-V等,“指令”有操作码,如果你愿意,但他们可以在大小,MIPS,riscv受mips的影响很大,它有一个固定的操作码区域,限制了固定大小指令中剩余的位数,对于某些操作码,还有额外的操作码字段。ARM采取了一种不同的方法,允许某些指令最大限度地利用指令位,并有更大的立即数,或更多的操作数,然后其他指令在操作码中有更详细的信息,所以你从msbit开始,把指令池分成两半或者最上面的两个位和四分之一,这就是他们在文档中描述指令解码的方式,对于学习过操作码并可能写过一些x86代码的普通程序员来说,这看起来很困难,但是从指令的有效使用来看,这是很有意义的,并且实现起来并不困难。
因此,该指令的0x 0 C操作码只是一个操作码,您可以在文档中查找它。额外的字节可能被解码,也可能只是您在表中查找的代码。您可以在x86中看到这一点,其中第一个字节只是一个操作码/指令,则随后的字节可以是更隐蔽的字节模式,或者它们可以在某些位指示特定寄存器的情况下开始被直接解码,等等......而且这些都仍然是机器代码。即使有可能“看到”特定处理器的微码是什么样子的,也是非常罕见的(想想x86),你可能需要在那里工作,然后爬到后者的一个位置,你有一个需要,可以信任的来源,以核心.与购买的IP像手臂和mips等,你得到了代码,你可以看到它。2你只是不能谈论它,也不能分享它。3尽管在某些情况下,它可以以一种模糊的方式发布,这样你就不能理解它了。
在你的课堂上,你正在学习汇编语言,然后汇编成机器代码。你没有在Atmel AVR芯片中的微引擎。这里没有微码。机器代码位是由指令集架构(ISA)定义的,AVR是一种指令集架构。Atmel/微芯片芯片是该ISA的一种实现。它们可以输入这些位,并将根据架构执行它们。
汇编语言ADD R 0,R1是一种人类可读的编程语言,它使用一个汇编程序,一个工具,将汇编语言转换成机器语言/代码。这意味着你可以有不同的汇编语言,生成相同的机器代码,汇编语言是一种编程语言。

在AVR的情况下,它就像x86,它不仅仅是一个架构,而是完整的芯片与其他逻辑。AVR从Atmel现在微芯片将有一套工具,你可以获得,一些乡亲收费一些免费给予,对于mcu厂商来说,最好是免费给予。在任何情况下,通常都有一个由处理器供应商定义的汇编语言,它与包含汇编语言的文档一起提供以及机器码定义、操作码等。期望该文档中所示的汇编语言与处理器供应商创建或委托的工具相匹配。用于该体系结构的其他工具可能不符合处理器文档,但仍然完全能够生成工作机器码。(对于ARM、MIPS、RISC-V等,处理器供应商拥有文档和工具,然后一些芯片供应商购买该ip(如st、nxp、ti、等等),并将其与来自除ARM之外的源的IP一起放入其芯片中,并且芯片供应商粘合以将其全部保持在一起。

相关问题