是否可以用二进制编程?

时间:2011-02-11 02:12:38

标签: binary

标题真的说明了一切。我的一个朋友告诉我,他知道有人可以用二进制编程。我从来没有听说过有人用二进制编程,一些快速的谷歌搜索没有返回任何有用的东西。所以我想我会转向SO社区。有没有人有关于二进制编程的任何信息,如果可能的话可能是一个快速的Hello World示例。提前谢谢。

6 个答案:

答案 0 :(得分:43)

当然。它通常被称为machine code。没有助记设备,它基本上是assembly language。非常了解装配的人可以通过额外的努力在机器代码中编程,根据需要参考操作码列表(例如x86)。

我会这样做吗?没有。即使是组装只在极少数情况下有用,并且没有理由(除了证明你的技能)拒绝assembler的帮助。

由于您询问了hello world,您应该查看this article。他展示了他如何编写,然后优化了x86 ELF程序来输出它。它最初是用nasm编写的,然后在十六进制编辑器中修改。

答案 1 :(得分:11)

很有可能记住机器代码相当于汇编指令。实际上,当用汇编语言编写代码时,经常会看到通过machine code monitordisassembler s,assembly listings等的十六进制代码。结果,随着时间的推移,一些指令可以被记忆十六进制形式,没有任何额外的努力。

Apple II 6502 ROM Monitor

  • 在图片中可以看到6502 ROM监视器,并排显示十六进制代码和汇编助记符。

您需要的第二个技能是将十六进制代码从头脑中翻译成二进制代码,这很容易通过一些技巧解释一下。但是记住二进制等效的所有十六进制数字非常容易,毕竟其中有16个(不多,不是吗?)。

让我们假设它是1988年,我们花了将近十年的时间将8位视频游戏移植到不同的平台上,因此记住了以下6502十六进制代码指令对应于装配说明:

OPCODE       HEX
LDA #$44     0xA9 0x44
STA $44      0x85 0x44
STA ($44),Y  0x91 0x44
LDY #$44     0xA0 0x44

(或在另一个生命中,pretend it is 1974, our name is Paul Allen, we are on a plane to Boston, and we have to write a bootloader for Altair 8800 with pen and paper

如果仅记忆上述操作码,我们只需使用笔和纸即可编写以下机器代码

0xA9 0x00 0x85 0x01 0xA9 0x02 0x85 0x02 0xA0 0x00 0xA9 0x01 0x91 0x01

实际上以上是以助记符形式的汇编代码

LDA #00
STA $01
LDA #02
STA $02
LDY #00
LDA #01
STA ($01), Y
  • 上面的代码在6502asm.com汇编程序/模拟器的屏幕左上角放置一个白色像素,然后继续试用!

如果你以二进制形式记住每个十六进制数字,你可以用二进制编写整个代码。

但是如果你没有记住它们,或者不确定二进制形式是什么,那么很容易用以下技巧转换它们:

1   1   1   1               
|   |   |   |               
v   v   v   v               
8 + 4 + 2 + 1
|   |   |   +---> 2^0 * 1   Ex: 13 is 8 + 4 + 0 + 1
|   |   +-------> 2^1 * 1             1   1   0   1 -> 1101 (0xD)
|   +-----------> 2^2 * 1   Ex:  7 is 0 + 4 + 2 + 1
+---------------> 2^3 * 1             0   1   1   1 -> 0111 (0x7)

这有助于人们动态地编写二进制代码:

LDA #00     -> 0xA9 0x00 -> 10101001 00000000
STA $01     -> 0x85 0x01 -> 10000101 00000001
LDA #02     -> 0xA9 0x02 -> 10101001 00000010
STA $02     -> 0x85 0x02 -> 10000101 00000010
LDY #00     -> 0xA0 0x00 -> 10100000 00000000
LDA #01     -> 0xA9 0x01 -> 10101001 00000001
STA ($01),Y -> 0x91 0x01 -> 10010001 00000001

凭借一些复古的计算精神,以及获得乐趣的动力,我们实际上可以用二进制编写整个代码,而无需写下中间步骤。

答案 2 :(得分:7)

不再需要它,但它已经完成了。曾经有一段时间可以从前端控制台将代码输入二进制系统。这很容易出错。

我曾经有一个用ASCII编码的非常短的uudecoe程序,它可以作为UUEncoded文件的前缀。生成的文件将是自解压缩的,可以通过电子邮件发送。我希望机器代码是手工完成的。我找不到它,即使我可以也没有用它。

答案 3 :(得分:7)

当然,您可以为机器代码编写二进制文件,然后通过六角键盘将机器代码输入计算机。我把一台基于TMS1100的计算机放在一起。

在六角形LED上显示5的简单程序将是以二进制形式写入的0001000 0000101 0000001转换为机器代码,即8 5 1。然后该程序将运行并在LED上显示5。

您可以使用TMS1100对更复杂的程序执行此过程,我想用二进制编程。

实际上,如果您对数学和编程感兴趣,我认为这是非常令人满意和有益的。

答案 4 :(得分:7)

对于勇敢的人:您可以尝试获取MikeOS软盘映像并运行monitor.bin程序。它允许您手动输入十六进制操作码并执行它们。例如(如文档中所述),输入以下说明: BE0790 E8FD6F C3 4D00$会在屏幕上生成一个MHexadecimal code

答案 5 :(得分:-2)

有一些深奥的编程语言。它们被用作实验,并且相当不实用,但是一个名为BrainF ** k(是的,它实际上是一个真实的东西)使用八个不同的字符来修改字节值。这些语言尽可能接近。

相关问题