汇编码、机器码、十六进制码 相互转换

lianxian连线 2017-06-05 11:16:26
汇编码(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. 总结

本文实现 汇编码 到 机器码、机器码 到 十六进制码、十六进制码 到 机器码、机器码 到 汇编码 四种 相互转换。
...全文
6087 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39192077 2017-06-16
  • 打赏
  • 举报
回复
lianxian连线 2017-06-16
  • 打赏
  • 举报
回复
引用 10 楼 elecfans2csdn 的回复:
十六进制码 有 开始符,因此也可以推断是 显式 的。
在文章中,机器码 .BIN文件 以 不连续 加上0x前缀 格式表示,本意就是 隐式形式;而在资源中,出于 显式 说明起见,机器码 .MAC文件 和 十六进制码 .HEX文件 都以 连续 不加0x前缀 格式表示。
lianxian连线 2017-06-16
  • 打赏
  • 举报
回复
十六进制码 有 开始符,因此也可以推断是 显式 的。
lianxian连线 2017-06-16
  • 打赏
  • 举报
回复
引用 8 楼 qq_39192077 的回复:
[quote=引用 7 楼 qq_39192077 的回复:] [quote=引用 6 楼 qq_39192077 的回复:] [quote=引用 5 楼 elecfans2csdn 的回复:] [quote=引用 4 楼 qq_39192077 的回复:] 能不能说明一下文件格式。
嗯,好。 本文章中,所述的 “十六进制码” 就是烧写用的 .HEX 文件 基本格式,是人类可读的 显式 格式。所述的 “机器码”(即“二进制码”)就是 .BIN 文件 格式,是机器可执行的 隐式 格式。 本文随附资源代码中,出于 显式 说明起见,“十六进制码” 和 “机器码” (即“二进制码”)都用了 显式 格式来表示。为此,“机器码” 的显式格式用的是 .MAC 后缀。“十六进制码” 仍用的是 .HEX 后缀。[/quote] 那你汇编码和机器码都用了 0x 的写法,要注意区分。[/quote] 汇编码 有 助记符,因此可以推断是 显式 的。机器码 显式形式 可以 连续 表示而无需加上 0x,这里加上 0x 并进行 不连续 表示以表示其为 隐式形式。[/quote] 可如此说明。[/quote] 如此虽可说明 汇编码 和 机器码 的区分,还需再加上 机器码 和 十六进制码 的区分 才完整。
qq_39192077 2017-06-16
  • 打赏
  • 举报
回复
引用 7 楼 qq_39192077 的回复:
[quote=引用 6 楼 qq_39192077 的回复:] [quote=引用 5 楼 elecfans2csdn 的回复:] [quote=引用 4 楼 qq_39192077 的回复:] 能不能说明一下文件格式。
嗯,好。 本文章中,所述的 “十六进制码” 就是烧写用的 .HEX 文件 基本格式,是人类可读的 显式 格式。所述的 “机器码”(即“二进制码”)就是 .BIN 文件 格式,是机器可执行的 隐式 格式。 本文随附资源代码中,出于 显式 说明起见,“十六进制码” 和 “机器码” (即“二进制码”)都用了 显式 格式来表示。为此,“机器码” 的显式格式用的是 .MAC 后缀。“十六进制码” 仍用的是 .HEX 后缀。[/quote] 那你汇编码和机器码都用了 0x 的写法,要注意区分。[/quote] 汇编码 有 助记符,因此可以推断是 显式 的。机器码 显式形式 可以 连续 表示而无需加上 0x,这里加上 0x 并进行 不连续 表示以表示其为 隐式形式。[/quote] 可如此说明。
qq_39192077 2017-06-16
  • 打赏
  • 举报
回复
引用 6 楼 qq_39192077 的回复:
[quote=引用 5 楼 elecfans2csdn 的回复:] [quote=引用 4 楼 qq_39192077 的回复:] 能不能说明一下文件格式。
嗯,好。 本文章中,所述的 “十六进制码” 就是烧写用的 .HEX 文件 基本格式,是人类可读的 显式 格式。所述的 “机器码”(即“二进制码”)就是 .BIN 文件 格式,是机器可执行的 隐式 格式。 本文随附资源代码中,出于 显式 说明起见,“十六进制码” 和 “机器码” (即“二进制码”)都用了 显式 格式来表示。为此,“机器码” 的显式格式用的是 .MAC 后缀。“十六进制码” 仍用的是 .HEX 后缀。[/quote] 那你汇编码和机器码都用了 0x 的写法,要注意区分。[/quote] 汇编码 有 助记符,因此可以推断是 显式 的。机器码 显式形式 可以 连续 表示而无需加上 0x,这里加上 0x 并进行 不连续 表示以表示其为 隐式形式。
qq_39192077 2017-06-16
  • 打赏
  • 举报
回复
引用 5 楼 elecfans2csdn 的回复:
[quote=引用 4 楼 qq_39192077 的回复:] 能不能说明一下文件格式。
嗯,好。 本文章中,所述的 “十六进制码” 就是烧写用的 .HEX 文件 基本格式,是人类可读的 显式 格式。所述的 “机器码”(即“二进制码”)就是 .BIN 文件 格式,是机器可执行的 隐式 格式。 本文随附资源代码中,出于 显式 说明起见,“十六进制码” 和 “机器码” (即“二进制码”)都用了 显式 格式来表示。为此,“机器码” 的显式格式用的是 .MAC 后缀。“十六进制码” 仍用的是 .HEX 后缀。[/quote] 那你汇编码和机器码都用了 0x 的写法,要注意区分。
lianxian连线 2017-06-16
  • 打赏
  • 举报
回复
引用 4 楼 qq_39192077 的回复:
能不能说明一下文件格式。
嗯,好。 本文章中,所述的 “十六进制码” 就是烧写用的 .HEX 文件 基本格式,是人类可读的 显式 格式。所述的 “机器码”(即“二进制码”)就是 .BIN 文件 格式,是机器可执行的 隐式 格式。 本文随附资源代码中,出于 显式 说明起见,“十六进制码” 和 “机器码” (即“二进制码”)都用了 显式 格式来表示。为此,“机器码” 的显式格式用的是 .MAC 后缀。“十六进制码” 仍用的是 .HEX 后缀。
qq_39192077 2017-06-16
  • 打赏
  • 举报
回复
能不能说明一下文件格式。
lianxian连线 2017-06-07
  • 打赏
  • 举报
回复
还有闪存驱动: http://bbs.csdn.net/topics/392177669
lianxian连线 2017-06-07
  • 打赏
  • 举报
回复
用本文方法实现的液晶显示屏驱动:
http://bbs.csdn.net/topics/392177268


lianxian连线 2017-06-06
  • 打赏
  • 举报
回复
电路图和源代码: http://www.pudn.com/Download/item/id/3186010.html http://download.csdn.net/detail/elecfans2csdn/9861717

6,120

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧