是否可以用二进制编程?

Ada*_*m P 39 binary

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

Mat*_*hen 44

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

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

既然你问过hello world,你应该查看这篇文章.他展示了他如何编写,然后优化了x86 ELF程序来输出它.它最初是用nasm编写的,然后在十六进制编辑器中修改.

  • 我想我会称之为一种技能,就像我用舌头触摸你的鼻尖一样; 有趣,基本没用. (7认同)

neu*_*sys 12

记住与装配指令等效的机器代码是非常可能的.实际上,当用汇编语言编写代码时,经常会看到通过机器代码监视器,反汇编程序,汇编列表等看到十六进制代码.结果,随着时间的推移,一些指令可以以十六进制形式存储而无需任何额外的努力.

Apple II 6502 ROM监视器

  • 在图中可以看到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
Run Code Online (Sandbox Code Playgroud)

(或者在另一个生活中,假装它是1974年,我们的名字是保罗·艾伦,我们在飞往波士顿的飞机上,我们必须用笔和纸为Altair 8800写一个引导程序)

仅使用上面记录的操作码,我们可以仅使用笔和纸编写以下机器代码:

0xA9 0x00 0x85 0x01 0xA9 0x02 0x85 0x02 0xA0 0x00 0xA9 0x01 0x91 0x01
Run Code Online (Sandbox Code Playgroud)

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

LDA #00
STA $01
LDA #02
STA $02
LDY #00
LDA #01
STA ($01), Y
Run Code Online (Sandbox Code Playgroud)
  • 上面的代码在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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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


Bil*_*hor 7

没有太多的要求它,但它已经完成.曾经有一段时间可以从前端控制台将代码输入二进制系统.这很容易出错.

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


小智 7

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

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

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

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


小智 7

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