如何在计算机中执行最基本的门级操作?

问题描述

如何在没有编程语言的情况下(甚至在没有内核帮助的情况下)直接使用硬件以计算机中的位级别执行操作?

例如,用C语言编写的代码

unsigned char a = 0;
unsigned char b = 1;
unsigned char c = a|b;

我想直接用我的计算机硬件执行此操作(请求3个字节的内存并修改这些字节),而无需使用任何编程语言(即我想自己编写机器代码)。如果可能,即使没有内核的帮助。如何做以及在何处了解这些?

我目前使用的是Ubuntu 18,内核5.4.0-52-generic。我有Intel第八代Core i5笔记本电脑。让我知道是否需要更详细地说明我的系统规格。

解决方法

首先,您当然必须拥有处理器的文档,该文档定义了包括机器代码的指令集。

接下来,您将编写不是无效代码的内容:

unsigned int fun ( unsigned int a,unsigned int b )
{
    return(a|b);
}

故意不使用x86

Disassembly of section .text:

00000000 <fun>:
   0:   e1800001    orr r0,r0,r1
   4:   e12fff1e    bx  lr

然后,您可以检查与文档相关的机器代码,并了解这些说明的编码。

那真是微不足道。

最大的问题是您打算如何运行此代码?您说的是没有内核,这意味着没有操作系统,这意味着裸机,这意味着您必须启动处理器,它需要详细的处理器和系统(芯片/主板/媒体/等)信息。很显然,随着计算机的启动和运行或微控制器的出现,这是有可能的(对于此类培训而言,明显更好的选择,避免将x86作为第一个ISA也是一个不错的选择)。甚至是更好的模拟器/模拟器,因为您具有更好的可见性并且不易变形,在这里硬件不难建立,有时不难用劣质软件散发出来。

根据您的问题,您需要先爬网,然后再行走。从所示的简单功能开始,您可以使用某些工具(gnu是您的朋友,但也是敌人,因为它需要时间来掌握,但它功能非常丰富)使用机器代码编写并将其输入到汇编器中

.globl fun
fun:
    .inst 0xe1800001
    .inst 0xe12fff1e

Disassembly of section .text:

00000000 <fun>:
   0:   e1800001    orr r0,r1
   4:   e12fff1e    bx  lr

如果您不想使用汇编程序并希望自己创建二进制文件,则必须阅读文件格式,许多文件都会发布,这甚至是微不足道的任务,尤其是如果您从头开始编写工具这样做并不依赖于库,但它取决于您和文件格式。不确定您真正感兴趣的切线和研究项目有多少。它们都有价值,但是您真正想学习什么和/或您的需求的优先顺序是什么。

您正在寻找可能要工作几个月到几年的时间,具体取决于您的工作状况。解决此问题的最佳方法是先使用可用的工具和沙箱,然后再根据需要替换它们,而不是在没有任何现有工具帮助的情况下从头开始编写所有内容。

您希望使用现有的锤子来制造更好的锤子,确定自己喜欢做什么和不喜欢做什么,然后再制作自己的锤子。您绝不会不使用任何一种方法而尝试创建一种方法并期望获得任何成功。还是在任何合理的时间表内成功。

从头开始做所有事情的一个大问题是,您需要将字节放入闪存,RAM或某种媒体中,以便处理器可以获取并运行它们。如果没有一些工具,这可能是您无法做到的;带有原始字节的操作系统可以完全正常运行;某些具有硬件功能的工具可以对闪存进行编程,然后使用所有这些工具将原始位编程到该闪存中。现在有些闪烁,您可能可以使用开关(必须解决弹跳问题),例如在旧DEC的正面或其他地方,然后通过用于编程设备的协议来切换方式,因此只需要铅笔/钢笔和纸以及开关和布线作为工具。

使用指令集模拟器并根据其支持的文件格式,滚动自己的二进制创建工具,或使用汇编程序或类似的使文件馈入sim的方法,效果会更好。甚至更好地制作自己的模拟器,使您比大多数经验丰富的专业人员更好地学习指令集……然后,您当然可以创建自己的二进制创建工具来进行匹配。如果您没有采用现有的指令集和工具集,并学会了在汇编/机器语言级别进行编程,了解其工作原理,使用/生成的指令以及文档中的编码,则很可能会失败。等

大多数新的指令集,软件人员可以直接与硅芯片人员接触(沿着大厅走到人员办公室,或通过电话致电他们),并且可以询问有关指令编码的问题。由于您无法执行此操作,因此您必须询问现有的,调试过的工具,因此,当我从上面开始时,请询问编译器,询问汇编器。然后将其反汇编,然后假定汇编器产生了正确的指令,并将其与处理器文档进行了比较(要知道工具和文档都可能有错误,因此您必须进行处理)。