首页 > 解决方案 > 如何从相同的自定义编码二进制文件中定义二进制(1 和 0)序列以制作汇编语言?

问题描述

除了二进制本质上只是二进制(十进制符号等)之外,二进制序列仍然必须被编程来表示和启动某些任务。话虽如此,&更具体/澄清:

如何从头开始使用自定义助记符实现自定义汇编语言,定义二进制的值和定义以在特定地址寄存器执行特定任务?(即映射键盘键等,然后映射到汇编语言、汇编程序等)。(用于在 64 位计算机上实现)。

简而言之,我正在询问从二进制从头开始。本质上是最低级别的操作。这种实现是否需要自定义 CPU/GPU?

标签: assemblybinarycpu-architectureinstruction-setmachine-code

解决方案


因此,您询问汇编语言,它只是一种低级编程语言,通常旨在与特定指令集架构(ISA 或指令集)有直接关系。如果你问是否可以为现有的 ISA 构建一个新的指令集,那么绝对没有什么能阻止你这样做,而不是像

mov ax,[bx]

你可以做到

ldr ax,[bx]

或者

lw ax,(bx) 

或者

bob pickle,(pencil)

这是您的选择,然后只需编写一个解析器并生成指令。
完毕。

如果问题是关于从头开始创建新指令集,然后从一种或多种汇编语言创建新指令集,Erik 几乎涵盖了它。

您首先需要创建指令集,老实说,由于您提出的问题,您不熟悉指令集或汇编语言。因此,今天我们的优势在于能够检查许多指令集和汇编语言并熟悉它们。同样,如果您想建造房屋,这不是穴居人时代,您不必从头开始解决这个问题,有数百万/数十亿的房屋可供查看,而不仅仅是墙壁和屋顶的基础知识,而是我喜欢前面的车库还是后面的车库,还是没有车库,一层还是多层。地下室等。同样在这里,我喜欢指令集什么我不喜欢。需要有一个强烈的理由想要创建一个新的,所以你已经有一些你不喜欢的东西或者一些商业或教育的原因,

让我们暂时忘记那些会干扰任何实际实施的专利。

您必须决定诸如固定长度或可变长度之类的事情,但在您到达这里很久之前,您已经拥有许多指令集的经验,并且您想到了为什么要尝试创建新指令集而不是仅使用指令集,或者制作克隆(再次忘记法律问题)。

对于通用处理器,您将需要基础知识、一些 alu 操作 add、sub 和 xor 等……您将需要一些基本的加载和存储指令。某种形式的无条件和条件分支,等等。

您是在制作基于堆栈的处理器还是普通风格的处理器?

如果在您开始之前您的想法是可变长度,您仍然需要一个最小大小,所以可能像 x86 一样您需要 8 位指令,并且该操作码将是整个指令或描述需要更多字节。或者你可能想要 16 位并且仍然允许可变长度或使用固定长度,这可能意味着 32 位或 64 位,但是你可以使用 arm、mips、risc-v 和其他可能看到你可以拥有 16 位指令和 32有点(和更大),有一些方案可以在它们之间切换。

然后你敲出编码。与 pc 相关的东西你可能想要有很多直接位,它可以达到的位越多,假设固定长度的指令,如果长度可变,那么你仍然必须决定是否有限制,或者方案来选择编码中的偏移大小。如果已修复,那么您需要一种方法来指示哪些位覆盖了这些大型立即编码。

因此,虽然 ARM 的编码对于那些在 MIPS 上咬牙切齿的人来说似乎是混乱的,但你可以回到 Acorn 图表甚至 ARM ARM 的部分,看看它根本没有混乱,从需要更直接的最高位指令开始可以用更少的位来确定位,然后他们将另一个位和另一个位添加到编码中,从而形成唯一的起始位,并通过需要较少位来确定指令的指令,直到可以容忍更多位的其他指令。例如,指令集的 1/4 专用于一种类型的指令,然后 1/8 专用于另一种类型,可能的编码的 1/16 专用于另一种类型,依此类推。

你可以像 CISC 一样假设一个微编码架构,一个简单的 8 位操作码,其中的位不表示任何内容,它们只是形成一个唯一的数字,在表格中查找以找出它的作用。您可以查看该代的visual6502页面和指令集,操作码基本上是一个ROM地址,ROM包含实现该指令的步骤的微码。

你可以选择一个 vliw 指令集,它有点像暴露的微码,你可以用控制信号和寄存器文件地址打包那个东西。然后拥有比 RISC 解码和执行更简单的状态机。

您还有许多其他基本指令集问题是有寄存器还是基于堆栈,是否有一个寄存器,两个或 8 个或 16 个或 256 个寄存器。您的寻址模式是什么,处理器总线是什么样的,等等。

最终你开始适应指令集。自然地,当您开发此程序时,您会在头脑中使用名称作为指令或写下来,使用寄存器内容作为地址从内存中加载此名称。这个增加了两件事。这将一个寄存器内容复制到另一个。因此,作为跟踪自己或与他人交流的一部分,您拥有这些术语,您的汇编语言可能来自于这些术语。然后你进入它是一个副本还是一个移动,你拼写它是移动还是移动。你使用 mov 还是 load 和 store 并且你拼写它们 ld、load、ldr 等。你喜欢目的地第一,你喜欢目的地最后。

因此,您开发了一种汇编语言,然后想开发一种工具。你是用蛮力还是做一些野牛/弯曲的事情?还是其他解决方案?

您是否允许汇编器使用 .org 之类的语句制作完整的二进制文件,或者您是否也或仅强制对象,然后必须创建一个链接器将对象链接到二进制文件中?如果你这样做了,那么你可以创建其他语言,然后你可以在以后继续工作。

在深入实现之前,您至少需要非常快的汇编程序,这样您就可以测试处理器,而不必手动编写太多机器代码。

已经存在并且已经存在具有诸如 tty 指令之类的指令集以及涉及处理器中特定外围设备的其他指令集。但一般来说,外围设备映射到总线上的某个地址(I/O 总线或内存总线或组合),指令集并不关心,从长远来看,它提供了更灵活的添加或删除外围设备的能力随着世界的发展,无需更改指令集。通常,您可能不想将外围设备集成到指令集中。

现在 gpu 通常是一个完全独立的指令集,它经过相同的过程,但目标是针对特定应用程序而不是通用处理器进行调整。但是当然可以将它们组合在一起,使其具有既具有通用处理功能又具有图形处理功能的指令集。你可能会发现你可以想办法让它运行良好,但这通常无济于事,GPU 演变为从主处理器卸载工作,因此主处理器可以继续努力工作,并将特定工作传递给显卡。请给我画一个正方形,而不是这里是我必须一次计算一个的 4000 像素。

然后你需要编译器,然后是操作系统、应用程序和客户。正如你所看到的,wintel vs linux on arm,一个对用户和另一个一样有用,一个消耗更多的功率,等等。但是由于非技术性的原因,你将很难打破现有世界。

所以最重要的是,你问这个问题意味着你还没有准备好开始这样的任务,你需要去学习至少十几个指令集,以及它们的汇编语言,最好是来自不同历史时期的不同公司。pdp8、pdp11、6502、8051、68K、x86、arm、risc-v、PIC、msp430、avr mips、powerpc、sparc,仅举几例。可能还有其他一些人,比如 amd29000 和基于堆栈的 zpu 是什么?或者也许只是这样做,查看 gnu 支持的每一个指令集以及 llvm 支持的所有指令集。您将保留应该在您的列表中的 pdp11,期间,但会丢失 pdp8 和 6502,它们具有一些独特的功能,在初始检查时可能会或可能不会明显,但值得了解以保持头脑清醒。然后对于gpu方面,去研究一些gpus,

如果您对此很认真,并且正在考虑一种可以与当前产品竞争的产品,那么您需要愿意为第一个芯片/处理器投资数十到上亿美元。这可能会为您提供在单 ghz 范围内运行的东西。如果您想进入下一阶段,则将其乘以 4 可能会超过 2ghz。当然,您可以构建一个几乎什么都不做(没有指令集)但运行速度非常快且花费更少的简单小东西,但是您正在询问带有 gpu 的 64 位处理器。

您需要知道的一切都可以在网上免费找到。您只需要通过指令集、hdl 语言、免费和严肃的 hdl 工具、便宜而不便宜的 sim 解决方案的教育过程来工作。世界上的芯片工程师人口占一定比例的地区,因为它是一个过山车业务,公司 x 正在制造一种新芯片,在几年内吸纳 50-100 人,然后解雇他们。y 公司正在制造一个新芯片,吸纳 5-100 人,然后将他们淘汰。重复。如果你愿意,你可以成为 z 公司。


推荐阅读