Write your Own Virtual Machine - L2_LC-3 Architecture

前言:这是 Write your Own Virtual Machine 的第二篇文章。主要是来介绍 LC-3 Architecture。原文在这里

LC-3 架构(LC-3 Architecture)

我们的 VM 会要模拟一个功能性的计算机 — LC-3。LC-3 非常适合教大学生如何用汇编语言编程。与 x86 相比,它具有简化的指令集,但包含现代 CPU 中使用的所有主要思想。

首先,我们需要模拟机器的基本硬件组件。尝试了解每个组件是什么。首先创建一个 C 文件。本节中的每个代码段都应放在此文件的全局范围内。

内存(Memory)

LC-3 有 65,536 个内存地址(最大的是 16 位无符号整数 2^{16}),每个内存地址存储一个 16 位的值。这意味着整个内存可以存储 128KB,这非常小。在我们的程序中,这个内存用一个简单的数组储存。

/* 65536 locations */
uint16_t memory[UINT16_MAX];

寄存器(Registers)

寄存器是用于在 CPU 上存储单个值的插槽。寄存器就像 CPU 的“工作台”。要使 CPU 处理一段数据,它必须位于其中一个寄存器中。但是,由于只有几个寄存器,因此在任何给定时间只能加载少量的数据。程序通过将内存中的值加载到寄存器中,将值计算到其他寄存器中,然后将最终结果存储回内存来解决此问题。

LC-3 共有10个寄存器,每个寄存器为 16 位。他们中的大多数是通用的,只有少数寄存器被指定了用途。

  • 8 个通用寄存器(R0 - R7)
  • 1 个程序计数器(PC)
  • 1 个条件标志(COND)寄存器

通用寄存器可用于执行任何程序计算。程序计数器是无符号整数,它是要执行的内存中下一条指令的地址。条件标志告诉我们有关先前计算的信息。

enum
{
    R_R0 = 0,
    R_R1,
    R_R2,
    R_R3,
    R_R4,
    R_R5,
    R_R6,
    R_R7,
    R_PC, /* program counter */
    R_COND,
    R_COUNT
};

就像内存一样,我们在数组中存储寄存器。

uint16_t reg[R_COUNT];

指令集(Instruction Set)

指令是一个命令,它告诉 CPU 执行一些基本任务,例如两个数字相加。指令具有指示要执行的任务类型的操作码(opcode)和一组为正在执行的任务提供输入的参数(parameters)。

每个操作码(opcode)代表一个 CPU “知道”如何去做的任务。 LC-3 中只有 16 个操作码。计算机可以计算的任何东西都是这些指令的组合。每条指令长 16 位,左边 4 位存储操作码。其余位用于存储参数。

稍后,我们将详细讨论每个指令会做什么。现在,定义以下操作码。确保它们保持此顺序,以便为它们分配正确的枚举值:

enum
{
    OP_BR = 0, /* branch */
    OP_ADD,    /* add  */
    OP_LD,     /* load */
    OP_ST,     /* store */
    OP_JSR,    /* jump register */
    OP_AND,    /* bitwise and */
    OP_LDR,    /* load register */
    OP_STR,    /* store register */
    OP_RTI,    /* unused */
    OP_NOT,    /* bitwise not */
    OP_LDI,    /* load indirect */
    OP_STI,    /* store indirect */
    OP_JMP,    /* jump */
    OP_RES,    /* reserved (unused) */
    OP_LEA,    /* load effective address */
    OP_TRAP    /* execute trap */
};

Note:英特尔 x86 架构有数百条指令,而 ARM 和 LC-3 等其他指令则很少。小指令集称为 RISC,而较大指令集称为 CISC。较大的指令集通常不提供任何在根本上新的指令,而是使写汇编的时候更加方便。CISC 中的单个指令可能取代 RISC 中的几个指令。然而,对于工程师来说,它们设计和制造往往更复杂和昂贵。

条件标志(Condition Flags)

R_COND 寄存器存储条件标志,提供最近执行计算的有关信息。这允许程序检查逻辑条件,例如 if(x > 0){...}。

每个 CPU 都有各种条件标志来指示各种情况。 LC-3 仅使用 3 个条件标志,表示先前计算的符号。

enum
{
    FL_POS = 1 << 0, /* P */
    FL_ZRO = 1 << 1, /* Z */
    FL_NEG = 1 << 2, /* N */
};

Note:<< 符号称为左位移操作符。(n << k) 将 n 的所有位移位到左k 位。因此 1 << 2 将等于 4(1 -> 100 = 4).如果你不熟悉,请阅读该链接。这很重要。

我们已经完成了 VM 硬件组件的设置!

最后

GitHub

点个喜欢呗
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容