我不需要复习任何事情。我一般会问如何在二进制文件的数据段中编码数据字符串,以便在bare metal上执行。
目的?假设我正在编写一个引导加载程序,我需要定义文件中使用的静态数据来表示要移动到内存地址的字符串,例如Genesis TMSS issue。
我假设地址的二进制编码是字面翻译的 - 二进制等效于摩托罗拉68000内存映射中的十六进制表示,所以现在不是问题。
问题是......如何编码二进制代码中的字符串/字符/字形以在M68000k操作码内编码?我阅读了手册,参考文献等等,没有人接触到这一点(从我读过的内容)。
说我想编码move.l #'SEGA', $A14000
。我会得到这个结果的操作码(不考虑如何编码ASCII字符):
0010 1101 0100 0010 1000 0000 0000 0000
半字节1 =移动长,半字节2 =存储器寻址模式,以下三个字节等于地址。
我的问题是,我是否可能将每个字符的每个字符串编码为该指令的前一个MAM半字节的一部分?
我很困惑,希望有人可能知道如何在指令中编码数据文本。
答案 0 :(得分:0)
我经历过4种不同汇编语言的编程,摩托罗拉M68HC11就是其中之一。根据我的经验,ASCII仅用于显示目的。低级别的CPU将所有内容视为二进制值,无法区分ASCII字符和其他字符。虽然像x86这样的高级汇编语言支持AAA(ASCII调整添加)等指令,但确保在添加两个ASCII数后,结果仍然是合法的ASCII编号。 所以主要是它的汇编程序依赖,如果汇编程序支持指令move.l#' SEGA',$ A14000这可能有用,但由于你没有使用汇编程序并直接编写操作码,你必须将ascii编码为二进制,例如ascii number' 1'(0x31)将以16位表示编码为0000 0000 0011 0001。另外根据我的经验,没有可以移动整个字符串的机器代码。在微代码中,获取第一个字符,然后复制到目标地址,然后获取第二个字符并将其复制到第二个位置,依此类推。 假设指令大小为32位长并且支持立即寻址模式,前两个半字节将建议移动指令和立即寻址类型,接下来的两个半字节将是二进制编码字符,剩下的将是您要将其复制到的地址。希望这有帮助