汇编码(Assembly Code)是用 人类可读的 汇编语言助记符 书写的代码。
机器码(Machine Code)是用 硬件可执行的 二进制 表示的代码。
十六进制码(Hexadecimal Code) 是用 人类可读的 十六进制 表示的代码。
本文将以 国产芯片 ”
宏晶 STC12C5A60S2“ 为例,探讨如何进行 汇编码、机器码、十六进制码 相互转换。
1. 连线
首先获取
STC12C5A60S2 芯片,同时获取芯片手册。然后接好电路,如图:
这里用 国产芯片 “
PL2303” 作为 USB-TTL烧写工具。上位机运行 STC-ISP 程序,使用方法参见官方。
图中用了简化画法,只画出需 连线 的 引脚,其他则省略,以简单示意。
还有一种更为专业的做法,就是不用 开发板 而是自己接 芯片外围电路,如此可以参见 芯片手册的线路图。
2. 汇编码 与 机器码
一条汇编指令,例如我们熟悉的 LJMP长跳转,通常是第一条指令。如何实现 汇编码 与 机器码 的 相互转换 呢?
查看
指令集 可知 汇编码 的 机器码:
那么 转换就应该是这样:
2.1 汇编码 到 机器码
例如看到 汇编指令 LJMP 0x5555;,先转换 助记符 LJMP 为 命令 0x02,再转换 数字 0x5555 为 数据 0x55 0x55。
因此转换到 机器码 就是 0x02 0x55 0x55 本身:
2.2 机器码 到 汇编码:
同理看到 机器码 0x02,就知道这条 命令 对应的 汇编指令 是 LJMP addr16。这是个 3 字节指令,因此再看两个字节 0x55 0x55,它们就是 数据,长跳转 到的地址。
机器码 是能够直接 烧写 到芯片 内存 中的代码。还有一种能够直接烧写 到芯片 内存 中的代码,叫 十六进制码。
3. 机器码 与 十六进制码
十六进制码 的一个好处是能指定 地址。如何实现 机器码 与 十六进制码 的 相互转换 呢?
3.0 准备
十六进制码 格式如下:
补充说明:
类型:0x00 表示 数据,0x01 表示结束。
地址:两个字节地址。大于 64KB 的情况可以用 另一种类型 烧写,可以参见 HEX文件格式。
校验码:使所有字节之和等于 0x100。
我们首先写一段汇编码:
功能是 输出 #0x55 到 0x80。#0x55 是一个 立即数,0x80 是 STC 的 端口 P0。
为 显示 起见,我们在 P0 端口接上 发光二极管,连线如图:
这样这段汇编码功能就变成 交替点亮发光二极管。
用 2. 节所述方法,将 汇编码 转换到 机器码:
现在实现 机器码 与 十六进制码 的 相互转换:
3.1 机器码 到 十六进制码
依照 3.0节 所述格式,从 机器码 得到 十六进制码:
可以看到 十六进制码 包含有 二进制码 的 显式形式。
3.2 十六进制码 到 机器码:
同理依照 3.0节 所述格式,有 十六进制码 也可得到原来的 机器码:
进而还可用 2. 节所述方法,得到原来的 汇编码:
4. 实物图
5. 总结
本文实现 汇编码 到 机器码、机器码 到 十六进制码、十六进制码 到 机器码、机器码 到 汇编码 四种 相互转换。