你是说,用手?
手动获取微处理器的指令集表,了解寻址模式和其他数据表示问题,然后将其转换为方便的东西,例如十六进制表示法。
然后,您需要使用某些特定于设备的进程(来自磁盘的文件、来自串行线路的文件、从带有一堆开关的前面板键入)将该信息获取到设备内存中。
显然,您可能需要解决各种工具链问题才能将二进制文件放入机器中。如果你只是为了笑,十六进制、铅笔和便笺簿已经适合很多年了。
编辑 -
你必须知道几件事。
首先,操作码,连同操作码,您需要知道寻址模式。
考虑这个 6502:
LDA #$00
LDA $00
LDA $1234
这是 6502 上的三种不同指令。
第一个加载累加器 (A) 与 $00, 0 十六进制。# 符号告诉汇编器您正在使用“立即”寻址模式(6502 总共有 13 种寻址模式)。
第二个将位于地址 $0000 的内存位置的值加载到累加器。在 6502 上,它具有“零页”模式,因此它可以更轻松地从内存的第一页(地址 $0000-$00FF)访问内存。
第三个将位于地址 $1234 的内存位置的值加载到累加器中。这是绝对寻址,只需指定您感兴趣的内存的实际地址。
我强调这个例子是因为乍一看,这三个看起来都一样。但实际上,它们都编译为 3 个不同的指令或操作码。因此,了解您的程序集告诉您的内容非常重要,这样您就可以为您的处理器选择正确的操作码。
现在,如果您查看 6502 的操作码指南并查找 LDA 指令,您将看到每条指令的不同二进制值。
所以,在这种情况下,你会得到:
$A9 $00
$A5 $00
$AD $12 $34
这是这 3 条指令的二进制(十六进制)表示。
第一个 $A9 用于“立即”寻址模式,第二个 $A5 用于零页寻址,最后 $AD 用于绝对寻址。
另请注意,操作数后面是参数。对于 6502,它们只是跟随在字节流中。不同的处理器做不同的事情。请注意,对于 Absolute,我们有 2 个字节,$12 和 $34,每个字节代表总的 16 位地址的一半。我相信这是正确的,地址的最高有效字节首先出现,但它可能会颠倒过来($A9 $34 $12)。
所以,这就是手工组装的基础。
其他需要注意的问题是程序集将加载到的位置等问题。这将影响标签等内容的值。
在 6502 中:
label: LDA #$00
JMP label
如果您的程序集从地址 $1000 开始,这将组合为:
$A9 $00
$4C $10 $00
如果您的程序集从地址 $5555 开始,则:
$A9 $00
$4C $55 $55
看,JMP (Jump) 指令 ($4C) 需要一个地址来跳转,并且你的程序集中的标签是相对于它在程序中的位置的。方便的是,在这种情况下,标签位于最开始。但是您可以看到地址是如何编码到最终机器代码中的。
6502 很容易(非常容易)组装。现代处理器,嗯,不是。现代汇编器为你做了很多工作,你有更复杂的 CPU 和更大的指令集,还有对齐问题——这些都是 6502 所缺少的。但作为一个手工汇编器,你要负责所有那些细微差别。
您的微处理器手册应该会告诉您这些细微差别。但是对于现代复杂的 CPU,做和学习可能并非易事。
不一定要阻止您这样做,但请注意,这可能需要大量工作。
但这是您需要做的事情的本质。