Machine code 从头开始构建自定义机器代码

Machine code 从头开始构建自定义机器代码,machine-code,Machine Code,我最近作为一名业余爱好者开始从事逻辑级设计,但现在发现自己遇到了软件,在软件方面我的能力要差得多。基于Etienne Sicard的论文“一个非常简单的微处理器”,我已经在Logisim中完成了定制4位CPU的设计。现在,它完成了我内置的非常有限的功能(加法、逻辑AND、OR和XOR),没有任何可检测的错误(交叉手指),我遇到了为它编写程序的问题。Logisim具有将十六进制数脚本导入RAM或ROM模块的功能,因此我可以使用自己的微指令代码为其编写程序,但我从哪里开始?我实际上处于最基本的软件设

我最近作为一名业余爱好者开始从事逻辑级设计,但现在发现自己遇到了软件,在软件方面我的能力要差得多。基于Etienne Sicard的论文“一个非常简单的微处理器”,我已经在Logisim中完成了定制4位CPU的设计。现在,它完成了我内置的非常有限的功能(加法、逻辑AND、OR和XOR),没有任何可检测的错误(交叉手指),我遇到了为它编写程序的问题。Logisim具有将十六进制数脚本导入RAM或ROM模块的功能,因此我可以使用自己的微指令代码为其编写程序,但我从哪里开始?我实际上处于最基本的软件设计水平,真的不知道从这里走到哪里。关于学习这种低水平编程的资源有什么好的建议,或者关于我应该从这里尝试什么的建议?非常感谢,我知道这可能不是本论坛上提出的最直接适用的问题。

我不知道你提到的论文。但是如果你设计了自己的定制CPU,那么如果你想为它编写软件,你有两个选择:a)用机器代码编写,或者b)编写自己的汇编程序

显然我会和b一起去。这将需要您稍微换档并执行一些高级编程。您的目标是编写一个在PC上运行的汇编程序,并将一些简单的汇编语言转换为您的自定义机器代码。汇编程序本身将是一个高级程序,因此,我建议用一种高级编程语言编写它,这种语言擅长字符串操作和二进制操作。我推荐Python

您基本上希望汇编器能够读取如下文本文件:

    mov a, 7
foo:
    mov b, 20
    add a, b
    cmp a, b
    jg foo
(这个节目是我编的,简直是胡说八道。)

并将每行代码转换为该指令的二进制模式,输出二进制文件(或者可能是十六进制文件,因为您说过微控制器可以读取十六进制值)。从那里,您可以将程序加载到CPU上

因此,我建议你:

  • 提出(在纸上)一种汇编语言,它是机器支持的每个操作码的简单书面表示(您可能已经这样做了)
  • 学习简单的Python
  • 编写一个每次读取一行的Python脚本(
    sys.stdin.readline()
    ),计算出它是哪一个操作码及其值,并将相应的机器码输出到stdout
  • 用汇编语言编写一些将在CPU上运行的汇编代码

  • 听起来像是一个有趣的项目。

    因为您的指令集非常小,而且基于mguica答案中的线索,我想说下一步是继续和/或完全测试您的指令集。有旗子吗?你们有分行指示吗。现在只需手动生成机器代码。标志比较复杂,尤其是溢出(V)位。您必须在msbit加法器上检查进位和进位,以使其正确。由于指令集足够小,您可以尝试背对背指令的各种组合,后跟或,后跟xor,后跟add,或者后跟和或后跟xor,等等,并在分支中混合使用。回到标志,如果xor和或(例如)未触及进位和溢出,则确保您看到进位和溢出为零且未被逻辑指令触及,进位和溢出为1且未被触及,并且单独显示进位和溢出是分开的,一对一关闭,未被逻辑指令触及,等。确保所有条件分支仅在该条件下运行,引入具有在两种状态下均被忽略的标志位的各种条件分支,确保条件分支忽略它们。还要验证如果条件分支不应该修改它们,那么它不会修改它们。同样,如果条件没有导致不触及条件标志的分支

    我喜欢使用随机化,但它可能比你想要的要多。我喜欢独立开发指令集的软件模拟器,我发现它更容易使用,逻辑有时也更容易在批测试中使用。然后,您可以随机化一些简短的指令列表,改变指令和寄存器,通过手动计算一些结果(测试完成后寄存器的状态和标志位的状态)自然地测试测试仪。然后使随机列表变长,在某一点上,您可以获取一个长指令列表,并在逻辑模拟器上运行它,查看逻辑是否产生与指令集模拟器相同的寄存器结果和标志位,如果它们不同,请找出原因。如果不尝试另一个随机序列,另一个。在开始测试之前用素数填充寄存器是一个非常好的主意

    回到单独的指令测试和标志遍历所有的角情况0xFFFF+0x0000 0xFFFF+1,类似的东西只放在操作数和结果的任一侧和右侧,这些操作数和结果与标志在标志更改点和另一侧更改的位置相差一个计数。对于逻辑,例如,如果使用零标志,则具有各种数据模式,用于测试位于零0x0000、0xFFFF 0xFFFE 0x0001 0x0002等任一侧和零处的结果。可能是步行的结果以及0x0001结果0x0002、ox0004等


    希望我理解了你的问题,没有指出显而易见的事情,也没有指出你到目前为止已经做了什么。

    我做了一些类似的事情,你可能会觉得有趣。我还从零开始创建了自己的CPU设计。它是一种基于哈佛体系结构的8位多周期RISC CPU,具有可变长度指令

    我从Logisim开始,然后给eve编码