本节书摘来自华章计算机《计算机系统:系统架构与操作系统的高度集成》一书中的第2章,第2.10节,作者:(美)拉姆阿堪德兰(ramachandran, u.)(美)莱希(leahy, w. d.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
我们定义lc-2200作为这个简单体系结构的一个具体例子。这是一个面向寄存器的、小端的、使用定长指令格式的体系结构。有16个通用寄存器以及一个单独的程序计数器(pc)。所有的地址都是字地址。介绍这个指令集的目的有3个:
lc-2200作为一个简单的指令集的具体实例能够满足任何高级语言的需求。
它是我们第3章和第5章讨论实现细节的具体体系结构。
更重要的是,lc-2200作为一个简单的、没有阻碍的工具,用来让我们在讨论中给它添加一些其他的特性,比如后面章节中的中断、虚拟内存和同步。这种增加功能对于一个学习工具来说是非常有吸引力的,因为它能引导读者走过根据某种需求给处理器增加某些特性的整个过程。
2.10.1 指令格式
lc-2200支持4种指令格式。r型指令包含add和nand。i型指令包含addi,lw,sw和beq。j型指令包括jalr。o型指令包括halt。因此,lc-2200共有8条指令。表2-1总结了这些指令的语义。
r型指令(add, nand):
28~31位:操作码
24~27位:reg x
20~23位:reg y
4~19位:未使用(应为全0)
0~3位:reg z

i型指令(addi, lw, sw, beq):
0~19位:立即值或地址偏移量(20位的用补码表示的数,范围从–524 288~524 287)
j型指令(jalr):
24~27位:reg x(跳转目标)
20~23位:reg y(链接寄存器)
0~19位:未使用(应为全0)
注意,从程序员方便(及实现者麻烦)的角度来说,汇编器根据指令给出的值或符号以及汇编器自己对pc的理解来计算offset值。在例子中,汇编器将done-(pc+1)存在offset中,所以机器能够在运行时跳转到“done”标签
o型指令(中断)
0~27位:未使用(应为全0)
2.10.2 lc-2200寄存器组
正如前面所说,lc-2200有16个程序员可见的寄存器。事实证明,在编译高级语言时,0是个非常有用的小的整型数。比如,它常用来初始化程序变量。因为如此,我们决定让寄存器r0一直保持0值。写到r0的操作会被体系结构自动忽略掉。
我们为这16个寄存器起了便于记忆的名字,同时与2.8.3节中描述的软件惯例相一致。不仅如此,因为汇编器的需要,我们在寄存器名字前都加了个$符号。寄存器、助记名、预期的作用以及软件惯例总结如表2-2所示。