【发布时间】:2014-01-20 11:51:22
【问题描述】:
我不需要复习任何东西。我通常会问如何在二进制文件的数据段中编码数据字符串以在bare metal 上执行。
目的?假设我正在编写一个引导加载程序,我需要定义文件中使用的静态数据来表示要移动到内存地址的字符串,例如使用Genesis TMSS issue。
我假设地址的二进制编码在字面上翻译为二进制,相当于其在摩托罗拉 68000 内存映射中的十六进制表示,所以目前这不是问题。
问题是...如何在二进制代码中编码字符串/字符/字形以在 M68000k 操作码中进行编码?我阅读了手册、参考资料等,但没有人完全触及这一点(从我通读的内容来看)。
假设我想编码move.l #'SEGA', $A14000。我会得到这个结果操作码(不考虑如何编码 ASCII 字符):
0010 1101 0100 0010 1000 0000 0000 0000
半字节 1 = MOVE LONG,半字节 2 = 内存寻址模式,后面三个字节等于地址。
我的问题是,我是否可以将每个字符编码为文字 ASCII 中的每个字符串,作为指令前面 MAM 半字节的一部分?
此时我很困惑,希望有人知道如何在指令中编码数据文本。
【问题讨论】:
-
您正在编写自己的汇编程序吗?如果是这样,您可能可以在 M68000 程序员手册中查找整数常量的编码(例如
#'SEGA'应该与#0x53454741相同)。如果您只是编写使用现有汇编器编译的汇编代码,那么为什么不让该汇编器处理如何对指令进行编码呢? -
什么?不,我的目标是在架构可想象的最低级别编写代码(即“机器代码”)。我没有使用任何汇编程序,这都是关于编码字符的。我正在从头开始以二进制格式编写操作码;不组装,也不编写汇编程序;只是用 M68000 二进制代码编码。
-
好吧,查看反汇编代码并阅读 M68000 程序员参考手册可能会帮助您弄清楚这些问题。但实际上,与编写汇编代码相比,手工编写机器代码并没有任何优势。它不会让你在“较低级别”做任何事情;编写完全相同的代码将花费更长的时间。
-
@Michael 我意识到,但是以二进制形式进行可以更好地了解微序列器的工作原理,以及芯片的整个本质是如何构造的(例如是或否、1 或 0、翻转-触发器,晶体管等)。谢谢。
标签: encoding binary cpu cpu-architecture opcode