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

How to perform the most basic gate-level operations in a computer?

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

例如,C 中的代码可能

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

我想直接使用我的计算机硬件而不使用任何编程语言(即我想自己编写机器代码)来完成(请求 3 个字节的内存并修改这些字节)。如果可能,即使没有内核的帮助。如何做以及从哪里了解这些?

我目前正在使用 Ubuntu 18,内核 5.4.0-52-generic。我有英特尔第 8 代酷睿 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

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

这些都是微不足道的。

最大的问题是你打算如何运行这段代码?你说没有内核意味着没有操作系统意味着裸机意味着你必须启动处理器,这需要详细的处理器和系统 (chip/motherboard/media/etc) 信息。当您的计算机启动和 运行s 或您的微控制器时,这显然是可能的(对于这种教育来说是更好的选择,避免将 x86 作为第一个 ISA 也是一个不错的选择)。或者甚至更好 emulator/simulator 因为你有更好的可见性而且它是不可砖化的,硬件不难变砖,有时也不难用糟糕的软件让烟熄灭。

根据你的问题,你需要先爬再走,先走再走运行。从所示的简单函数开始,你可以使用某些工具(gnu 是你的朋友也是敌人,因为它需要时间来掌握,但它的功能非常丰富)使用机器代码编写并将其提供给汇编程序

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

Disassembly of section .text:

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

如果您不想使用汇编程序并想自己创建二进制文件,那么您必须阅读文件格式,许多已发布,这是一项微不足道的任务 even/especially 如果您编写一个从头开始做的工具,不依赖库,但它取决于你和文件格式。不确定您真正感兴趣的切线和研究项目有多少。它们都有价值,但您真正想学习的是什么and/or您的愿望的优先级是什么。

根据您真正追求的目标,您可能需要花费数月到数年的时间。解决这个问题的最佳途径是首先使用可用的工具和沙箱,然后根据需要替换它们,而不是在没有任何现有工具帮助的情况下从头开始编写所有内容。

您想打造一把更好的锤子,您可以从使用现有的锤子开始,决定您喜欢什么和不喜欢什么,然后自己制作。你不会在没有使用过一个的情况下就离开并尝试创建一个并期望任何成功。或在任何合理的时间表内取得成功。

从头开始做所有事情的一个大问题是您需要将字节放入闪存或 ram 或某些媒体中,以便处理器可以获取并 运行 它们。如果没有一些工具,您可能无法做到这一点,一台功能齐全的计算机,带有您获取原始字节的操作系统,一些能够对闪存进行编程并使用所有这些工具将原始位编程到该闪存中的硬件工具。现在有些闪光灯你可能可以使用开关(必须解决弹跳问题),比如在旧 DEC 或其他东西的前面,并通过用于编程设备的协议切换你的方式,因此只需要 pencil/pen 和纸和开关和接线作为工具。

你最好使用指令集模拟器,并根据它支持的文件格式,滚动你自己的二进制创建工具或使用汇编程序或类似的东西来制作文件来提供 sim。或者甚至更好的做法是制作自己的模拟器,这样您就可以比大多数经验丰富的专业人员更好地学习指令集……当然,您可以创建自己的二进制创建工具来匹配。如果您没有使用现有的指令集和工具集并学会在 assembly/machine 语言级别编程,您很可能会失败,看看它是如何工作的,请参阅说明 used/generated,以及文档查看编码等

大多数新指令集,软件人员可以直接联系硅片人员(走下大厅到人员办公室,或打电话给他们 phone),并可以询问有关编码的问题一条指令。因为你不能这样做,所以你必须询问现有的、调试过的工具,所以正如我在上面开始的那样,询问编译器,询问汇编器。然后反汇编它然后假设汇编程序生成了正确的指令并将其与处理器文档进行比较(了解工具和文档都可能有错误所以你必须解决这个问题)。