0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

全面解析构建4位计算机:汇编语言和汇编器

电子设计 来源:eeweb 作者:Max Maxfield 2021-05-13 14:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作为我们讨论的起点,让我们进行一个简单的思想实验。假设我们刚刚完成了4位HRRG计算机的构建。我们还假设它是地球上的第一台计算机。也就是说,没有任何其他计算机或编程语言,或者……好吧,什么都没有。

让我们宽容自己,并假设我们还开发了一些输入和输出设备-看起来像QWERTY键盘,VT100终端和纸带读/写器,并且已经将它们连接到某些HRRG上。输入和输出端口,但我们尚未创建任何代码来驱动小流氓。

在继续本专栏的其余部分之前,为什么不暂停片刻,以考虑下一步将要做什么。

用机器代码捕获和输入程序

作为一个快速提醒,HRRG具有16个寄存器并支持16条指令,如下所示(“指令集”和“指令”中对各种指令执行其魔术的方式进行了更详细的讨论。权衡”列)。

pIYBAGCcwx6AQHesAAM9Vs0h5NU290.png

HRRG的CPU寄存器和指令。(来源:马克斯·麦克菲尔德(Max Maxfield)

我们的首要任务是创建一个非常非常简单的程序,以确保该野兽完全起作用。如果我们决定使用铅笔和纸来捕获该程序的意图并绘制带有相关注释的流程图,这不会让我感到惊讶,如下所示:

pIYBAGCcwy-AQEHGAAL66BQdDHs021.png

一个简单程序的流程图。(来源:马克斯·麦克菲尔德(Max Maxfield)

下一步将是确定要加载到计算机内存中的哪些操作码和操作数,以实现我们的程序。再一次,这可能涉及铅笔和纸以及一些皱眉和头挠,结果如下所示:

o4YBAGCcwzuAHd4kAAS_8k6kNZY896.png

简单程序的机器代码。(资料来源:马克斯·麦克菲尔德(Max Maxfield)

这种表示形式称为“机器代码”,因为它们是我们的计算机(机器)将执行(处理)的二进制代码。

最后但并非最不重要的一点是,我们希望将机器代码加载到计算机中并运行程序,但是我们将如何做呢?好吧,我们可能会构建一个开关面板并将其连接到计算机。至少,这将涉及12个拨动开关代表地址,4个拨动开关代表数据,以及几个控制开关和按钮,如下所示。

pIYBAGCcw0mAdpSfAAHu6Q25ouk341.png

简单的HRRG开关面板(来源:Max Maxfield)

为了输入程序,我们将“ Program / Run”开关设置为“ Program”,在地址开关上设置一个地址,并在数据开关上设置一个相应的操作码或操作数,然后按“ Load”按钮以将该值加载到内存中。我们将对构成程序的所有小节重复此过程。上图显示了我们准备将$ C(跳转)操作码输入到内存位置$ 106中。

输入程序后,我们将地址开关设置为指向程序的起始地址(在本示例中为$ 100),然后将“ Program / Run”开关切换为“ Run”。

汇编语言捕获程序

许多设计原始计算机的团队都认为,为了获得最佳结果,必须尽可能地靠近机器。也就是说,他们的理念是编写尽可能接近机器内部表示形式的程序;即机器代码。

但是,您可能想像到,以机器代码捕获和输入程序非常耗时,容易出错,并且最终会给地域带来麻烦。下一步是使用一种称为汇编语言的低级符号编程语言来捕获一个程序,在该语言中,程序的语句与计算机的机器代码指令之间存在非常强的对应关系。(英国数学家凯瑟琳·布斯(Kathleen Booth)因她在1947年开始的理论工作而发明了汇编语言的概念而受到赞誉。)

当然,拥有汇编语言与拥有汇编程序并不相同,汇编程序是指将汇编程序源代码转换为可执行机器代码的实用程序。在我们的思想实验中,我们仍处于使用铅笔和纸来捕获程序的阶段。

假设我们已经定义了HRRG汇编语言(我们将在我的下一篇专栏中更详细地考虑该语言)。在这种情况下,我们可以使用铅笔和纸以汇编语言捕获程序并将其手工汇编为机器代码。让我们考虑一下原始测试程序的情况,如下所示:

o4YBAGCcw1iAC8_lAAPWL9dcijg584.png

手工汇编代码(来源:Max Maxfield)

非常有用的一件事是将标签与关键指令的地址相关联,例如标记我们循环开始的LOOP标签。在浏览程序时,我们将构建标签及其地址的交叉引用表,如上图的右上角所示。

就我们的简单程序而言,我们在使用标签之前先声明了标签,这使我们的生活变得轻松。在更复杂的程序中,我们可能在声明标签之前先参考标签(例如,跳转到其标签位于程序下方的子例程)。在这种情况下,我们将对源代码执行多次遍历,其中第一遍遍使我们能够确定所有标签的地址,而第二遍遍使我们能够解析我们不知道的任何地址,时间周期。

通过我们的引导程序振作起来

这就是开始变得有趣的地方。首先,我们将创建几个简单的低级实用程序例程,以允许我们监视键盘并使用我们的纸带读取器/写入器。为此,我们可以用铅笔和纸捕获源代码,将其手工组装成机器代码,然后使用开关面板将该机器代码加载到计算机的内存中(请注意,我们可以将多个程序存储在计算机的不同区域中)。记忆)。

大约在这个时候,我们还将创建一个低级别的监视程序。这种程序提供了一个简单的用户界面(通常基于单个字符命令),以允许用户执行诸如检查和更改内存,读取或写入I / O端口以及将控制权转移到内存中其他程序的操作。再一次,将使用铅笔和纸捕获该程序,然后手工组装,并使用开关面板将其加载到计算机的内存中。

接下来,我们将创建一个简单的汇编程序,仅支持我们最终希望拥有的部分功能。和以前一样,将使用铅笔和纸捕获此简单的汇编程序,然后手工组装,然后使用开关面板将其加载到计算机的内存中。

现在我们可以摇滚了,因为我们可以使用电传打字机终端之类的功能来捕获首遍汇编程序支持的汇编语言子集中的程序,并将这些源代码程序写入纸带。接下来,我们可以使用监视程序和实用程序从纸带读取此源代码,并将其存储在计算机内存的一个区域中。然后,我们可以使用首遍汇编程序将此源代码汇编为可执行的机器代码,并将其存储在内存的另一个区域中。在这一点上,我们可以对存储在计算机内存中的可执行机器代码做两件事:

从这时起,我们的牡蛎(或龙虾,或我们选择的任何甲壳类动物)便成为现实,因为我们可以使用首过汇编程序为所有现有程序(包括监视器,低级程序)创建更复杂的版本。实用程序和汇编器本身。然后,我们可以使用更复杂的汇编器来创建一个更高级的汇编器,然后一路走走。

有趣的是,当您使用高级编程语言(例如C或C ++)编写程序时,编译器不会将其直接编译为机器代码-而是,编译器会在汇编源代码中生成程序的中间版本代码,然后将这些源代码组装成机器代码。所有这些对于普通用户都是不可见的,但是对于编译器开发人员和专业程序员而言,访问中间汇编代码可能是无价的。

交叉汇编程序和宏汇编程序

在上面的思想实验中,我们考虑了最坏的情况,其中HRRG是地球上唯一的计算机。对于后续机器的设计人员来说,事情变得容易得多,因为他们可以使用现有机器来加快速度。

例如,交叉汇编程序是一种汇编程序,可以将指令转换为用于运行该计算机的计算机以外的计算机的机器代码。我在HRRG上的同谋者EEWeb专家Joe Farr创建了一个在PC上运行的HRRG交叉汇编器,它采用HRRG的汇编语言编写程序,并生成可在HRRG上运行的可执行机器/目标代码。下面的两个图像显示了同一程序段的源代码版本和目标代码版本。

o4YBAGCcw2eACX6tAAX69Kl0R5E126.png

HRRG交叉汇编器源代码视图(来源:Joe Farr)

pIYBAGCcw3aANNMRAATla0FLpqw077.png

HRRG交叉汇编器目标代码视图(来源:Joe Farr)

更好的是,HRRG的汇编程序是宏汇编程序,它是可以执行宏替换和扩展的汇编程序。这使我们能够定义由一个或多个语句组成的宏,然后在程序中稍后使用这些宏名称,从而避免了必须重写语句。

举一个简单的例子,HRRG的指令集不包含HALT指令。但是,我们可以使用HRRG的汇编语言将这样的指令实现为宏,如下所示:

.MACRO HALT

OR %0010, S1

.ENDMACRO

现在,我们可以将前面的程序示例中的OR指令替换为HALT,这有助于使程序更易于理解。此外,我们可以将所有宏捆绑到一个单独的文件中,然后可以使用.INCLUDE指令将其导入到程序中。

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5588

    浏览量

    129049
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11216

    浏览量

    222912
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    汇编语言还有必要学习吗

    1、嵌入式操作系统需要汇编语言 2、实时性要求非常高的地方,需要汇编语言,比如FFT算法。 3、汇编语言做运算那叫一个痛苦,下面是一段双字节乘法,浮点数就更难搞
    的头像 发表于 11-25 11:46 452次阅读
    <b class='flag-5'>汇编语言</b>还有必要学习吗

    汇编语言的起源

    一、汇编语言是什么? 我们知道,CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。 这些指令都是二进制的,称为操作码
    发表于 11-20 07:19

    汇编寄存的知识

    学习汇编语言,首先必须了解两个知识点:寄存和内存模型。 先来看寄存。CPU 本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU 要用的时候就去内存读写数据。 但是,CPU
    发表于 11-20 06:45

    C语言和单片机C语言有什么差异

    汇编语言机器才能读懂,所以每个平台的编译编译成对应平台汇编的程序,每个平台的汇编不一样,当然编译也不一样。 DOS上的TC2 TC3 W
    发表于 11-14 07:55

    RVMCU课堂「7」: 手把手教你玩转RVSTAR—汇编程序篇

    一般的GNU汇编语法也能被GCC的汇编器识别,GNU汇编语法中定义的伪操作、操作符、标签等语法规则均可以在RISC-V汇编语言中使用。 一条典型的RISC-V
    发表于 10-31 08:46

    RISC-V的工具链GCC内联汇编

    \", \"r2\" ); 总结 汇编语言抽象层次低,但程序编写难度大。我们在实际工程编写中可以去阅读完整的GNU汇编语法手册,里面有语法介绍可以进行学习与借鉴。
    发表于 10-30 06:59

    采用汇编指示符来使用自定义指令

    具体实现 1、采用.word .half .dword等汇编指示符直接插入自定义指令,这种方法需要自己指定寄存。其中.word为插入一个字的数据即32,.half为插入半字即16
    发表于 10-28 06:02

    GCC内联汇编

    GCC内联汇编 在蜂鸟内核的NICE协处理扩展demo的insn.h文件中存在下面一段指令,用于定义对协处理调用指令,demo中协处理支持三条指令:lbuf从内存中load数据
    发表于 10-24 07:46

    通过内联汇编调用乘法指令mulh\\mulhsu\\mulhu

    1.蜂鸟E203内核支持的乘法指令有四种(不含融合指令),分别为mul、mulh、mulhu与mulhsu。它们的汇编语言格式如下: mulrd,rs1, rs2 将两个32整数相乘,取低
    发表于 10-24 06:52

    ARM入门学习方法分享

    )架构。学习ARM的开始可以从学习RISC和CISC架构的基础知识开始。 二、学习汇编语言:ARM架构的核心是汇编语言。学习汇编语言能够帮助你理解计算机内部的工作原理,并掌握ARM指
    发表于 07-23 10:21

    汇编语言教学中文资料

    电子发烧友网站提供《汇编语言教学中文资料.rar》资料免费下载
    发表于 06-30 15:15 7次下载

    Windows环境下32汇编语言中文资料

    电子发烧友网站提供《Windows环境下32汇编语言中文资料.rar》资料免费下载
    发表于 06-30 15:14 0次下载

    单片机原理及应用

    本书全面系统地介绍了 MCS-51 系列单片机的基本结构、工作原理及应用技术。主要内容包括:微型计算机的基础知识、MCS-51 单片机的基本结构、汇编语言和 C51 语言程序设计方法、
    发表于 06-16 16:58

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:C<b class='flag-5'>语言</b>中的DSP:从C调用<b class='flag-5'>汇编</b>类成员函数

    TMS320C6000汇编语言工具v7.4用户指南

    电子发烧友网站提供《TMS320C6000汇编语言工具v7.4用户指南.pdf》资料免费下载
    发表于 12-30 16:42 3次下载
    TMS320C6000<b class='flag-5'>汇编语言</b>工具v7.4用户指南