如何定义二进制1 和 0序列以从同一个自定义编码的二进制文件制作汇编语言?

如何解决如何定义二进制1 和 0序列以从同一个自定义编码的二进制文件制作汇编语言?

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

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

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

解决方法

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

mov ax,[bx]

你可以做到

ldr ax,[bx]

lw ax,(bx) 

bob pickle,(pencil)

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

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

您首先需要创建指令集,老实说,由于您提出的问题,您不熟悉指令集或汇编语言。所以今天我们的优势是能够检查许多指令集和汇编语言并熟悉它们。以同样的方式,如果你想建一所房子,这不是穴居人时代,你不必从头开始解决,有数百万/数十亿的房屋需要查看,而不仅仅是墙壁和屋顶的基础,但是我喜欢前面还是后面的车库还是没有,一层还是多层。地下室等。同样,我喜欢指令集什么我不喜欢什么。需要有一个强有力的理由想要创建一个新的,这样你就必须有你不喜欢的东西,或者一些商业或教育原因,这意味着你有其他指令集没有的细节要修复或实施有或一个有,另一个没有,你想找到一个中间立场。

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

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

对于通用处理器,您将需要基础知识、许多 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,例如您将一些位保留为操作码位(然后对于某些操作码,其他位然后作为扩展操作码位使用),但总体上受任何指令中可以容纳的内容的限制,但解码要容易得多,一个权衡。

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

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

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

最终您开始适应指令集。自然地,当你开发这个时,你会在你的头脑中使用名称作为指令或写下来,这个使用寄存器内容作为地址从内存中加载。这个增加了两件事。这将一个寄存器的内容复制到另一个。因此,作为跟踪自己或与他人交流的一部分,您有这些术语,您的汇编语言可能来自于此。然后你进入它是副本还是移动,你拼写它是移动还是移动。您是使用 mov 还是 load and store,您是否将它们拼写为 ld、load、ldr 等。您是先喜欢目的地,还是最后喜欢目的地。您是否有立即数/常量(添加寄存器 7 = 寄存器 3 + 5),如果有,您是否需要解析标记来指示这些,并且您是否默认使用十进制或十六进制或八进制或二进制作为语法中值的编码。

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

您是否允许汇编器使用 .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方面就去研究一些gpu吧,raspberry pi中的那个现在已经有一些文档了,毫无疑问还有其他的。

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

您需要知道的一切都可以在网上轻松免费找到。您只需要按照自己的方式完成指令集、hdl 语言、免费和严肃的 hdl 工具、廉价而不廉价的 sim 解决方案的教育过程。世界上拥有芯片工程师人数的地区有一定比例的休假,因为这是过山车的业务,x 公司正在制造一种新芯片,几年内吸纳 50-100 人,然后解雇他们。 y 公司正在制作一个新的芯片,吸纳 5-100 人,然后把他们放下。重复。如果你愿意,你可以成为 z 公司。

,

为了编写您自己的(汇编或任何)语言,您需要考虑几件事。

  • 很少有变量(可以看作是一类一元函数)和函数是常量:它们由您使用的 CPU(例如 RAX、mov)和您使用的操作系统(例如.,interrupts 来自 Windows、GNU-Linux、*BSD)。从某种意义上说,它们是常量,您无法选择它们,它们绑定到您选择的目标系统。
  • 您想要使用的语言(即语法-语义对的函数)。
  • rewriting system 将把你的语言翻译成系统常量。人们可以将其视为一个函数构建器/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

我认为这样的项目最重要的部分是设计一个(语言及其)重写系统,它具有良好的特性,即它必须终止,它必须是融合的,它必须是规范化的。重写规则可以通过汇编宏来定义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res