如何定义二进制(1 和 0)序列以从相同的自定义编码二进制文件制作汇编语言?
How does one proceed in defining binary (1 & 0) sequences for the making of an assembly language from that same custom encoded binary?
除了二进制本质上只是二进制(十进制符号等)之外,二进制序列仍然必须被编程以表示和启动某些任务。话虽如此,& 更 specific/clarify:
如何实现自定义汇编语言
从头开始自定义助记符,定义值和定义
让二进制文件在特定地址寄存器执行特定任务? (即将键盘键等映射到汇编语言、汇编器等)。
(用于在 64 位计算机上实现)。
简而言之,我想了解如何从二进制开始。本质上是最低级别的操作。这种实施是否需要自定义 CPU/GPU?
所以你问的是汇编语言,它只是一种低级编程语言,通常与特定的指令集体系结构(ISA 或指令集)有直接关系。如果你问你是否可以为现有的 ISA 编写一个新的指令集,绝对没有什么能阻止你这样做而不是像
mov ax,[bx]
你可以做到
ldr ax,[bx]
或
lw ax,(bx)
或
bob pickle,(pencil)
这是你的选择,然后只需编写一个解析器并生成指令即可。
完成。
如果问题是关于从头开始然后从一种或多种汇编语言创建新指令集,Erik 几乎涵盖了它。
您首先需要创建指令集,老实说,由于您提出的问题,您不熟悉指令集或汇编语言。因此,今天我们的优势在于能够检查许多指令集和汇编语言,并从中获得舒适table。同样,如果你想盖房子,现在不是穴居人时代,你不必从头开始弄清楚,有 millions/billions 的房屋可供查看,而不仅仅是墙壁和屋顶的基础知识, 但我喜欢前面还是后面的车库还是 none,一层还是多层。地下室等。同样在这里,我喜欢指令集的哪些方面我不喜欢哪些方面。需要有一个强有力的理由来创建一个新的,所以你已经有一些你不喜欢的东西或者一些商业或教育原因,这意味着你有你希望修复或实现其他指令集没有的细节有或一个有另一个没有,你想找到一个中间立场。
让我们暂时忘记专利,因为它会干扰任何实际实施。
你必须决定诸如固定长度或可变长度之类的事情,但在你到达这里之前很久,你已经有很多指令集的经验,并且你已经在脑海中想到了你尝试创建一个新指令集而不是仅仅创建一个指令集的原因使用一个,或制作一个克隆(再次忘记法律问题)。
对于通用处理器,您将需要一些基础知识,一些 alu 操作加、减、与、异或等...您将需要一些基本的加载和存储指令。某种形式的无条件和条件分支,等等。
您是在制作基于堆栈的处理器还是普通风格的处理器?
如果在开始之前您的想法是您想要可变长度,您仍然需要最小大小,所以可能像 x86 一样,您需要 8 位指令,并且该操作码将是整个指令或描述需要更多字节。或者你可能想要 16 位并且仍然允许可变长度或者使用固定长度,这可能意味着 32 位或 64 位,但是你可以看到 arm、mips、risc-v 和其他可能有 16 位指令和 32位(和更大)有一些方案在它们之间切换。
然后你敲出编码。你想要的与 pc 相关的东西可能有很多立即位,位越多,它可以达到的时间越长,假设是固定长度的指令,如果长度可变,那么你仍然必须决定是否有限制,或者在编码中选择偏移大小的方案。如果已修复,那么您需要一种方法来指示哪些位涵盖这些大型立即编码。
因此,虽然 ARM 的编码对于刚接触 MIPS 的人来说似乎很混乱,但您可以返回到 Acorn 图或什至是 ARM ARM 的一部分,并从最高位开始,看看它一点也不混乱需要更多立即位的指令可以用更少的位来确定,然后它们将另一位和另一位添加到编码中,从而形成唯一的起始位并通过需要更少位的指令来确定指令,直到可以容忍更多的其他指令。例如,1/4 的指令集专用于一种类型的指令,然后 1/8 专用于另一种类型,1/16 的可能编码另一种风格等等。另一种方法是 mips,就像您将一些位保留为操作码位(然后对于某些操作码,其他位随后作为扩展操作码位使用)但总体上受限于您可以在任何指令中使用的内容,但解码要容易得多,a权衡。
您可以像 CISC 一样假设一个微编码架构,一个简单的 8 位操作码,其中这些位不表示任何内容,它们只是形成一个唯一的数字,在 table 中查找该数字以弄清楚它是什么做。你可以看看那一代的visual6502页面和指令集,操作码基本上是一个地址到一个rom,这个rom包含了执行该指令的步骤的微代码。
您可以使用 vliw 指令集,这有点像暴露的微代码,您可以将其与控制信号和寄存器文件地址打包在一起,等等。然后拥有比 RISC 解码和执行更简单的状态机。
您还有许多其他基本指令集问题是有寄存器还是基于堆栈,是否有一个寄存器,两个或 8 个或 16 个或 256 个。您的寻址模式是什么,处理器总线是什么样的,等等.
最终你开始适应指令集。自然地,当你开发这个时,你会在头脑中使用指令名称或写下来,这个指令使用寄存器内容作为地址从内存中加载。这增加了两件事。这个将一个寄存器的内容复制到另一个。因此,作为跟踪自己或与他人交流的一部分,您拥有这些术语,而您的汇编语言可能来自于这些术语。然后你进入它是一个副本还是一个移动你拼写它是mov还是move。您使用 mov 还是 load 和 store,是否将它们拼写成 ld、load、ldr 等。您是先喜欢目的地,还是最后喜欢目的地。您是否有 immediates/constants(添加寄存器 7 = 寄存器 3 + 5)如果有,您是否需要一个解析标记来指示这些并且您是否默认使用十进制或十六进制或八进制或二进制作为语法中值的编码.
然后你开发一个汇编语言然后想开发一个工具。你是用蛮力还是做一些 bison/flex 的事情?或者其他解决方案?
您是否允许汇编程序使用 .org 之类的语句生成完整的二进制文件,或者您是否也或仅强制对象然后必须创建一个 linker 将对象 link 转换为二进制文件?如果你这样做,那么你可以创建其他语言,你可以稍后再做。
在深入实现之前,您至少需要汇编器非常快,这样您就可以测试处理器而不必
手码机器码太多。
有并且已经有指令集包含 tty 指令和其他涉及处理器中特定外围设备的指令。但一般来说,外围设备被映射到总线上的某个地址(I/O 总线或内存总线或组合)并且指令集不关心,在 long 运行 中提供了更灵活的和随着世界的发展而无需更改指令集即可添加或删除外围设备的能力。您可能一般不希望将外围设备集成到指令集中。
现在的 gpu 通常是一个完全独立的指令集,经过相同的过程,但目标更多地针对特定应用程序而不是通用处理器进行调整。但是当然可以将这些组合起来,使指令集既具有通用处理功能,又具有图形处理功能。你可能会发现你可以想出一个方法来让这个 运行 很好,但这通常无济于事,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,raspberry pi 中的那个现在已经有一些记录,毫无疑问还有其他人。
如果您对此很认真,并且正在考虑可以与当前产品竞争的产品,那么您需要愿意为第一个 chip/processor 投资数千万到一亿美元左右。这可能会让您在单个 ghz 范围内得到 运行s 的东西。如果您想进入下一阶段,则将其乘以四可能是 2ghz 以上。当然,您可以构建一个简单的小东西,它几乎什么都不做(没有指令集)但运行速度非常快,而且花费更少,但您问的是带有 gpu 的 64 位处理器。
您需要知道的一切都可以在网上轻松免费找到。您只需要完成指令集、hdl 语言、免费和严肃的 hdl 工具、廉价和不便宜的 sim 解决方案的教育过程。世界上拥有芯片工程师人口的地区有一定比例的休假,因为这是一个过山车业务,x 公司正在制造一种新芯片,在几年内吸纳 50-100 人,然后解雇他们。 Y 公司正在制造新芯片,吸纳 5-100 人,然后裁员。重复。如果你愿意,你可以成为公司z。
为了编写您自己的(汇编或任何)语言,您需要考虑一些事情。
- 很少有变量(可以看作是一元函数的 class)并且函数是常量:它们由您使用的 CPU 定义(例如.., RAX, mov ) 和您正在使用的 OS(例如,来自 Windows、GNU-Linux、*BSD 的 interrupts)。在您无法选择它们的意义上,它们是常量,它们绑定到您选择的目标系统。
- 您想使用的语言(即语法-语义对的函数)。
- rewriting system 将从您的语言翻译成系统常量。可以将其视为函数 builder/reducer/normalizer.
进行此类翻译的一种原始方法是使用汇编宏,它也是函数,也是重写规则。
命令 .macro
和 .endm
允许您定义生成程序集输出的宏。例如,这个定义指定了一个将数字序列放入内存的宏和:
.macro sum from=0, to=5
.long \from
.if \to-\from
sum "(\from+1)",\to
.endif
.endm
根据该定义,SUM 0,5
等同于此汇编输入:
.long 0
.long 1
.long 2
.long 3
.long 4
.long 5
(来自 sourceware.org)
我认为此类项目最重要的部分是设计一个(语言及其)重写系统,该系统将具有良好的特性,即它必须终止,必须汇合,必须规范化。改写规则可以通过汇编宏定义。
除了二进制本质上只是二进制(十进制符号等)之外,二进制序列仍然必须被编程以表示和启动某些任务。话虽如此,& 更 specific/clarify:
如何实现自定义汇编语言 从头开始自定义助记符,定义值和定义 让二进制文件在特定地址寄存器执行特定任务? (即将键盘键等映射到汇编语言、汇编器等)。 (用于在 64 位计算机上实现)。
简而言之,我想了解如何从二进制开始。本质上是最低级别的操作。这种实施是否需要自定义 CPU/GPU?
所以你问的是汇编语言,它只是一种低级编程语言,通常与特定的指令集体系结构(ISA 或指令集)有直接关系。如果你问你是否可以为现有的 ISA 编写一个新的指令集,绝对没有什么能阻止你这样做而不是像
mov ax,[bx]
你可以做到
ldr ax,[bx]
或
lw ax,(bx)
或
bob pickle,(pencil)
这是你的选择,然后只需编写一个解析器并生成指令即可。
完成。
如果问题是关于从头开始然后从一种或多种汇编语言创建新指令集,Erik 几乎涵盖了它。
您首先需要创建指令集,老实说,由于您提出的问题,您不熟悉指令集或汇编语言。因此,今天我们的优势在于能够检查许多指令集和汇编语言,并从中获得舒适table。同样,如果你想盖房子,现在不是穴居人时代,你不必从头开始弄清楚,有 millions/billions 的房屋可供查看,而不仅仅是墙壁和屋顶的基础知识, 但我喜欢前面还是后面的车库还是 none,一层还是多层。地下室等。同样在这里,我喜欢指令集的哪些方面我不喜欢哪些方面。需要有一个强有力的理由来创建一个新的,所以你已经有一些你不喜欢的东西或者一些商业或教育原因,这意味着你有你希望修复或实现其他指令集没有的细节有或一个有另一个没有,你想找到一个中间立场。
让我们暂时忘记专利,因为它会干扰任何实际实施。
你必须决定诸如固定长度或可变长度之类的事情,但在你到达这里之前很久,你已经有很多指令集的经验,并且你已经在脑海中想到了你尝试创建一个新指令集而不是仅仅创建一个指令集的原因使用一个,或制作一个克隆(再次忘记法律问题)。
对于通用处理器,您将需要一些基础知识,一些 alu 操作加、减、与、异或等...您将需要一些基本的加载和存储指令。某种形式的无条件和条件分支,等等。
您是在制作基于堆栈的处理器还是普通风格的处理器?
如果在开始之前您的想法是您想要可变长度,您仍然需要最小大小,所以可能像 x86 一样,您需要 8 位指令,并且该操作码将是整个指令或描述需要更多字节。或者你可能想要 16 位并且仍然允许可变长度或者使用固定长度,这可能意味着 32 位或 64 位,但是你可以看到 arm、mips、risc-v 和其他可能有 16 位指令和 32位(和更大)有一些方案在它们之间切换。
然后你敲出编码。你想要的与 pc 相关的东西可能有很多立即位,位越多,它可以达到的时间越长,假设是固定长度的指令,如果长度可变,那么你仍然必须决定是否有限制,或者在编码中选择偏移大小的方案。如果已修复,那么您需要一种方法来指示哪些位涵盖这些大型立即编码。
因此,虽然 ARM 的编码对于刚接触 MIPS 的人来说似乎很混乱,但您可以返回到 Acorn 图或什至是 ARM ARM 的一部分,并从最高位开始,看看它一点也不混乱需要更多立即位的指令可以用更少的位来确定,然后它们将另一位和另一位添加到编码中,从而形成唯一的起始位并通过需要更少位的指令来确定指令,直到可以容忍更多的其他指令。例如,1/4 的指令集专用于一种类型的指令,然后 1/8 专用于另一种类型,1/16 的可能编码另一种风格等等。另一种方法是 mips,就像您将一些位保留为操作码位(然后对于某些操作码,其他位随后作为扩展操作码位使用)但总体上受限于您可以在任何指令中使用的内容,但解码要容易得多,a权衡。
您可以像 CISC 一样假设一个微编码架构,一个简单的 8 位操作码,其中这些位不表示任何内容,它们只是形成一个唯一的数字,在 table 中查找该数字以弄清楚它是什么做。你可以看看那一代的visual6502页面和指令集,操作码基本上是一个地址到一个rom,这个rom包含了执行该指令的步骤的微代码。
您可以使用 vliw 指令集,这有点像暴露的微代码,您可以将其与控制信号和寄存器文件地址打包在一起,等等。然后拥有比 RISC 解码和执行更简单的状态机。
您还有许多其他基本指令集问题是有寄存器还是基于堆栈,是否有一个寄存器,两个或 8 个或 16 个或 256 个。您的寻址模式是什么,处理器总线是什么样的,等等.
最终你开始适应指令集。自然地,当你开发这个时,你会在头脑中使用指令名称或写下来,这个指令使用寄存器内容作为地址从内存中加载。这增加了两件事。这个将一个寄存器的内容复制到另一个。因此,作为跟踪自己或与他人交流的一部分,您拥有这些术语,而您的汇编语言可能来自于这些术语。然后你进入它是一个副本还是一个移动你拼写它是mov还是move。您使用 mov 还是 load 和 store,是否将它们拼写成 ld、load、ldr 等。您是先喜欢目的地,还是最后喜欢目的地。您是否有 immediates/constants(添加寄存器 7 = 寄存器 3 + 5)如果有,您是否需要一个解析标记来指示这些并且您是否默认使用十进制或十六进制或八进制或二进制作为语法中值的编码.
然后你开发一个汇编语言然后想开发一个工具。你是用蛮力还是做一些 bison/flex 的事情?或者其他解决方案?
您是否允许汇编程序使用 .org 之类的语句生成完整的二进制文件,或者您是否也或仅强制对象然后必须创建一个 linker 将对象 link 转换为二进制文件?如果你这样做,那么你可以创建其他语言,你可以稍后再做。
在深入实现之前,您至少需要汇编器非常快,这样您就可以测试处理器而不必 手码机器码太多。
有并且已经有指令集包含 tty 指令和其他涉及处理器中特定外围设备的指令。但一般来说,外围设备被映射到总线上的某个地址(I/O 总线或内存总线或组合)并且指令集不关心,在 long 运行 中提供了更灵活的和随着世界的发展而无需更改指令集即可添加或删除外围设备的能力。您可能一般不希望将外围设备集成到指令集中。
现在的 gpu 通常是一个完全独立的指令集,经过相同的过程,但目标更多地针对特定应用程序而不是通用处理器进行调整。但是当然可以将这些组合起来,使指令集既具有通用处理功能,又具有图形处理功能。你可能会发现你可以想出一个方法来让这个 运行 很好,但这通常无济于事,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,raspberry pi 中的那个现在已经有一些记录,毫无疑问还有其他人。
如果您对此很认真,并且正在考虑可以与当前产品竞争的产品,那么您需要愿意为第一个 chip/processor 投资数千万到一亿美元左右。这可能会让您在单个 ghz 范围内得到 运行s 的东西。如果您想进入下一阶段,则将其乘以四可能是 2ghz 以上。当然,您可以构建一个简单的小东西,它几乎什么都不做(没有指令集)但运行速度非常快,而且花费更少,但您问的是带有 gpu 的 64 位处理器。
您需要知道的一切都可以在网上轻松免费找到。您只需要完成指令集、hdl 语言、免费和严肃的 hdl 工具、廉价和不便宜的 sim 解决方案的教育过程。世界上拥有芯片工程师人口的地区有一定比例的休假,因为这是一个过山车业务,x 公司正在制造一种新芯片,在几年内吸纳 50-100 人,然后解雇他们。 Y 公司正在制造新芯片,吸纳 5-100 人,然后裁员。重复。如果你愿意,你可以成为公司z。
为了编写您自己的(汇编或任何)语言,您需要考虑一些事情。
- 很少有变量(可以看作是一元函数的 class)并且函数是常量:它们由您使用的 CPU 定义(例如.., RAX, mov ) 和您正在使用的 OS(例如,来自 Windows、GNU-Linux、*BSD 的 interrupts)。在您无法选择它们的意义上,它们是常量,它们绑定到您选择的目标系统。
- 您想使用的语言(即语法-语义对的函数)。
- rewriting system 将从您的语言翻译成系统常量。可以将其视为函数 builder/reducer/normalizer.
进行此类翻译的一种原始方法是使用汇编宏,它也是函数,也是重写规则。
命令 .macro
和 .endm
允许您定义生成程序集输出的宏。例如,这个定义指定了一个将数字序列放入内存的宏和:
.macro sum from=0, to=5
.long \from
.if \to-\from
sum "(\from+1)",\to
.endif
.endm
根据该定义,SUM 0,5
等同于此汇编输入:
.long 0
.long 1
.long 2
.long 3
.long 4
.long 5
(来自 sourceware.org)
我认为此类项目最重要的部分是设计一个(语言及其)重写系统,该系统将具有良好的特性,即它必须终止,必须汇合,必须规范化。改写规则可以通过汇编宏定义。