如何在二进制操作码指令中编码 ASCII 文本?
Posted
技术标签:
【中文标题】如何在二进制操作码指令中编码 ASCII 文本?【英文标题】:How to encode ASCII text in binary opcode instructions? 【发布时间】: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、翻转-触发器,晶体管等)。谢谢。
【参考方案1】:
嗯,我经历过 4 种不同的汇编语言编程,摩托罗拉 M68HC11 就是其中之一。根据我的经验,ASCII 仅用于显示目的。低级 CPU 将所有内容都视为二进制值,它无法区分 ASCII 字符和其他字符。尽管像 x86 这样的高级汇编语言支持像 AAA(ASCII 为加法调整)这样的指令,它确保在添加两个 ASCII 数字后,结果仍然是合法的 ASCII 数字。 所以主要是汇编程序依赖,如果汇编程序支持指令 move.l #'SEGA', $A14000 这可能有效,但由于您没有使用汇编程序并直接编写操作码,您必须将 ascii 编码为二进制,示例 ascii 数字 '1'(0x31) 将以 16 位表示形式编码为 0000 0000 0011 0001。同样根据我的经验,没有可以移动整个字符串的机器代码。所以在微码中,第一个字符被提取,然后复制到目标地址,然后第二个字符被提取并复制到第二个位置,依此类推.. 假设指令大小为 32 位长并且支持立即寻址模式,前两个半字节将建议移动指令和立即寻址类型,接下来的两个半字节将是二进制编码字符,剩下的将是您想要复制到的地址.希望这会有所帮助
【讨论】:
所以你基本上是说我只是使用 ASCII 等价物作为指令的一部分对每个字符进行编码?这就是我的想法,但我不确定它在各个方面是如何处理的。我知道 ASCII 和二进制之间没有区别,但我不确定我是否只是拼出其 ASCII 等效字符中的每个字符(例如,如果我要移动更长的占用 16 个字符的东西怎么办?)。我遇到的另一个问题是我不知道在哪里对操作码二进制指令中的字符串数据/字符进行编码(即在寻址模式之后,在 dest 之前等)。 据我所知,摩托罗拉 68000 手册没有解释如何或在何处对指令中的字符 ASCII 表示进行编码(至少我不理解)。以上是关于如何在二进制操作码指令中编码 ASCII 文本?的主要内容,如果未能解决你的问题,请参考以下文章