嗯,昨天有人问过这个……
Google 8051 指令集是前几个热门之一,非常不错。让我们看一条指令:
ADD A,R2 0x2A
这会将累加器中的值与寄存器 R2 中的值相加,并将结果存储在累加器中。
左边是汇编语言语法(汇编语言是由汇编程序定义的,一个读取它的程序,除了处理器开发人员/维护人员文档中使用的标准之外没有其他标准,但您可以制作自己的程序集语言,只要你得到正确的机器码。它不是标准),正确的是机器码。
指令集架构的实现是解释指令并对其进行操作的处理器。因此,对于这条指令和整个指令集,您需要一些具有累加器寄存器、一组其他通用寄存器和实现每条指令的方法的逻辑。像这样的 CISC 可能由于多种原因被微编码,该操作码基本上将寻址到 rom 中的微指令表中,该表将在累加器中复用到一个 alu 操作数,将 r2 到另一个,告诉 alu 执行加法,并将输出(结果和标志)锁存到适当的位置,然后继续执行下一条指令。
切换到另一个指令集这个是 arm 指令集的一个子集。
0: 1840 adds r0, r0, r1
2: 1880 adds r0, r0, r2
4: 18c0 adds r0, r0, r3
6: 1900 adds r0, r0, r4
8: 4008 ands r0, r1
a: 4010 ands r0, r2
c: 4018 ands r0, r3
e: 4020 ands r0, r4
这就是术语“编码”的意义所在。其中一些位向处理器指示每个指令是什么指令,而其他位指示操作数。
使用定义指令集架构的文档,您可以让 100 名工程师完成 1 到 100 个实现。如果我让 100 名程序员负责拍摄图像并将每个像素的红色值增加 1。你会有一个(松散的)定义,我希望看到 100 种不同的解决方案……实现。 ..
您正在阅读的书可能与 MIPS 相关,就像一小部分指令集有无数的实现一样。如今,计算机工程师经常参加必须实施 mips 处理器的课程。让数以万计或更多的工程师每年在地球上上课,然后每学期重复一遍,您就可以开始掌握有多少 mips 实现仅来自大学生。同一学期同一班级(房间)中的相同学生可能以某种方式受过教育以产生类似的实现,比其他学校的其他人更重要,或者使用相同教科书的学生可能比使用其他学校的人的结果看起来更相似教科书。有许多硬件描述语言不限于可以使用的 vhdl 和 verilog,它们也可以改变实现。和我上面的图片处理程序类似,没有指定语言,所以有的会选择python,有的会选择C,有的会选择java等。
一些指令集在 armv4 之前在某种程度上是开放的,在某个点 risc-v 被创建为开放之前的 mips,8051 是在很久以前克隆的,现在我们有很多克隆(可能在您当前的计算机中)以及您和我在互联网上的许多计算机,z80 克隆也是如此)。
AMD 与 Intel x86 处理器是理解同一 ISA 的两种不同实现的简单方法。
那么他们试图传达的是一个实现可能需要 N 个时钟来执行加法操作,0x2A,另一个实现可能需要 M 个时钟来执行该操作,并且对所有指令进行平均允许某种形式的比较实现之间。这样想有点粗略,但这是一本教科书,而不是现实。要了解现实,您需要通过一些涵盖基础知识的内容,然后如果非常幸运,您可以看到现实世界的实现,并了解执行指令所涉及的所有内容以及时钟和性能的概念。
那些 MIPS 作者喜欢自己驱动 ABI,而 ARM 也符合这一点,但没有那么严重。如果我有一个函数 fun (int a, int b),则认为 ABI 无非就是拿 8051;一个 ABI 可能会规定第一个参数在 r3 中传递,第二个在 r4 中传递。相同 ISA 的一些其他 ABI 可能会规定第一个参数被压入堆栈,然后是第二个,因此当您输入函数时,您会看到第二个参数,然后是堆栈上的第一个参数(可能还有其他使用的 ISA 特定项打电话)。
多年来,我们在 x86 上看到/看到了这一点,特定于编译器,后来有人写下了一些规范,然后编译器开始遵循它。并且根据架构和规格,有些会随着时间而改变。 ARM 对 32 位堆栈对齐没问题,后来改为 64 位。
如果您是一名程序员,您应该能够采用较旧和/或较简单的指令集之一并编写模拟器。很有教育意义。然后,您可以使用现成的工具,如汇编器或编译器,并制作可以在指令集模拟器上运行的程序。压缩的 risc-v 指令或 arm thumb 指令,您可以在一个周末完成大部分模拟器并对其进行调试。完整的实施可能还需要几天时间。我在想 armv2/3 或 armv4t 而不是 armv7。然后就可以使用llvm或者gnu工具来编写程序了。毫无疑问,应该涵盖什么是 ISA 以及什么是实现的主题。即使您只实现了足够的指令来执行一个简单的循环,最多也只有少量指令。