发布于 2026-01-06 0 阅读
0

用二进制代码编程!这算什么?“机器语言”不是一种语言,而是多种语言的集合。我们要用哪个处理器?快速浏览一下硬件。算法。稍等片刻,我们先用汇编语言编写。汇编代码。精彩部分(欢迎来到矩阵)。总结。DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

用二进制代码编码!这算什么?

“机器语言”不是一种语言,而是多种语言的集合。

我们将使用哪款处理器?

快速浏览一下硬件。

该算法

稍等片刻,我们先用汇编语言编写。

汇编代码

有趣的部分(欢迎来到矩阵)

结论

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

最初发布在我的作品集中

在你妄下任何结论之前,请注意,这篇文章不会让你成为机器语言高手!它的目的是向你展示一个基础且简单的机器语言算法的实现,希望能让你对机器语言的工作原理有更深入的了解。

起初我想向大家展示的是插入排序算法的实现。但在撰写这篇文章的过程中,我发现它的实现对于本文的目标读者——初学者来说可能难以理解。因此,我决定改写一个更简单的算法:计算16个整数(32位整数)之和。

“机器语言”不是一种语言,而是多种语言的集合。

如果您还不知道,机器语言并非像高级语言(例如 C、JavaScript 等)那样是所有机器通用的语言,而是特定于每个微处理器的语言。所以,您应该问的最后一个问题是“我应该使用哪个文本编辑器?”。因为现在您应该问的是“我应该使用哪种文档?”,这取决于您的程序将在哪个微处理器上运行。

我们将使用哪款处理器?

在这个例子中,我将使用摩托罗拉 MC68000,也称为 MC68K,这是一款 32 位处理器,主频高达 2 MHz(没错,你没听错,是兆赫兹)。虽然它比较老旧,但在 80 年代被广泛使用,而且入门也很简单。

快速浏览一下硬件。

首先是微处理器(哇!#显而易见)。除了它的逻辑和算术单元之外,我们感兴趣的是它的寄存器。你可能会问,寄存器是什么?嗯,寄存器是位于微处理器内部的临时存储器。寄存器有两种类型:数据寄存器,用于存储数据(再次感谢显而易见),以及地址寄存器,用于存储内存地址。在我们的例子中,MC68K 有 8 个地址寄存器和 8 个数据寄存器,它们都可以存储最多 32 位的数据。我们还将使用 16 MB 的主内存(是的,谁还需要更多呢?)。

该算法

i ← 0
sum ← 0
while i < length(A)
    sum ← sum + A[i]
end while
Enter fullscreen mode Exit fullscreen mode

或者,如果您更喜欢使用像 C 语言这样更友好的语言:

void sum(int arr[], int n)
{
   int i, sum = 0;
   for (i = 1; i < n; i++)
   {
       sum += arr[i];
   }
}
Enter fullscreen mode Exit fullscreen mode

稍等片刻,我们先用汇编语言编写。

为了避免被大量的“1”和“0”淹没,我们应该从用汇编语言编写代码开始。汇编语言是机器语言的底层。由于汇编语言是一种更友好的二进制编写方式,因此它也被称为机器语言。

汇编代码

终于!为了简化问题,我们假设要使用的数组已经存储在内存中。

注:为简便起见,我将省略一些步骤。

START   MOVE    #15,D0         We initialize the counter, we will be decrementing 
        CLR     D1             We clear some registers nothing fancy, this one for the cumulative sum
        CLR     D2             this one for the current value to add to the sum 
        LEA     ARRAY(PC),A0   We store the array adress in an adress register
        LEA     SUM,A1         We store the memory address where we are going to write the result

 LOOP   MOVE.W  (A0)+,D2       Now copy each each element of the array 
        ADD.L   D2,D1          we add it to the cumulative sum 
        DBRA    D0,BCL         We loop till the counter is equal to -1, yep that's how loops without condition are done in assembly 
        TRAP    #0             We exit ( It's more complicated than that, but hey we're simplifiying )
        SUM     DS.L    1      We're asking for an empty spot in the memory
Enter fullscreen mode Exit fullscreen mode

有趣的部分(欢迎来到矩阵)

稍等片刻,是的,我们将用二进制写入,但不是用 '1' 和 '0',而是用十六进制表示。为了得到二进制代码,我们可以运行一个汇编程序,它会读取每条指令(一条指令就是一行),并将其转换为二进制,然后再读取它写入的内存来读取二进制代码,但这会破坏乐趣。或者我们可以手动转换。为此,我们需要再次查阅处理器文档,了解如何将每条指令及其参数转换为二进制。完成之后,我们将得到以下代码:

303C 000F 4241 4242 41FA 0014 43F9 0000 103E 3418 D282 51C8 FFFA 2281 4E40
Enter fullscreen mode Exit fullscreen mode

如果你坚持,这里是二进制版本:

1100000011110000000000000011110100001001000001010000100100001001000001111110100000000000010100010000111111100100000000000000000001000000111110001101000001100011010010100000100101000111001000111111111111101000100010100000010100111001000000
Enter fullscreen mode Exit fullscreen mode

注意:代码会根据数组地址和程序存放结果的地址略有不同。

结论

我希望这篇文章读起来很有趣,也许你这辈子都不需要用到汇编语言,但是看看我们用自己珍视的高级语言编写的程序在微处理器眼中究竟是什么样的,总是很有趣也很有意思的。

文章来源:https://dev.to/hamza/coding-in-binary-code--a-thing--5bck