-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlocal-search.xml
More file actions
195 lines (93 loc) · 188 KB
/
local-search.xml
File metadata and controls
195 lines (93 loc) · 188 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>RS485通信原理</title>
<link href="/blogs/2026/03/22/RS485%E9%80%9A%E4%BF%A1%E5%8E%9F%E7%90%86/"/>
<url>/blogs/2026/03/22/RS485%E9%80%9A%E4%BF%A1%E5%8E%9F%E7%90%86/</url>
<content type="html">< --><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/20260322180942896.png" /></p><h2 id="二rs485收发器sp3485">二、RS485收发器(SP3485)</h2><p>SP3485芯片是一款非常经典的+3.3V低功耗半双工RS485收发器,数据传输速率高达10Mbps。单片机串口通信一般是TTL电平,如果需要RS485通信,就需要RS485芯片在中间转换一下。RS因为RS485通信是半双工通信,就是发送数据的时候不能同时接收数据,所以我们选择SP3485做RS485收发器。</p><h3 id="sp3485-芯片引脚">SP3485 芯片引脚</h3><p>SP3485 芯片的引脚图如下所示:</p><!--  --><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/20260322181033822.png" /></p><p>引脚说明如下:</p><table><thead><tr><th>引脚</th><th>名称</th><th>功能说明</th></tr></thead><tbody><tr><td>1</td><td>RO</td><td>接收器输出----接RX</td></tr><tr><td>2</td><td>RE</td><td>接收器输出使能(低电平-接收使能)</td></tr><tr><td>3</td><td>DE</td><td>驱动器输出使能(高电平-发送使能)</td></tr><tr><td>4</td><td>DI</td><td>驱动器输入----接TX</td></tr><tr><td>5</td><td>GND</td><td>接地</td></tr><tr><td>6</td><td>A</td><td>驱动器输出/接收器输入(同相)</td></tr><tr><td>7</td><td>B</td><td>驱动器输出/接收器输入(反相)</td></tr><tr><td>8</td><td>VCC</td><td>芯片供电+3.3V</td></tr></tbody></table><h4 id="普通收发">普通收发</h4><p>RS485 电路图如下图所示:</p><!--  --><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/20260322181102271.png" /></p><p>RS485 普通收发电路图原理:</p><p>RS485_EN 为高电平,逻辑为1,发送使能,接收禁止。 RS485_EN为低电平,逻辑为0,发送禁止,接收使能 在编写驱动程序时:</p><p>在发送数据前,给RS485_EN 置高电平。 在发送数据后,给RS485_EN置低电平。</p><h3 id="自动收发">自动收发</h3><p>如下图所示,RS485 自动收发电路比RS485普通收发电路增加了一个三极管开关电路,是由电阻R8、电阻R9 和 NPN三极管Q1组成。其中: - R9—限流电阻:最好选择4.7K,也可以选择10K。 -R8—上拉电阻:可以选择4.7K或者10K。 -Q1—NPN三极管:高电平导通,低电平截止。</p><!--  --><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/20260322181118834.png" /></p><h5 id="自动收发工作原理"><strong>自动收发工作原理</strong></h5><ul><li><p><strong>接收数据</strong>在接收数据过程中,RS485_TX引脚一直保持高电平,NPN三极管Q1导通,RE和DE的引脚低电平,发送禁止,接收使能,进入接收状态。</p></li><li><p><strong>发送数据</strong> RS485_TX 发送1,AB发送1;RS485_TX发送0,AB发送0。</p><ul><li><strong>当 RS485_TX 发送1时:</strong><ul><li>NPN三极管导通,RE和DE的引脚是低电平,发送禁止,接收使能,进入接收状态,SP3485芯片的AB引脚进入高阻状态,因为R4把A拉高,R5把B拉低,所以,AB传输的是1。所以,当RS485_TX发送1时,AB引脚发送1。</li></ul></li><li><strong>当 RS485_TX 发送0时:</strong><ul><li>NPN三极管不导通,RE和DE的引脚是高电平,进入发送状态,SP3485芯片会把DI上的电平反应到AB引脚上输出,因为DI已经接地,所以AB引脚会传输0。所以,当RS485_TX发送0时,AB引脚发送0。</li></ul></li></ul></li></ul>]]></content>
<tags>
<tag>单片机</tag>
<tag>嵌入式</tag>
</tags>
</entry>
<entry>
<title>elf文件格式与动态链接解析</title>
<link href="/blogs/2026/02/26/elf%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E4%B8%8E%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E8%A7%A3%E6%9E%90/"/>
<url>/blogs/2026/02/26/elf%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E4%B8%8E%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E8%A7%A3%E6%9E%90/</url>
<content type="html"><![CDATA[<h1 id="elf文件件格式与动态链接解析">ELF文件件格式与动态链接解析</h1><h2 id="part1-elf文件格式">PART1 ELF文件格式</h2><p>ELF代表Executable and LinkableForma,是一种对可执行文件、目标文件和库使用的文件格式,ELF格式是是UNIX系统实验室作为ABI(ApplicationBinaryInterface)而开发和发布的,是Linux系统的标准文件格式了。与Windows下的PE文件格式类似。本文使用如下的简单程序来具体讲述ELF文件的格式,建议对照着程序的二进制码阅读本文。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-comment">// elfExample.c</span><br><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><stdio.h></span></span><br><br><span class="hljs-type">const</span> <span class="hljs-type">char</span>* const_str = <span class="hljs-string">"ELF Example"</span>;<br><br><span class="hljs-type">int</span> g_initVar = <span class="hljs-number">1024</span>;<br><span class="hljs-type">int</span> g_uinitVar;<br><br><span class="hljs-type">static</span> <span class="hljs-type">int</span> s_initVar = <span class="hljs-number">8</span>;<br><span class="hljs-type">static</span> <span class="hljs-type">int</span> s_uinitVar;<br><br><span class="hljs-type">void</span> <span class="hljs-title function_">myPrint</span><span class="hljs-params">()</span><br>{<br><span class="hljs-built_in">printf</span>(<span class="hljs-string">"const_str: %s\n"</span>,const_str);<br><span class="hljs-built_in">printf</span>(<span class="hljs-string">"g_initVar: %d\n"</span>,g_initVar);<br><span class="hljs-built_in">printf</span>(<span class="hljs-string">"s_initVar: %d\n"</span>,s_initVar);<br>}<br><br><span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span><br>{<br><span class="hljs-type">int</span> tmp_var = <span class="hljs-number">10</span>;<br><br>myPrint();<br><br><span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br><br></code></pre></td></tr></table></figure><h3 id="一.-elf概述">一. ELF概述</h3><p>ELF主要包括三种类型文件:</p><ul><li>可重定位文件(relocatable):编译器和汇编器产生的.o文件,被Linker所处理</li><li>可执行文件(executable):Linker对.o文件进行处理输出的文件,进程映像</li><li>共享对象文件(shared object):动态库文件.so</li></ul><p>下面是三种类型的示例:</p><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image.png"alt="图1. 可重定位文件" /> <imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-1.png"alt="图2. 可执行文件" /> <imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-2.png"alt="图3. 共享对象文件" /></p><p><strong>ELF文件布局</strong> ELF文件包括了5个部分:</p><ul><li><p>ELF header,描述体系结构和操作系统等基本信息,指出section headertable和program header table在文件的位置</p></li><li><p>program headertable,这个是从运行的角度来看ELF文件的,主要给出了各个segment的信息,在汇编和链接过程中没用</p></li><li><p>section headertable,这个保存了所有的section的信息,这是从编译和链接的角度来看ELF文件的</p></li><li><p>sections,就是各个节区</p></li><li><p>segments,就是在运行时的各个段</p></li></ul><p>ELF布局图: <imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-3.png"alt="ELF文件布局" /></p><p>由图可以知道,其实sections和segments占的一样的地方。这是从链接和加载的角度来讲的。左边是链接视图,右边是加载视图,sections是程序员可见的,是给链接器使用的概念,而segments是程序员不可见的,是给加载器使用的概念。一般是一个segment包含多个section。Windows的PE就没有这个programheader table和section headertable点都统一为section,只是在加载时会进行处理。所以program headertable和section header table都是可选的。</p><h3 id="二.-elf的组成结构">二. ELF的组成结构</h3><h4 id="elf-header">(1) ELF header</h4><p>ELF Header描述了体系结构和操作系统等基本信息,并指出Section HeaderTable和Program Header Table在文件中的什么位置,每个成员的解释参见注释。<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-meta">#<span class="hljs-keyword">define</span> EI_NIDENT 16</span><br><span class="hljs-keyword">typedef</span> <span class="hljs-class"><span class="hljs-keyword">struct</span>{</span><br> <span class="hljs-comment">/*ELF的一些标识信息,固定值*/</span><br> <span class="hljs-type">unsigned</span> <span class="hljs-type">char</span> e_ident[EI_NIDENT];<br> <span class="hljs-comment">/*目标文件类型:1-可重定位文件,2-可执行文件,3-共享目标文件等*/</span><br> Elf32_Half e_type;<br> <span class="hljs-comment">/*文件的目标体系结构类型:3-intel 80386*/</span><br> Elf32_Half e_machine;<br> <span class="hljs-comment">/*目标文件版本:1-当前版本*/</span><br> Elf32_Word e_version;<br> <span class="hljs-comment">/*程序入口的虚拟地址,如果没有入口,可为0*/</span><br> Elf32_Addr e_entry;<br> <span class="hljs-comment">/*程序头表(segment header table)的偏移量,如果没有,可为0*/</span><br> Elf32_Off e_phoff;<br> <span class="hljs-comment">/*节区头表(section header table)的偏移量,没有可为0*/</span><br> Elf32_Off e_shoff;<br> <span class="hljs-comment">/*与文件相关的,特定于处理器的标志*/</span><br> Elf32_Word e_flags;<br> <span class="hljs-comment">/*ELF头部的大小,单位字节*/</span><br> Elf32_Half e_ehsize;<br> <span class="hljs-comment">/*程序头表每个表项的大小,单位字节*/</span><br> Elf32_Half e_phentsize;<br> <span class="hljs-comment">/*程序头表表项的个数*/</span><br> Elf32_Half e_phnum;<br> <span class="hljs-comment">/*节区头表每个表项的大小,单位字节*/</span><br> Elf32_Half e_shentsize;<br> <span class="hljs-comment">/*节区头表表项的数目*/</span><br> Elf32_Half e_shnum;<br> <span class="hljs-comment">/*某些节区中包含固定大小的项目,如符号表。对于这类节区,此成员给出每个表项的长度字节数。*/</span><br> Elf32_Half e_shstrndx;<br>}Elf32_Ehdr;<br></code></pre></td></tr></table></figure> 为了方便参考,将上面结构体用表格形式表示如下: | 字段名 |数据类型 | 说明 | | :--- | :--- | :--- | | <code>e_ident</code> |<code>unsigned char[EI_NIDENT]</code> | ELF的一些标识信息,固定值 | |<code>e_type</code> | <code>Elf32_Half</code> |目标文件类型:1-可重定位文件,2-可执行文件,3-共享目标文件等 | |<code>e_machine</code> | <code>Elf32_Half</code> |文件的目标体系结构类型:3-intel 80386 | | <code>e_version</code> |<code>Elf32_Word</code> | 目标文件版本:1-当前版本 | |<code>e_entry</code> | <code>Elf32_Addr</code> |程序入口的虚拟地址,如果没有入口,可为0 | | <code>e_phoff</code> |<code>Elf32_Off</code> | 程序头表(segment headertable)的偏移量,如果没有,可为0 | | <code>e_shoff</code> |<code>Elf32_Off</code> | 节区头表(section headertable)的偏移量,没有可为0 | | <code>e_flags</code> |<code>Elf32_Word</code> | 与文件相关的,特定于处理器的标志 | |<code>e_ehsize</code> | <code>Elf32_Half</code> |ELF头部的大小,单位字节 | | <code>e_phentsize</code> |<code>Elf32_Half</code> | 程序头表每个表项的大小,单位字节 | |<code>e_phnum</code> | <code>Elf32_Half</code> | 程序头表表项的个数 | |<code>e_shentsize</code> | <code>Elf32_Half</code> |节区头表每个表项的大小,单位字节 | | <code>e_shnum</code> |<code>Elf32_Half</code> | 节区头表表项的数目 | | <code>e_shstrndx</code>| <code>Elf32_Half</code> |某些节区中包含固定大小的项目,如符号表。对于这类节区,此成员给出每个表项的长度字节数。|</p><p>特别注意最后一个字段e_shstrndx的含义:“e_shstrndx”是“Section headerstring tableindex”的缩写。段表字符串表本身也是ELF文件中的一个普通的段,它的名字往往叫做“.shstrtab”。那么这个“e_shstrndx”就表示“.shstrtab”在段表中的下标,即段表字符串表在段表中的下标。</p><p>下面是test的ELF header结构各个数据成员对应的值:</p><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-4.png" /></p><p>可以看到这个ELF的基本信息,比如,体系结构和操作系统,Section headertable中有30个section,从4420开始,每个40个字节,Program headertable中有9个segment,每个32字节。下面再从字节码上面看看具体的。标出了某些结构,可以对照上面的结构看。</p><h4 id="program-header-table与grogram-header-entry">(2) program headertable与grogram header entry</h4><p>程序头表是从加载的角度来看ELF文件的,目标文件没有该表,每一个表项提供了各段在虚拟地址空间和物理地址空间的大小、位置、标志、访问权限和对其方面的信息。从上面知道,elpExample中有13个segment,如下图:</p><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-5.png" /></p><p>下面对其中的一些进行简单的介绍。</p><p>PHDR保存程序头表INTERP指定在程序已经从可执行文件映射到内存之后,必须调用的解释器。在这里,解释器并不意味着二进制文件的内容必须由另一个程序解释。它指的是这样一个程序:通过链接其他库,来满足未解决的引用。通常/lib/ld-linux.so.2、/lib/ld-linux-ia-64.so.2等库,用于在虚拟地址空间中插入程序运行所需要的动态库。对几乎所有的程序来说,可能C标准库都是必须映射的。还需要添加的各种库包括,GTK、数学库、libjpeg等等LOAD表示一个需要从二进制文件映射到虚拟地址空间的段。其中保存了常量数据(如字符串),程序的目标代码等。DYNAMIC段保存了由动态链接器(即,INTERP中指定的解释器)使用的信息。NOTE保存了专有信息 一个entry对应一个segment,由如下的数据结构表示</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-keyword">typedef</span> <span class="hljs-class"><span class="hljs-keyword">struct</span></span><br><span class="hljs-class">{</span><br> <span class="hljs-comment">/*segment的类型:PT_LOAD= 1 可加载的段*/</span><br> Elf32_Word p_type;<br> <span class="hljs-comment">/*从文件头到该段第一个字节的偏移*/</span><br> Elf32_Off p_offset;<br> <span class="hljs-comment">/*该段第一个字节被放到内存中的虚拟地址*/</span><br> Elf32_Addr p_vaddr;<br> <span class="hljs-comment">/*在linux中这个成员没有任何意义,值与p_vaddr相同*/</span><br> Elf32_Addr p_paddr;<br> <span class="hljs-comment">/*该段在文件映像中所占的字节数*/</span><br> Elf32_Word p_filesz;<br> <span class="hljs-comment">/*该段在内存映像中占用的字节数*/</span><br> Elf32_Word p_memsz;<br> <span class="hljs-comment">/*段标志*/</span><br> Elf32_Word p_flags;<br> <span class="hljs-comment">/*p_vaddr是否对齐*/</span><br> Elf32_Word p_align;<br>} Elf32_phdr;<br><br></code></pre></td></tr></table></figure><h4 id="section-header-table与section-header-entry">(3) section headertable与section header entry</h4><p>节表头包含了文件中的各个节,每个节都指定了一个类型,定义了节数据的语义。各节都指定了大小和在二进制文件内部的偏移。从上面知道,test中有30个section,如下图:<imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-6.png" /></p><h3 id="section-segment关系">(4) section segment关系</h3><p>ELF 文件中的 Section(节)和Segment(段)是从不同视角看待同一个文件的方式,多个 Section在运行时被合并、映射,形成一个 Segment。</p><p>Section 是链接时的概念,而 Segment 是运行时的概念。</p><p>🔍 两种视角 | 维度 | Section (节) | Segment (段) | | :--- | :--- |:--- | | 视角 | 链接视图 (Linking View) | 执行视图 (Execution View) | |目的 | 为链接器和调试器服务,精细组织代码和数据(如 <code>.text</code>,<code>.data</code>, <code>.symtab</code>)。 |为操作系统加载器服务,定义如何将文件内容映射到内存中。 | | 使用者 |链接器 (<code>ld</code>)、调试器 (<code>gdb</code>) |操作系统内核、动态链接器 | | 生命周期 |主要存在于文件中,链接时使用。部分 <code>.debug</code>等信息在程序运行时通常被丢弃。 |从文件加载到内存开始,贯穿进程的整个生命周期。 | | 描述表 | 节头表(Section Header Table),由 <code>e_shoff</code> 字段定位。 | 程序头表(Program Header Table),由 <code>e_phoff</code> 字段定位。 |</p><p>🧩 组成与映射关系</p><p>一个 Segment 通常由一个或多个具有相同内存访问权限的 Section组成。</p><p>映射过程:当操作系统加载 ELF文件时,它会读取程序头表,根据表中的信息,将文件中一个或多个 Section的内容加载到内存的同一个连续区域,并赋予相同的权限(如可读、可写、可执行),这个内存区域就是一个Segment。 并非所有 Section 都会被加载:只有那些具有 ALLOC(分配)属性的Section 才会被纳入某个 PT_LOAD 类型的 Segment 中。例如,存放符号表的.symtab 和调试信息的 .debug节通常只在链接和调试时需要,不会被加载到内存中运行,因此它们不属于任何Segment。 下图为elfExample文件section和segment映射关系。</p><p><imgsrc="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-8.png" /></p><p>如,将.interp.note.gnu.porpery等节合并成02段,参考上面图可知这是load段,并且权限都是只读。这些内容都是程序运行时的参考信息。将.init .plt .text.fini节合并成03段,它们的权限都是可读和可执行的代码。</p><h3 id="参考资料">参考资料:</h3><ol type="1"><li>https://www.cnblogs.com/gongxianjin/p/16906719.html</li></ol>]]></content>
<tags>
<tag>嵌入式</tag>
</tags>
</entry>
<entry>
<title>hex文件格式解析</title>
<link href="/blogs/2026/02/24/hex%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E8%A7%A3%E6%9E%90/"/>
<url>/blogs/2026/02/24/hex%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E8%A7%A3%E6%9E%90/</url>
<content type="html"><![CDATA[<h1 id="hex-文件格式解析">HEX 文件格式解析</h1><p>本文介绍 Intel HEX 与 BIN 的基本差异,详细说明 Intel HEX 文件格式与常见记录类型,并给出示例与地址计算说明,方便嵌入式固件解析与烧录使用。</p><h2 id="一bin-与-hex-简介">一、BIN 与 HEX 简介</h2><ul><li><strong>BIN</strong>:二进制文件,直接包含机器码或固件数据,通常用于直接写入存储器或加载到内存执行。BIN 文件不包含地址信息,烧录时需手动指定目标地址。</li><li><strong>HEX</strong>:Intel HEX(ASCII 文本)格式,按行组织,每行包含字节计数、地址、记录类型、数据与校验和。HEX 文件自带地址信息,适合用于把数据精确写入指定地址。</li></ul><p><strong>主要区别:</strong></p><ul><li>地址信息:HEX 含地址,BIN 无地址。</li><li>可读性:HEX 为可读文本,BIN 为二进制不可读。</li><li>文件体积:HEX 使用 ASCII 表示数据,体积通常大于 BIN。</li></ul><h2 id="二intel-hex-文件行格式">二、Intel HEX 文件行格式</h2><p>每一行(record)格式为:</p><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-4.webp" /> <strong>即:</strong> <code>:LLAAAATT[DD..DD]CC</code></p><p>说明:</p><ul><li><code>:</code>:行起始字符</li><li><code>LL</code>:字节计数(Byte Count),表示数据字段的字节数(两位十六进制),</li><li><code>AAAA</code>:16 位地址(Address),数据在该段内的起始偏移</li><li><code>TT</code>:记录类型(Record Type)<ul><li>00 数据记录,</li><li>01 文件结束,</li><li>02 扩展段地址,</li><li>04 扩展线性地址 等</li></ul></li><li><code>[DD..DD]</code>:数据字段(长度由 <code>LL</code> 决定)</li><li><code>CC</code>:校验和(Checksum),计算方法为对从 <code>LL</code> 到数据字段最后一个字节的所有字节求和,取低 8 位,然后取二补数(即 0x100 - (sum & 0xFF))</li></ul><p>示例(常见行):</p><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image.webp" /></p><h2 id="三常见记录类型说明">三、常见记录类型说明</h2><table><thead><tr class="header"><th style="text-align: right;">Type</th><th style="text-align: center;">十六进制</th><th style="text-align: left;">名称</th><th style="text-align: left;">说明</th></tr></thead><tbody><tr class="odd"><td style="text-align: right;">00</td><td style="text-align: center;">00</td><td style="text-align: left;">数据记录 (Data)</td><td style="text-align: left;">正常数据,写入地址 = 基址 + <code>AAAA</code></td></tr><tr class="even"><td style="text-align: right;">01</td><td style="text-align: center;">01</td><td style="text-align: left;">文件结束 (End Of File)</td><td style="text-align: left;">通常为 <code>:00000001FF</code></td></tr><tr class="odd"><td style="text-align: right;">02</td><td style="text-align: center;">02</td><td style="text-align: left;">扩展段地址 (Extended Segment Address)</td><td style="text-align: left;">指定段基址,基址 = 扩展段地址 << 4(用于 20 位地址)</td></tr><tr class="even"><td style="text-align: right;">03</td><td style="text-align: center;">03</td><td style="text-align: left;">起始段地址 (Start Segment Address)</td><td style="text-align: left;">指定 16-bit CS:IP(用于某些旧体系)</td></tr><tr class="odd"><td style="text-align: right;">04</td><td style="text-align: center;">04</td><td style="text-align: left;">扩展线性地址 (Extended Linear Address)</td><td style="text-align: left;">指定高 16-bit 地址,基址 = 扩展线性地址 << 16(用于 32 位地址)</td></tr><tr class="even"><td style="text-align: right;">05</td><td style="text-align: center;">05</td><td style="text-align: left;">起始线性地址 (Start Linear Address)</td><td style="text-align: left;">指定 32-bit EIP/Entry Point</td></tr></tbody></table><p>示例:</p><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/0696fc3103624395ec8efb158d0cf3c8.png" /></p><ol type="1"><li><p>数据记录 00: <img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-5.webp" /> <strong>- 0c:</strong> 数据大小12字节。</p><p><strong>- 0898:</strong> 数据起始地址(即数据载入到内存地址)。</p><p><strong>- 00:</strong> 记录类型:数据。</p><p><strong>- 787FE4F6D8FD75810B020888:</strong> 数据内容,一hex格式数据,共12字节(连个hex字符表示1字节 二进制数据)。</p><p><strong>- 1B:</strong> 校验和</p></li><li><p>文件结束记录 01:</p><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-6.webp" /></p><p>代表HEX文件结束,其后不跟数据,仅包含校验和。</p></li><li><p>程序入口地址 05: 其数据域的内容在本例中为0x01010400,该地址通常为MCU的复位向量地址,该地址在编译时由工程的链接脚本决定。</p></li></ol><h2 id="四地址计算示例与注意事项">四、地址计算示例与注意事项</h2><ol type="1"><li>使用扩展段地址(02)时:</li></ol><p>示例:</p><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-1.webp" /></p><ul><li>第一行 <code>:020000021008E4</code> 表示扩展段地址 <code>0x1008</code>。</li><li>基址 = 0x1008 << 4 = 0x10080。</li><li>第二行数据记录起始地址 <code>AAAA = 0x1020</code>,实际绝对地址 = 0x10080 + 0x1020 = 0x110A0(注意:示例中按段移位 4 位,叠加偏移)。</li></ul><ol start="2" type="1"><li>使用扩展线性地址(04)时:</li></ol><p>示例: <img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-2.webp" /></p><ul><li>第一行 <code>:020000040001F9</code> 表示扩展线性地址 <code>0x0001</code>。</li><li>基址 = 0x0001 << 16 = 0x00010000。</li><li>数据记录 <code>AAAA = 0x0000</code>,实际绝对地址 = 0x00010000 + 0x0000 = 0x00010000。</li></ul><ol start="3" type="1"><li>对比(02 vs 04)</li></ol><ul><li>02(扩展段)使用左移 4 位(乘 0x10)来扩展地址,适用于 20 位寻址(例如某些早期体系)。</li><li>04(扩展线性)使用左移 16 位(乘 0x10000)来扩展地址,适用于 32 位线性地址空间。</li><li>在某些情况下,不同的扩展记录可以指向相同的绝对地址(例如示例里两种方式均指向 0x10000)。</li></ul><h2 id="五示例对比两组记录">五、示例对比(两组记录)</h2><p>下面两组记录分别使用 02 和 04,但都定位到相同绝对地址:</p><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/image-3.webp" /></p><ul><li>使用 02 时,扩展段地址为 0x1000 → 基址 = 0x1000 << 4 = 0x10000;数据起始偏移 0x0000 → 绝对地址 0x10000。</li><li>使用 04 时,扩展线性地址为 0x0001 → 基址 = 0x0001 << 16 = 0x10000;数据起始偏移 0x0000 → 绝对地址 0x10000。</li></ul><h2 id="六常用工具与转换">六、常用工具与转换</h2><ul><li>HexView:可视化十六进制查看器,支持 Intel HEX 与多种十六进制/ASCII 显示、编辑与导出。</li><li>objcopy(GNU Binutils):常用于在 BIN、HEX、ELF 等格式之间转换,例如 <code>objcopy -I binary -O ihex input.bin output.hex</code>。</li><li>srec_cat(工具集的一部分):支持 Intel HEX、Motorola SREC、BIN 等格式互转与数据块操作。</li><li>自制脚本:使用 Python(pyserial、intelhex 库)快速解析、修改与生成 HEX 文件。</li></ul><h2 id="七校验和计算快速参考">七、校验和计算(快速参考)</h2><p>计算步骤:</p><ol type="1"><li>将 <code>LL</code>、<code>AAAA</code>(两字节)、<code>TT</code> 与所有数据字节相加,得到 sum。</li><li>取 sum 的低 8 位:sum & 0xFF。</li><li>校验和 CC = ((~(sum & 0xFF) + 1) & 0xFF) 或 CC = (0x100 - (sum & 0xFF)) & 0xFF。</li></ol><p>示例:计算 <code>:10010000214601360121470136007EFE09D2190140</code> 的校验和(末尾 <code>40</code>)。</p><h2 id="参考文章">参考文章</h2><p><a href="https://blog.csdn.net/lone5moon/article/details/117792834">深入理解工具链-Hex文件详解</a></p><h2 id="附录-hex文件python解析脚本">附录 hex文件python解析脚本</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment">#!/usr/bin/env python3</span><br><span class="hljs-string">"""</span><br><span class="hljs-string">简单的 Intel HEX 解析脚本</span><br><span class="hljs-string"></span><br><span class="hljs-string">用法示例:</span><br><span class="hljs-string"> python parse_hex.py firmware.hex # 打印解析摘要与段</span><br><span class="hljs-string"> python parse_hex.py firmware.hex --print-segments</span><br><span class="hljs-string"> python parse_hex.py firmware.hex --to-bin out.bin --fill 0xFF</span><br><span class="hljs-string"></span><br><span class="hljs-string">功能:</span><br><span class="hljs-string">- 解析 Intel HEX 各类记录(00/01/02/03/04/05)</span><br><span class="hljs-string">- 验证每行校验和</span><br><span class="hljs-string">- 计算绝对地址(支持 02/04 扩展记录)</span><br><span class="hljs-string">- 汇总并可导出为 BIN(用指定填充值填充空洞)</span><br><span class="hljs-string">"""</span><br><span class="hljs-keyword">from</span> __future__ <span class="hljs-keyword">import</span> annotations<br><span class="hljs-keyword">import</span> argparse<br><span class="hljs-keyword">import</span> sys<br><span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> <span class="hljs-type">List</span>, <span class="hljs-type">Tuple</span><br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">parse_record</span>(<span class="hljs-params">line: <span class="hljs-built_in">str</span></span>) -> <span class="hljs-built_in">dict</span>:<br> line = line.strip()<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line:<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span><br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">":"</span>):<br> <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">"Not an Intel HEX record: %r"</span> % line)<br> raw = line[<span class="hljs-number">1</span>:]<br> <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(raw) < <span class="hljs-number">10</span>:<br> <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">"Record too short: %r"</span> % line)<br> <span class="hljs-keyword">try</span>:<br> b = <span class="hljs-built_in">bytes</span>.fromhex(raw)<br> <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br> <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">"Invalid hex in record: %r"</span> % line) <span class="hljs-keyword">from</span> e<br> ll = b[<span class="hljs-number">0</span>]<br> addr = (b[<span class="hljs-number">1</span>] << <span class="hljs-number">8</span>) | b[<span class="hljs-number">2</span>]<br> rtype = b[<span class="hljs-number">3</span>]<br> data = b[<span class="hljs-number">4</span>:<span class="hljs-number">4</span>+ll]<br> chksum = b[<span class="hljs-number">4</span>+ll]<br> s = <span class="hljs-built_in">sum</span>(b[:<span class="hljs-number">4</span>+ll]) & <span class="hljs-number">0xFF</span><br> calc = ((~s + <span class="hljs-number">1</span>) & <span class="hljs-number">0xFF</span>)<br> ok = calc == chksum<br> <span class="hljs-keyword">return</span> {<br> <span class="hljs-string">"raw"</span>: line,<br> <span class="hljs-string">"count"</span>: ll,<br> <span class="hljs-string">"addr"</span>: addr,<br> <span class="hljs-string">"type"</span>: rtype,<br> <span class="hljs-string">"data"</span>: data,<br> <span class="hljs-string">"chksum"</span>: chksum,<br> <span class="hljs-string">"calc"</span>: calc,<br> <span class="hljs-string">"valid"</span>: ok,<br> }<br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">load_hex</span>(<span class="hljs-params">path: <span class="hljs-built_in">str</span>, verify: <span class="hljs-built_in">bool</span> = <span class="hljs-literal">True</span></span>) -> <span class="hljs-type">List</span>[<span class="hljs-type">Tuple</span>[<span class="hljs-built_in">int</span>, <span class="hljs-built_in">bytes</span>]]:<br> <span class="hljs-string">"""Parse an Intel HEX file and return list of (abs_addr, data) segments.</span><br><span class="hljs-string"></span><br><span class="hljs-string"> If multiple data records appear, this will return them in order of appearance.</span><br><span class="hljs-string"> The base address is updated by record types 02 and 04. 04 takes effect when seen.</span><br><span class="hljs-string"> """</span><br> segments: <span class="hljs-type">List</span>[<span class="hljs-type">Tuple</span>[<span class="hljs-built_in">int</span>, <span class="hljs-built_in">bytes</span>]] = []<br> base = <span class="hljs-number">0</span><br> <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">"r"</span>, encoding=<span class="hljs-string">"utf-8"</span>) <span class="hljs-keyword">as</span> f:<br> <span class="hljs-keyword">for</span> lineno, line <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(f, <span class="hljs-number">1</span>):<br> line = line.strip()<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line:<br> <span class="hljs-keyword">continue</span><br> rec = parse_record(line)<br> <span class="hljs-keyword">if</span> rec <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:<br> <span class="hljs-keyword">continue</span><br> <span class="hljs-keyword">if</span> verify <span class="hljs-keyword">and</span> <span class="hljs-keyword">not</span> rec[<span class="hljs-string">"valid"</span>]:<br> <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">f"Checksum mismatch at <span class="hljs-subst">{path}</span>:<span class="hljs-subst">{lineno}</span>: <span class="hljs-subst">{line}</span>"</span>)<br> rtype = rec[<span class="hljs-string">"type"</span>]<br> <span class="hljs-keyword">if</span> rtype == <span class="hljs-number">0x00</span>: <span class="hljs-comment"># data</span><br> abs_addr = base + rec[<span class="hljs-string">"addr"</span>]<br> segments.append((abs_addr, rec[<span class="hljs-string">"data"</span>]))<br> <span class="hljs-keyword">elif</span> rtype == <span class="hljs-number">0x01</span>: <span class="hljs-comment"># EOF</span><br> <span class="hljs-keyword">break</span><br> <span class="hljs-keyword">elif</span> rtype == <span class="hljs-number">0x02</span>: <span class="hljs-comment"># Extended Segment Address</span><br> <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(rec[<span class="hljs-string">"data"</span>]) != <span class="hljs-number">2</span>:<br> <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">"Invalid 02 record length"</span>)<br> val = (rec[<span class="hljs-string">"data"</span>][<span class="hljs-number">0</span>] << <span class="hljs-number">8</span>) | rec[<span class="hljs-string">"data"</span>][<span class="hljs-number">1</span>]<br> base = val << <span class="hljs-number">4</span><br> <span class="hljs-keyword">elif</span> rtype == <span class="hljs-number">0x03</span>: <span class="hljs-comment"># Start Segment Address (CS:IP)</span><br> <span class="hljs-comment"># Typically ignored for raw data mapping</span><br> <span class="hljs-keyword">pass</span><br> <span class="hljs-keyword">elif</span> rtype == <span class="hljs-number">0x04</span>: <span class="hljs-comment"># Extended Linear Address</span><br> <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(rec[<span class="hljs-string">"data"</span>]) != <span class="hljs-number">2</span>:<br> <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">"Invalid 04 record length"</span>)<br> val = (rec[<span class="hljs-string">"data"</span>][<span class="hljs-number">0</span>] << <span class="hljs-number">8</span>) | rec[<span class="hljs-string">"data"</span>][<span class="hljs-number">1</span>]<br> base = val << <span class="hljs-number">16</span><br> <span class="hljs-keyword">elif</span> rtype == <span class="hljs-number">0x05</span>: <span class="hljs-comment"># Start Linear Address</span><br> <span class="hljs-keyword">pass</span><br> <span class="hljs-keyword">else</span>:<br> <span class="hljs-comment"># unknown type: ignore or warn</span><br> <span class="hljs-keyword">pass</span><br> <span class="hljs-keyword">return</span> segments<br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">write_bin</span>(<span class="hljs-params">segments: <span class="hljs-type">List</span>[<span class="hljs-type">Tuple</span>[<span class="hljs-built_in">int</span>, <span class="hljs-built_in">bytes</span>]], out_path: <span class="hljs-built_in">str</span>, fill: <span class="hljs-built_in">int</span> = <span class="hljs-number">0xFF</span></span>) -> <span class="hljs-type">Tuple</span>[<span class="hljs-built_in">int</span>,<span class="hljs-built_in">int</span>]:<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> segments:<br> <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">"No data segments to write"</span>)<br> <span class="hljs-comment"># Determine range</span><br> min_addr = <span class="hljs-built_in">min</span>(a <span class="hljs-keyword">for</span> a, _ <span class="hljs-keyword">in</span> segments)<br> max_addr = <span class="hljs-built_in">max</span>(a + <span class="hljs-built_in">len</span>(d) <span class="hljs-keyword">for</span> a, d <span class="hljs-keyword">in</span> segments)<br> size = max_addr - min_addr<br> buf = <span class="hljs-built_in">bytearray</span>([fill & <span class="hljs-number">0xFF</span>]) * size<br> <span class="hljs-keyword">for</span> addr, data <span class="hljs-keyword">in</span> segments:<br> off = addr - min_addr<br> buf[off:off+<span class="hljs-built_in">len</span>(data)] = data<br> <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(out_path, <span class="hljs-string">"wb"</span>) <span class="hljs-keyword">as</span> f:<br> f.write(buf)<br> <span class="hljs-keyword">return</span> min_addr, size<br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">summarize</span>(<span class="hljs-params">segments: <span class="hljs-type">List</span>[<span class="hljs-type">Tuple</span>[<span class="hljs-built_in">int</span>, <span class="hljs-built_in">bytes</span>]]</span>) -> <span class="hljs-literal">None</span>:<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> segments:<br> <span class="hljs-built_in">print</span>(<span class="hljs-string">"(no data segments)"</span>)<br> <span class="hljs-keyword">return</span><br> total = <span class="hljs-built_in">sum</span>(<span class="hljs-built_in">len</span>(d) <span class="hljs-keyword">for</span> _, d <span class="hljs-keyword">in</span> segments)<br> min_addr = <span class="hljs-built_in">min</span>(a <span class="hljs-keyword">for</span> a, _ <span class="hljs-keyword">in</span> segments)<br> max_addr = <span class="hljs-built_in">max</span>(a + <span class="hljs-built_in">len</span>(d) <span class="hljs-keyword">for</span> a, d <span class="hljs-keyword">in</span> segments)<br> <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Segments: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(segments)}</span>, total bytes: <span class="hljs-subst">{total}</span>, range: 0x<span class="hljs-subst">{min_addr:08X}</span>-0x<span class="hljs-subst">{max_addr-<span class="hljs-number">1</span>:08X}</span>"</span>)<br><br><br><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>(<span class="hljs-params">argv=<span class="hljs-literal">None</span></span>):<br> p = argparse.ArgumentParser(description=<span class="hljs-string">"Parse Intel HEX and optionally export BIN"</span>)<br> p.add_argument(<span class="hljs-string">"infile"</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">"Input .hex file"</span>)<br> p.add_argument(<span class="hljs-string">"--print-segments"</span>, action=<span class="hljs-string">"store_true"</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">"Print each segment with address and length"</span>)<br> p.add_argument(<span class="hljs-string">"--to-bin"</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">"Export to binary file (fill gaps with --fill)"</span>)<br> p.add_argument(<span class="hljs-string">"--fill"</span>, <span class="hljs-built_in">type</span>=<span class="hljs-keyword">lambda</span> x: <span class="hljs-built_in">int</span>(x,<span class="hljs-number">0</span>), default=<span class="hljs-number">0xFF</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">"Fill value for gaps (default 0xFF)"</span>)<br> p.add_argument(<span class="hljs-string">"--no-verify"</span>, dest=<span class="hljs-string">"verify"</span>, action=<span class="hljs-string">"store_false"</span>, <span class="hljs-built_in">help</span>=<span class="hljs-string">"Skip checksum verification"</span>)<br> args = p.parse_args(argv)<br><br> segments = load_hex(args.infile, verify=args.verify)<br> summarize(segments)<br> <span class="hljs-keyword">if</span> args.print_segments:<br> <span class="hljs-keyword">for</span> addr, data <span class="hljs-keyword">in</span> segments:<br> <span class="hljs-built_in">print</span>(<span class="hljs-string">f"0x<span class="hljs-subst">{addr:08X}</span>: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(data)}</span> bytes"</span>)<br> <span class="hljs-keyword">if</span> args.to_bin:<br> min_addr, size = write_bin(segments, args.to_bin, fill=args.fill)<br> <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Wrote binary <span class="hljs-subst">{args.to_bin}</span>: base=0x<span class="hljs-subst">{min_addr:08X}</span>, size=<span class="hljs-subst">{size}</span> bytes"</span>)<br><br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:<br> <span class="hljs-keyword">try</span>:<br> main()<br> <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br> <span class="hljs-built_in">print</span>(<span class="hljs-string">"Error:"</span>, e, file=sys.stderr)<br> sys.exit(<span class="hljs-number">2</span>)<br><br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>技术笔记</category>
</categories>
<tags>
<tag>单片机</tag>
</tags>
</entry>
<entry>
<title>8051指令集</title>
<link href="/blogs/2026/02/23/8051%E6%8C%87%E4%BB%A4%E9%9B%86/"/>
<url>/blogs/2026/02/23/8051%E6%8C%87%E4%BB%A4%E9%9B%86/</url>
<content type="html"><![CDATA[<h1 id="指令集">8051指令集</h1><h2 id="完整指令表">完整指令表</h2><p>以下是按照机器码(十六进制)顺序排列的完整8051指令集表格,包含机器周期数(基于8051默认12T模式):</p><table><thead><tr class="header"><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Operands</th><th style="text-align: left;">Machine Cycles</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">00</td><td style="text-align: left;">1</td><td style="text-align: left;">NOP</td><td style="text-align: left;">-</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">01</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">02</td><td style="text-align: left;">3</td><td style="text-align: left;">LJMP</td><td style="text-align: left;">addr16</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">03</td><td style="text-align: left;">1</td><td style="text-align: left;">RR</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">04</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">05</td><td style="text-align: left;">2</td><td style="text-align: left;">INC</td><td style="text-align: left;">direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">06</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;"><span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">07</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;"><span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">08</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">09</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">0A</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">0B</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">0C</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">0D</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">0E</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">0F</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">10</td><td style="text-align: left;">3</td><td style="text-align: left;">JBC</td><td style="text-align: left;">bit, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">11</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">12</td><td style="text-align: left;">3</td><td style="text-align: left;">LCALL</td><td style="text-align: left;">addr16</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">13</td><td style="text-align: left;">1</td><td style="text-align: left;">RRC</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">14</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">15</td><td style="text-align: left;">2</td><td style="text-align: left;">DEC</td><td style="text-align: left;">direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">16</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;"><span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">17</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;"><span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">18</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">19</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">1A</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">1B</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">1C</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">1D</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">1E</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">1F</td><td style="text-align: left;">1</td><td style="text-align: left;">DEC</td><td style="text-align: left;">R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">20</td><td style="text-align: left;">3</td><td style="text-align: left;">JB</td><td style="text-align: left;">bit, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">21</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">22</td><td style="text-align: left;">1</td><td style="text-align: left;">RET</td><td style="text-align: left;">-</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">23</td><td style="text-align: left;">1</td><td style="text-align: left;">RL</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">24</td><td style="text-align: left;">2</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">25</td><td style="text-align: left;">2</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">26</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">27</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">28</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">29</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">2A</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">2B</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">2C</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">2D</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">2E</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">2F</td><td style="text-align: left;">1</td><td style="text-align: left;">ADD</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">30</td><td style="text-align: left;">3</td><td style="text-align: left;">JNB</td><td style="text-align: left;">bit, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">31</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">32</td><td style="text-align: left;">1</td><td style="text-align: left;">RETI</td><td style="text-align: left;">-</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">33</td><td style="text-align: left;">1</td><td style="text-align: left;">RLC</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">34</td><td style="text-align: left;">2</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">35</td><td style="text-align: left;">2</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">36</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">37</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">38</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">39</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">3A</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">3B</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">3C</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">3D</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">3E</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">3F</td><td style="text-align: left;">1</td><td style="text-align: left;">ADDC</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">40</td><td style="text-align: left;">2</td><td style="text-align: left;">JC</td><td style="text-align: left;">offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">41</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">42</td><td style="text-align: left;">2</td><td style="text-align: left;">ORL</td><td style="text-align: left;">direct, A</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">43</td><td style="text-align: left;">3</td><td style="text-align: left;">ORL</td><td style="text-align: left;">direct, #immed</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">44</td><td style="text-align: left;">2</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">45</td><td style="text-align: left;">2</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">46</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">47</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">48</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">49</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">4A</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">4B</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">4C</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">4D</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">4E</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">4F</td><td style="text-align: left;">1</td><td style="text-align: left;">ORL</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">50</td><td style="text-align: left;">2</td><td style="text-align: left;">JNC</td><td style="text-align: left;">offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">51</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">52</td><td style="text-align: left;">2</td><td style="text-align: left;">ANL</td><td style="text-align: left;">direct, A</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">53</td><td style="text-align: left;">3</td><td style="text-align: left;">ANL</td><td style="text-align: left;">direct, #immed</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">54</td><td style="text-align: left;">2</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">55</td><td style="text-align: left;">2</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">56</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">57</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">58</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">59</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">5A</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">5B</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">5C</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">5D</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">5E</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">5F</td><td style="text-align: left;">1</td><td style="text-align: left;">ANL</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">60</td><td style="text-align: left;">2</td><td style="text-align: left;">JZ</td><td style="text-align: left;">offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">61</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">62</td><td style="text-align: left;">2</td><td style="text-align: left;">XRL</td><td style="text-align: left;">direct, A</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">63</td><td style="text-align: left;">3</td><td style="text-align: left;">XRL</td><td style="text-align: left;">direct, #immed</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">64</td><td style="text-align: left;">2</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">65</td><td style="text-align: left;">2</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">66</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">67</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">68</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">69</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">6A</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">6B</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">6C</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">6D</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">6E</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">6F</td><td style="text-align: left;">1</td><td style="text-align: left;">XRL</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">70</td><td style="text-align: left;">2</td><td style="text-align: left;">JNZ</td><td style="text-align: left;">offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">71</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">72</td><td style="text-align: left;">2</td><td style="text-align: left;">ORL</td><td style="text-align: left;">C, bit</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">73</td><td style="text-align: left;">1</td><td style="text-align: left;">JMP</td><td style="text-align: left;"><span class="citation" data-cites="A+DPTR">@A+DPTR</span></td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">74</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">75</td><td style="text-align: left;">3</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, #immed</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">76</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;"><span class="citation" data-cites="R0">@R0</span>, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">77</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;"><span class="citation" data-cites="R1">@R1</span>, #immed</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">78</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R0, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">79</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R1, #immed</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">7A</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R2, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">7B</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R3, #immed</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">7C</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R4, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">7D</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R5, #immed</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">7E</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R6, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">7F</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R7, #immed</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">80</td><td style="text-align: left;">2</td><td style="text-align: left;">SJMP</td><td style="text-align: left;">offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">81</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">82</td><td style="text-align: left;">2</td><td style="text-align: left;">ANL</td><td style="text-align: left;">C, bit</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">83</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVC</td><td style="text-align: left;">A, <span class="citation" data-cites="A+PC">@A+PC</span></td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">84</td><td style="text-align: left;">1</td><td style="text-align: left;">DIV</td><td style="text-align: left;">AB</td><td style="text-align: left;">4</td></tr><tr class="even"><td style="text-align: left;">85</td><td style="text-align: left;">3</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, direct</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">86</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">87</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">88</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R0</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">89</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R1</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">8A</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R2</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">8B</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R3</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">8C</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R4</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">8D</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R5</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">8E</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R6</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">8F</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, R7</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">90</td><td style="text-align: left;">3</td><td style="text-align: left;">MOV</td><td style="text-align: left;">DPTR, #immed</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">91</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">92</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">bit, C</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">93</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVC</td><td style="text-align: left;">A, <span class="citation" data-cites="A+DPTR">@A+DPTR</span></td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">94</td><td style="text-align: left;">2</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, #immed</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">95</td><td style="text-align: left;">2</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">96</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">97</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">98</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">99</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">9A</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">9B</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">9C</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">9D</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">9E</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">9F</td><td style="text-align: left;">1</td><td style="text-align: left;">SUBB</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">A0</td><td style="text-align: left;">2</td><td style="text-align: left;">ORL</td><td style="text-align: left;">C, /bit</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">A1</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">A2</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">C, bit</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">A3</td><td style="text-align: left;">1</td><td style="text-align: left;">INC</td><td style="text-align: left;">DPTR</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">A4</td><td style="text-align: left;">1</td><td style="text-align: left;">MUL</td><td style="text-align: left;">AB</td><td style="text-align: left;">4</td></tr><tr class="even"><td style="text-align: left;">A5</td><td style="text-align: left;">-</td><td style="text-align: left;">reserved</td><td style="text-align: left;">-</td><td style="text-align: left;">-</td></tr><tr class="odd"><td style="text-align: left;">A6</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;"><span class="citation" data-cites="R0">@R0</span>, direct</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">A7</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;"><span class="citation" data-cites="R1">@R1</span>, direct</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">A8</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R0, direct</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">A9</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R1, direct</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">AA</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R2, direct</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">AB</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R3, direct</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">AC</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R4, direct</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">AD</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R5, direct</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">AE</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R6, direct</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">AF</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R7, direct</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">B0</td><td style="text-align: left;">2</td><td style="text-align: left;">ANL</td><td style="text-align: left;">C, /bit</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">B1</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">B2</td><td style="text-align: left;">2</td><td style="text-align: left;">CPL</td><td style="text-align: left;">bit</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">B3</td><td style="text-align: left;">1</td><td style="text-align: left;">CPL</td><td style="text-align: left;">C</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">B4</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">A, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">B5</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">A, direct, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">B6</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;"><span class="citation" data-cites="R0">@R0</span>, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">B7</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;"><span class="citation" data-cites="R1">@R1</span>, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">B8</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R0, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">B9</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R1, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">BA</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R2, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">BB</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R3, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">BC</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R4, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">BD</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R5, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">BE</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R6, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">BF</td><td style="text-align: left;">3</td><td style="text-align: left;">CJNE</td><td style="text-align: left;">R7, #immed, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">C0</td><td style="text-align: left;">2</td><td style="text-align: left;">PUSH</td><td style="text-align: left;">direct</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">C1</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">C2</td><td style="text-align: left;">2</td><td style="text-align: left;">CLR</td><td style="text-align: left;">bit</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">C3</td><td style="text-align: left;">1</td><td style="text-align: left;">CLR</td><td style="text-align: left;">C</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">C4</td><td style="text-align: left;">1</td><td style="text-align: left;">SWAP</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">C5</td><td style="text-align: left;">2</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">C6</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">C7</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">C8</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">C9</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">CA</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">CB</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">CC</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">CD</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">CE</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">CF</td><td style="text-align: left;">1</td><td style="text-align: left;">XCH</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">D0</td><td style="text-align: left;">2</td><td style="text-align: left;">POP</td><td style="text-align: left;">direct</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">D1</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">D2</td><td style="text-align: left;">2</td><td style="text-align: left;">SETB</td><td style="text-align: left;">bit</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">D3</td><td style="text-align: left;">1</td><td style="text-align: left;">SETB</td><td style="text-align: left;">C</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">D4</td><td style="text-align: left;">1</td><td style="text-align: left;">DA</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">D5</td><td style="text-align: left;">3</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">direct, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">D6</td><td style="text-align: left;">1</td><td style="text-align: left;">XCHD</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">D7</td><td style="text-align: left;">1</td><td style="text-align: left;">XCHD</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">D8</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R0, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">D9</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R1, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">DA</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R2, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">DB</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R3, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">DC</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R4, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">DD</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R5, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">DE</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R6, offset</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">DF</td><td style="text-align: left;">2</td><td style="text-align: left;">DJNZ</td><td style="text-align: left;">R7, offset</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">E0</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVX</td><td style="text-align: left;">A, <span class="citation" data-cites="DPTR">@DPTR</span></td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">E1</td><td style="text-align: left;">2</td><td style="text-align: left;">AJMP</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">E2</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVX</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">E3</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVX</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">E4</td><td style="text-align: left;">1</td><td style="text-align: left;">CLR</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">E5</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, direct</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">E6</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">E7</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">E8</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R0</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">E9</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R1</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">EA</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R2</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">EB</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R3</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">EC</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R4</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">ED</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R5</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">EE</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R6</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">EF</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">A, R7</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">F0</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVX</td><td style="text-align: left;"><span class="citation" data-cites="DPTR">@DPTR</span>, A</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">F1</td><td style="text-align: left;">2</td><td style="text-align: left;">ACALL</td><td style="text-align: left;">addr11</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">F2</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVX</td><td style="text-align: left;"><span class="citation" data-cites="R0">@R0</span>, A</td><td style="text-align: left;">2</td></tr><tr class="even"><td style="text-align: left;">F3</td><td style="text-align: left;">1</td><td style="text-align: left;">MOVX</td><td style="text-align: left;"><span class="citation" data-cites="R1">@R1</span>, A</td><td style="text-align: left;">2</td></tr><tr class="odd"><td style="text-align: left;">F4</td><td style="text-align: left;">1</td><td style="text-align: left;">CPL</td><td style="text-align: left;">A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">F5</td><td style="text-align: left;">2</td><td style="text-align: left;">MOV</td><td style="text-align: left;">direct, A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">F6</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;"><span class="citation" data-cites="R0">@R0</span>, A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">F7</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;"><span class="citation" data-cites="R1">@R1</span>, A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">F8</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R0, A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">F9</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R1, A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">FA</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R2, A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">FB</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R3, A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">FC</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R4, A</td><td style="text-align: left;">1</td></tr><tr class="even"><td style="text-align: left;">FD</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R5, A</td><td style="text-align: left;">1</td></tr><tr class="odd"><td style="text-align: left;">FF</td><td style="text-align: left;">1</td><td style="text-align: left;">MOV</td><td style="text-align: left;">R7, A</td><td style="text-align: left;">1</td></tr></tbody></table><h2 id="说明">说明</h2><h3 id="机器周期数规则">机器周期数规则</h3><ul><li><strong>单字节指令</strong>(如NOP、INC A):多数为1周期;特殊指令(MUL AB、DIV AB)为4周期;INC DPTR为2周期</li><li><strong>双字节指令</strong>(如AJMP、ACALL):多数为2周期;部分双字节指令(如MOV A, direct、INC direct)为1周期</li><li><strong>三字节指令</strong>(如LJMP、CJNE系列):全部为2周期</li><li><strong>保留指令</strong>:A5H为未定义指令,无对应助记符和机器周期数</li></ul><h3 id="操作数说明">操作数说明</h3><ul><li><code>addr11</code> - 11位地址</li><li><code>addr16</code> - 16位地址</li><li><code>immed</code> - 8位立即数</li><li><code>offset</code> - 8位相对偏移量(补码形式)</li><li><code>bit</code> - 位地址(00H~7FH)</li><li><code>direct</code> - 内部RAM直接地址(00H~FFH)</li><li><code>@Ri</code> - 间接寻址(R0或R1作为指针)</li></ul><h3 id="基础信息">基础信息</h3><ul><li><strong>表格结构</strong>:按机器码(十六进制)顺序从00H到FFH排列,共256条指令</li><li><strong>时序基准</strong>:机器周期数基于12T模式(1个机器周期 = 12个时钟周期),这是8051的标准工作模式</li><li><strong>寻址方式</strong>:支持寄存器、直接、间接、立即数等多种寻址方式</li><li><strong>应用范围</strong>:表格涵盖8051单片机全部核心指令,不包含特殊厂商自定义扩展指令</li></ul><h2 id="分类指令表">分类指令表</h2><h3 id="数据移动指令">1. 数据移动指令</h3><h4 id="通用数据移动-mov">1.1 通用数据移动 (MOV)</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">MOV A, #data</td><td style="text-align: left;">74H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">立即数送入累加器</td></tr><tr class="even"><td style="text-align: left;">MOV A, direct</td><td style="text-align: left;">E5H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">直接地址内容送入累加器</td></tr><tr class="odd"><td style="text-align: left;">MOV A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">E6H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">R0间接寻址内容送入累加器</td></tr><tr class="even"><td style="text-align: left;">MOV A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">E7H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">R1间接寻址内容送入累加器</td></tr><tr class="odd"><td style="text-align: left;">MOV A, R0~R7</td><td style="text-align: left;">E8H~EFH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">寄存器内容送入累加器</td></tr><tr class="even"><td style="text-align: left;">MOV direct, A</td><td style="text-align: left;">F5H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器内容送入直接地址</td></tr><tr class="odd"><td style="text-align: left;">MOV direct, #data</td><td style="text-align: left;">75H direct data</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">立即数送入直接地址</td></tr><tr class="even"><td style="text-align: left;">MOV direct, direct</td><td style="text-align: left;">85H direct1 direct2</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">源直接地址内容送入目的直接地址</td></tr><tr class="odd"><td style="text-align: left;">MOV direct, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">A6H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">R0间接寻址内容送入直接地址</td></tr><tr class="even"><td style="text-align: left;">MOV direct, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">A7H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">R1间接寻址内容送入直接地址</td></tr><tr class="odd"><td style="text-align: left;">MOV direct, R0~R7</td><td style="text-align: left;">A8H~AFH direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">寄存器内容送入直接地址</td></tr><tr class="even"><td style="text-align: left;">MOV <span class="citation" data-cites="R0">@R0</span>, A</td><td style="text-align: left;">F6H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器内容送入R0指向的位置</td></tr><tr class="odd"><td style="text-align: left;">MOV <span class="citation" data-cites="R0">@R0</span>, #data</td><td style="text-align: left;">76H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">立即数送入R0指向的位置</td></tr><tr class="even"><td style="text-align: left;">MOV <span class="citation" data-cites="R0">@R0</span>, direct</td><td style="text-align: left;">86H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址内容送入R0指向的位置</td></tr><tr class="odd"><td style="text-align: left;">MOV <span class="citation" data-cites="R1">@R1</span>, A</td><td style="text-align: left;">F7H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器内容送入R1指向的位置</td></tr><tr class="even"><td style="text-align: left;">MOV <span class="citation" data-cites="R1">@R1</span>, #data</td><td style="text-align: left;">77H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">立即数送入R1指向的位置</td></tr><tr class="odd"><td style="text-align: left;">MOV <span class="citation" data-cites="R1">@R1</span>, direct</td><td style="text-align: left;">87H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址内容送入R1指向的位置</td></tr><tr class="even"><td style="text-align: left;">MOV R0~R7, A</td><td style="text-align: left;">F8H~FFH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器内容送入寄存器</td></tr><tr class="odd"><td style="text-align: left;">MOV R0~R7, #data</td><td style="text-align: left;">78H~7FH data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">立即数送入寄存器</td></tr><tr class="even"><td style="text-align: left;">MOV R0~R7, direct</td><td style="text-align: left;">A8H~AFH direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址内容送入寄存器</td></tr><tr class="odd"><td style="text-align: left;">MOV DPTR, #data</td><td style="text-align: left;">90H data16</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">16位立即数送入数据指针</td></tr></tbody></table><h4 id="外部ram数据移动-movx">1.2 外部RAM数据移动 (MOVX)</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">MOVX A, <span class="citation" data-cites="DPTR">@DPTR</span></td><td style="text-align: left;">E0H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">外部RAM(DPTR)内容送入累加器</td></tr><tr class="even"><td style="text-align: left;">MOVX A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">E2H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">外部RAM(R0)内容送入累加器</td></tr><tr class="odd"><td style="text-align: left;">MOVX A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">E3H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">外部RAM(R1)内容送入累加器</td></tr><tr class="even"><td style="text-align: left;">MOVX <span class="citation" data-cites="DPTR">@DPTR</span>, A</td><td style="text-align: left;">F0H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">累加器内容送入外部RAM(DPTR)</td></tr><tr class="odd"><td style="text-align: left;">MOVX <span class="citation" data-cites="R0">@R0</span>, A</td><td style="text-align: left;">F2H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">累加器内容送入外部RAM(R0)</td></tr><tr class="even"><td style="text-align: left;">MOVX <span class="citation" data-cites="R1">@R1</span>, A</td><td style="text-align: left;">F3H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">累加器内容送入外部RAM(R1)</td></tr></tbody></table><h4 id="代码存储器数据移动-movc">1.3 代码存储器数据移动 (MOVC)</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">MOVC A, <span class="citation" data-cites="A+PC">@A+PC</span></td><td style="text-align: left;">83H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">ROM(A+PC)内容送入累加器</td></tr><tr class="even"><td style="text-align: left;">MOVC A, <span class="citation" data-cites="A+DPTR">@A+DPTR</span></td><td style="text-align: left;">93H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">ROM(A+DPTR)内容送入累加器</td></tr></tbody></table><h4 id="数据交换-xchxchd">1.4 数据交换 (XCH/XCHD)</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">XCH A, direct</td><td style="text-align: left;">C5H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与直接地址交换</td></tr><tr class="even"><td style="text-align: left;">XCH A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">C6H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R0指向位置交换</td></tr><tr class="odd"><td style="text-align: left;">XCH A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">C7H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R1指向位置交换</td></tr><tr class="even"><td style="text-align: left;">XCH A, R0~R7</td><td style="text-align: left;">C8H~CFH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与寄存器交换</td></tr><tr class="odd"><td style="text-align: left;">XCHD A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">D6H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器低4位与R0指向位置低4位交换</td></tr><tr class="even"><td style="text-align: left;">XCHD A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">D7H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器低4位与R1指向位置低4位交换</td></tr></tbody></table><h4 id="堆栈操作">1.5 堆栈操作</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">PUSH direct</td><td style="text-align: left;">C0H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址内容入栈</td></tr><tr class="even"><td style="text-align: left;">POP direct</td><td style="text-align: left;">D0H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">栈顶内容出栈到直接地址</td></tr></tbody></table><h3 id="算术运算指令">2. 算术运算指令</h3><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">ADD A, #data</td><td style="text-align: left;">24H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加立即数</td></tr><tr class="even"><td style="text-align: left;">ADD A, direct</td><td style="text-align: left;">25H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加直接地址内容</td></tr><tr class="odd"><td style="text-align: left;">ADD A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">26H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加R0间接寻址内容</td></tr><tr class="even"><td style="text-align: left;">ADD A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">27H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加R1间接寻址内容</td></tr><tr class="odd"><td style="text-align: left;">ADD A, R0~R7</td><td style="text-align: left;">28H~2FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加寄存器</td></tr><tr class="even"><td style="text-align: left;">ADDC A, #data</td><td style="text-align: left;">34H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加立即数加进位</td></tr><tr class="odd"><td style="text-align: left;">ADDC A, direct</td><td style="text-align: left;">35H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加直接地址内容加进位</td></tr><tr class="even"><td style="text-align: left;">ADDC A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">36H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加R0间接寻址内容加进位</td></tr><tr class="odd"><td style="text-align: left;">ADDC A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">37H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加R1间接寻址内容加进位</td></tr><tr class="even"><td style="text-align: left;">ADDC A, R0~R7</td><td style="text-align: left;">38H~3FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加寄存器加进位</td></tr><tr class="odd"><td style="text-align: left;">SUBB A, #data</td><td style="text-align: left;">94H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器减立即数减借位</td></tr><tr class="even"><td style="text-align: left;">SUBB A, direct</td><td style="text-align: left;">95H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器减直接地址内容减借位</td></tr><tr class="odd"><td style="text-align: left;">SUBB A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">96H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器减R0间接寻址内容减借位</td></tr><tr class="even"><td style="text-align: left;">SUBB A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">97H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器减R1间接寻址内容减借位</td></tr><tr class="odd"><td style="text-align: left;">SUBB A, R0~R7</td><td style="text-align: left;">98H~9FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器减寄存器减借位</td></tr><tr class="even"><td style="text-align: left;">INC A</td><td style="text-align: left;">04H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器加1</td></tr><tr class="odd"><td style="text-align: left;">INC direct</td><td style="text-align: left;">05H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">直接地址加1</td></tr><tr class="even"><td style="text-align: left;">INC <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">06H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">R0指向位置加1</td></tr><tr class="odd"><td style="text-align: left;">INC <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">07H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">R1指向位置加1</td></tr><tr class="even"><td style="text-align: left;">INC R0~R7</td><td style="text-align: left;">08H~0FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">寄存器加1</td></tr><tr class="odd"><td style="text-align: left;">INC DPTR</td><td style="text-align: left;">A3H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">数据指针加1</td></tr><tr class="even"><td style="text-align: left;">DEC A</td><td style="text-align: left;">14H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器减1</td></tr><tr class="odd"><td style="text-align: left;">DEC direct</td><td style="text-align: left;">15H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">直接地址减1</td></tr><tr class="even"><td style="text-align: left;">DEC <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">16H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">R0指向位置减1</td></tr><tr class="odd"><td style="text-align: left;">DEC <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">17H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">R1指向位置减1</td></tr><tr class="even"><td style="text-align: left;">DEC R0~R7</td><td style="text-align: left;">18H~1FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">寄存器减1</td></tr><tr class="odd"><td style="text-align: left;">MUL AB</td><td style="text-align: left;">A4H</td><td style="text-align: left;">1</td><td style="text-align: left;">4</td><td style="text-align: left;">A×B,乘积送A和B</td></tr><tr class="even"><td style="text-align: left;">DIV AB</td><td style="text-align: left;">84H</td><td style="text-align: left;">1</td><td style="text-align: left;">4</td><td style="text-align: left;">A÷B,商存A,余数存B</td></tr><tr class="odd"><td style="text-align: left;">DA A</td><td style="text-align: left;">D4H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">十进制调整A</td></tr></tbody></table><h3 id="逻辑运算指令">3. 逻辑运算指令</h3><h4 id="字节级逻辑运算">3.1 字节级逻辑运算</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">ANL A, #data</td><td style="text-align: left;">54H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与立即数逻辑与</td></tr><tr class="even"><td style="text-align: left;">ANL A, direct</td><td style="text-align: left;">55H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与直接地址逻辑与</td></tr><tr class="odd"><td style="text-align: left;">ANL A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">56H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R0间接寻址逻辑与</td></tr><tr class="even"><td style="text-align: left;">ANL A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">57H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R1间接寻址逻辑与</td></tr><tr class="odd"><td style="text-align: left;">ANL A, R0~R7</td><td style="text-align: left;">58H~5FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与寄存器逻辑与</td></tr><tr class="even"><td style="text-align: left;">ANL direct, A</td><td style="text-align: left;">52H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址与累加器逻辑与</td></tr><tr class="odd"><td style="text-align: left;">ANL direct, #data</td><td style="text-align: left;">53H direct data</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址与立即数逻辑与</td></tr><tr class="even"><td style="text-align: left;">ORL A, #data</td><td style="text-align: left;">44H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与立即数逻辑或</td></tr><tr class="odd"><td style="text-align: left;">ORL A, direct</td><td style="text-align: left;">45H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与直接地址逻辑或</td></tr><tr class="even"><td style="text-align: left;">ORL A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">46H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R0间接寻址逻辑或</td></tr><tr class="odd"><td style="text-align: left;">ORL A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">47H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R1间接寻址逻辑或</td></tr><tr class="even"><td style="text-align: left;">ORL A, R0~R7</td><td style="text-align: left;">48H~4FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与寄存器逻辑或</td></tr><tr class="odd"><td style="text-align: left;">ORL direct, A</td><td style="text-align: left;">42H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址与累加器逻辑或</td></tr><tr class="even"><td style="text-align: left;">ORL direct, #data</td><td style="text-align: left;">43H direct data</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址与立即数逻辑或</td></tr><tr class="odd"><td style="text-align: left;">XRL A, #data</td><td style="text-align: left;">64H data</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与立即数逻辑异或</td></tr><tr class="even"><td style="text-align: left;">XRL A, direct</td><td style="text-align: left;">65H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与直接地址逻辑异或</td></tr><tr class="odd"><td style="text-align: left;">XRL A, <span class="citation" data-cites="R0">@R0</span></td><td style="text-align: left;">66H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R0间接寻址逻辑异或</td></tr><tr class="even"><td style="text-align: left;">XRL A, <span class="citation" data-cites="R1">@R1</span></td><td style="text-align: left;">67H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与R1间接寻址逻辑异或</td></tr><tr class="odd"><td style="text-align: left;">XRL A, R0~R7</td><td style="text-align: left;">68H~6FH</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器与寄存器逻辑异或</td></tr><tr class="even"><td style="text-align: left;">XRL direct, A</td><td style="text-align: left;">62H direct</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址与累加器逻辑异或</td></tr><tr class="odd"><td style="text-align: left;">XRL direct, #data</td><td style="text-align: left;">63H direct data</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址与立即数逻辑异或</td></tr></tbody></table><h4 id="位操作指令">3.2 位操作指令</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">CLR A</td><td style="text-align: left;">E4H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器清零</td></tr><tr class="even"><td style="text-align: left;">CLR C</td><td style="text-align: left;">C3H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">进位位清零</td></tr><tr class="odd"><td style="text-align: left;">CLR bit</td><td style="text-align: left;">C2H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">位地址清零</td></tr><tr class="even"><td style="text-align: left;">CPL A</td><td style="text-align: left;">F4H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器逻辑非</td></tr><tr class="odd"><td style="text-align: left;">CPL C</td><td style="text-align: left;">B3H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">进位位逻辑非</td></tr><tr class="even"><td style="text-align: left;">CPL bit</td><td style="text-align: left;">B2H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">位地址逻辑非</td></tr><tr class="odd"><td style="text-align: left;">SETB C</td><td style="text-align: left;">D3H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">进位位置1</td></tr><tr class="even"><td style="text-align: left;">SETB bit</td><td style="text-align: left;">D2H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">位地址置1</td></tr><tr class="odd"><td style="text-align: left;">MOV C, bit</td><td style="text-align: left;">A2H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">1</td><td style="text-align: left;">位地址内容送进位位</td></tr><tr class="even"><td style="text-align: left;">MOV bit, C</td><td style="text-align: left;">92H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">进位位内容送位地址</td></tr></tbody></table><h4 id="位逻辑且一运算">3.3 位逻辑且一运算</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">ANL C, bit</td><td style="text-align: left;">82H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">进位位与位地址逻辑与</td></tr><tr class="even"><td style="text-align: left;">ANL C, /bit</td><td style="text-align: left;">B0H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">进位位与位地址非逻辑与</td></tr><tr class="odd"><td style="text-align: left;">ORL C, bit</td><td style="text-align: left;">72H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">进位位与位地址逻辑或</td></tr><tr class="even"><td style="text-align: left;">ORL C, /bit</td><td style="text-align: left;">A0H bit</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">进位位与位地址非逻辑或</td></tr></tbody></table><h4 id="移位和循环指令">3.4 移位和循环指令</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">RL A</td><td style="text-align: left;">23H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器循环左移1位</td></tr><tr class="even"><td style="text-align: left;">RLC A</td><td style="text-align: left;">33H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器循环左移1位(含进位)</td></tr><tr class="odd"><td style="text-align: left;">RR A</td><td style="text-align: left;">03H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器循环右移1位</td></tr><tr class="even"><td style="text-align: left;">RRC A</td><td style="text-align: left;">13H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器循环右移1位(含进位)</td></tr><tr class="odd"><td style="text-align: left;">SWAP A</td><td style="text-align: left;">C4H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">累加器高低4位交换</td></tr></tbody></table><h3 id="转移指令">4. 转移指令</h3><h4 id="无条件转移">4.1 无条件转移</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">LJMP addr16</td><td style="text-align: left;">02H addr16</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">长跳转(64KB范围内)</td></tr><tr class="even"><td style="text-align: left;">AJMP addr11</td><td style="text-align: left;">a10~a8 00001 a7~a0</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">绝对跳转(2KB范围内)</td></tr><tr class="odd"><td style="text-align: left;">SJMP offset</td><td style="text-align: left;">80H offset</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">短跳转(相对地址,范围-128~+127)</td></tr><tr class="even"><td style="text-align: left;">JMP <span class="citation" data-cites="A+DPTR">@A+DPTR</span></td><td style="text-align: left;">73H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">间接跳转(A+DPTR为目标地址)</td></tr></tbody></table><h4 id="累加器条件转移">4.2 累加器条件转移</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">JZ offset</td><td style="text-align: left;">60H offset</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">累加器为0则相对跳转</td></tr><tr class="even"><td style="text-align: left;">JNZ offset</td><td style="text-align: left;">70H offset</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">累加器不为0则相对跳转</td></tr></tbody></table><h4 id="比较条件转移">4.3 比较条件转移</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">CJNE A, #data, offset</td><td style="text-align: left;">B4H data offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">A与立即数不等则相对跳转</td></tr><tr class="even"><td style="text-align: left;">CJNE A, direct, offset</td><td style="text-align: left;">B5H direct offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">A与直接地址不等则相对跳转</td></tr><tr class="odd"><td style="text-align: left;">CJNE <span class="citation" data-cites="R0">@R0</span>, #data, offset</td><td style="text-align: left;">B6H data offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">R0指向值与立即数不等则相对跳转</td></tr><tr class="even"><td style="text-align: left;">CJNE <span class="citation" data-cites="R1">@R1</span>, #data, offset</td><td style="text-align: left;">B7H data offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">R1指向值与立即数不等则相对跳转</td></tr><tr class="odd"><td style="text-align: left;">CJNE R0~R7, #data, offset</td><td style="text-align: left;">B8H~BFH data offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">寄存器与立即数不等则相对跳转</td></tr></tbody></table><h4 id="循环控制转移">4.4 循环控制转移</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">DJNZ Rn, offset</td><td style="text-align: left;">D8H~DFH offset</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">寄存器减1不为0则相对跳转</td></tr><tr class="even"><td style="text-align: left;">DJNZ direct, offset</td><td style="text-align: left;">D5H direct offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">直接地址减1不为0则相对跳转</td></tr></tbody></table><h4 id="进位位条件转移">4.5 进位位条件转移</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">JC offset</td><td style="text-align: left;">40H offset</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">进位位为1则相对跳转</td></tr><tr class="even"><td style="text-align: left;">JNC offset</td><td style="text-align: left;">50H offset</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">进位位为0则相对跳转</td></tr></tbody></table><h4 id="位条件转移">4.6 位条件转移</h4><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">JB bit, offset</td><td style="text-align: left;">20H bit offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">位地址为1则相对跳转</td></tr><tr class="even"><td style="text-align: left;">JNB bit, offset</td><td style="text-align: left;">30H bit offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">位地址为0则相对跳转</td></tr><tr class="odd"><td style="text-align: left;">JBC bit, offset</td><td style="text-align: left;">10H bit offset</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">位地址为1则相对跳转,并清零该位</td></tr></tbody></table><h3 id="子程序调用和返回指令">5. 子程序调用和返回指令</h3><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">LCALL addr16</td><td style="text-align: left;">12H addr16</td><td style="text-align: left;">3</td><td style="text-align: left;">2</td><td style="text-align: left;">长调用(64KB范围内)</td></tr><tr class="even"><td style="text-align: left;">ACALL addr11</td><td style="text-align: left;">a10~a8 00011 a7~a0</td><td style="text-align: left;">2</td><td style="text-align: left;">2</td><td style="text-align: left;">绝对调用(2KB范围内)</td></tr><tr class="odd"><td style="text-align: left;">RET</td><td style="text-align: left;">22H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">子程序返回</td></tr><tr class="even"><td style="text-align: left;">RETI</td><td style="text-align: left;">32H</td><td style="text-align: left;">1</td><td style="text-align: left;">2</td><td style="text-align: left;">中断服务程序返回</td></tr></tbody></table><h3 id="其他指令">6. 其他指令</h3><table><thead><tr class="header"><th style="text-align: left;">Mnemonic</th><th style="text-align: left;">Hex Code</th><th style="text-align: left;">Bytes</th><th style="text-align: left;">Machine Cycles</th><th style="text-align: left;">Description</th></tr></thead><tbody><tr class="odd"><td style="text-align: left;">NOP</td><td style="text-align: left;">00H</td><td style="text-align: left;">1</td><td style="text-align: left;">1</td><td style="text-align: left;">空操作(延时1个机器周期)</td></tr></tbody></table><h2 id="附录-8051存储结构和地址空间">附录 8051存储结构和地址空间</h2><figure><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/8fad1b121a0c863b95c2e7b5102b3551.png" alt="8051存储结构和地址空间" /><figcaption aria-hidden="true">8051存储结构和地址空间</figcaption></figure><h2 id="参考资料">参考资料</h2><ol type="1"><li><a href="https://github.com/lukbettale/VM8051">8051模拟器</a></li><li><a href="https://www.echo.cool/docs/category/51-%E5%8D%95%E7%89%87%E6%9C%BA%E6%95%99%E7%A8%8B">51单片机教程</a></li></ol>]]></content>
<categories>
<category>技术笔记</category>
</categories>
<tags>
<tag>单片机</tag>
<tag>嵌入式</tag>
</tags>
</entry>
<entry>
<title>计算机发展过程</title>
<link href="/blogs/2026/02/22/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%8F%91%E5%B1%95%E8%BF%87%E7%A8%8B/"/>
<url>/blogs/2026/02/22/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%8F%91%E5%B1%95%E8%BF%87%E7%A8%8B/</url>
<content type="html"><![CDATA[<h1 id="计算机发展过程">计算机发展过程</h1><p>从1946年第一台计算机enic开发以来,计算机经过过几十年的发展,对世界产生了巨大的影响。 现在我们来回顾一下计算机的发展过程。</p><h2 id="x86-计算机的发展过程">x86 计算机的发展过程</h2><ul><li>1972:? 8080,第一块个人计算机芯片,它位8位计算机。</li><li>1978年: Intel发布 8086cpu,8086是兼容8080的16位计算机,带有几个专用16位寄存器,位通用就是机器计算机。</li><li>1980: 8087,浮点数协处理器,为专用浮点数处理器,它具有60条浮点数指令,使用栈(而不是寄存器)进行运算。</li><li>1982: 80286,扩展8086,地址线扩展到24条,寻址范围由8086的<span class="math inline">\(2^16\)</span>扩展到<span class="math inline">\(2^24\)</span>。添加保护模式和相应指令。</li><li>1985: 80386,32架构,32位寻址,32位寄存器,添加分页机制,向下兼容8086(8086代码可以不用作任何修改,直接能在80386机器运行)。</li><li>1989-95: 80486--1989,Pentium———1992,Pentium-pro ———1995款,添加了4条指令</li><li>1997: 增加57条MMX多媒体指令用来加速浮点数计算,主要为SIMD指令。</li><li>1999: Pentium III 添加70条SSE指令,添加8个独立的128位寄存器,可以并行执行4个32位浮点数运算。</li><li>2001: 添加144指令SSE2指令。</li><li>2003: amd64 提出64位架构,并保留对32bit架构的支持。</li><li>2004: intel采用amd64架构,添加SSE3指令</li><li>2006: 添加SSE4指令。</li><li>2007: 添加SSE5指令。</li><li>2007: Intel 引入高级向量扩展(AVE)。</li></ul>]]></content>
<categories>
<category>技术笔记</category>
</categories>
<tags>
<tag>嵌入式</tag>
</tags>
</entry>
<entry>
<title>Flash基本原理</title>
<link href="/blogs/2026/02/03/Flash%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/"/>
<url>/blogs/2026/02/03/Flash%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/</url>
<content type="html"><![CDATA[<h1 id="flashnandflash-norflash-基本原理">Flash(NandFlash & NorFlash) 基本原理</h1><blockquote><p>引用来源:AMDDMA,原文链接:https://blog.csdn.net/AMDDMA/article/details/99349860</p></blockquote><hr /><h2 id="一flash-基本原理及分类">一、Flash 基本原理及分类</h2><h3 id="基本存储单元">1.1 基本存储单元</h3><p>Flash 的基本存储单元是以浮栅(floating-gate)结构实现的场效应管。电子可以被注入或释放到浮栅上,使得晶体管的阈值电压发生可测量的偏移,从而表示不同的存储状态。读写操作通过控制栅极和源/漏极的电压来改变或测试浮栅上的电荷量。 <img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/55ab0d8530f9242e5a45627071e4df75.jpeg" /></p><p>图1.1:浮栅场效应管结构示意</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/67827e4bf254c09f49e5f3a425f375e7.png" /></p><p>图1.2:存储单元读写数据过程</p><h3 id="存储颗粒分类">1.2 存储颗粒分类</h3><p>根据每个单元能表示的电平,常见颗粒类型有 SLC、MLC、TLC、QLC 等。SLC 每单元表示 1 bit(2 个电平),MLC 表示 2 bit(4 个电平),TLC 表示 3 bit(8 个电平),QLC 表示 4 bit(16 个电平)。随着位数增加,单元密度与容量上升但可靠性、耐久性和读写速度限会下降。</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/307aed64f93ed109c332ab0edf6920fb.jpeg" /></p><p>图1.3:不同颗粒的存储密度</p><p>实现上还分为二维(2D)与三维(3D)结构:2D 在早期更常见,3D(堆叠)技术在高密度颗粒(如 TLC)中广泛应用,以提高容量与降低成本。</p><p><strong>SLC (Single-Level Cell)</strong> 单个存储单元存储1bit数据,即表示2种(2^1)数据状态:0和1</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/4991b9189f16ab8a2b64ccf97cf9dda6.png" /></p><p>图1.4:存储1bit的情形</p><p><strong>MLC</strong> (Multi-Level Cell) 单个存储单元存储2bit数据,即表示4种(2^2)数据状态:00,01,10,11</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/e24916954c52db48db4b38103455b009.png" /></p><p>图1.5:存储2bit的情形</p><p><strong>TLC</strong> (Trinary-Level Cell) 单个存储单元存储3bit数据,即表示8种(2^3)数据状态:000,……,111</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/15a77f46fec7f62c8b72746e1bfbe650.png" /></p><p>图1.6:存储3bit的情形</p><p><strong>QLC</strong> (Quad-Level Cell) 单个存储单元存储4bit数据,即表示16种(2^4)数据状态:0000,……,1111</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/01412ee75a66c9b9da30c32cb287252b.png" /></p><p>图1.7:存储4bit的情形</p><p>按颗粒制作工艺分类:2D和3D Flash技术,2D最早在SLC阶段应用广泛,3D在TLC阶段应用广发,具体结构区分:</p><p><strong>2D内部结构</strong>:</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/f42aa1188848b97aec31209f67591451.png" /></p><p>图1.7:2D结构技术示意图</p><p><strong>3D内部构造</strong>: <img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/691c7535bb409f77b779c2a86a4c4c1b.png" /></p><p>图1.8:3D内部构造</p><p>3D芯片内部结构:</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/8a93fade129b2f678336f3a81be23484.png" /></p><p>图1.9:3D内部构造</p><h3 id="flash-存储芯片分类">1.3 Flash 存储芯片分类</h3><p><strong>按阵列与访问方式分类</strong></p><p>分为 NAND 与 NOR 两类。</p><p>NOR 结构支持按地址随机读取,类似存储器接口,适合存放以代码,NAND 以高密度、页/块为单位的读写 擦除为特征,适合大量数据存储。 目前市面上常见的集成存储芯片类型:eMMC、UFS、SPI-Flash、QSPI-Flash、各尺寸的SD卡等。</p><p><strong>NandFlash存储阵列</strong>: <img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/68d6fc66f47e7bc00fdf5bb0df4f057a.png" /></p><p>图1.9 NandFlash存储单元阵列</p><p>** NorFlash存储阵列**:</p><blockquote><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/25fd7bc785a973d76eb76d725ea18754.png" /> 图1.10 NorFlash存储单元阵列</p></blockquote><p><strong>写入数据</strong>:</p><p>NorFlash:热电子注入效应(高压沟道雪崩击穿注入电子流)</p><p>NandFlash:F-N隧道效应(P/N结半导体导电特性)</p><p><strong>读取数据</strong>:</p><p>读取时控制栅极的控制电压不会过大影响浮置栅极的电荷,因此可以依据有无电荷读取存储的数据,当浮置栅极有电荷时,源极和漏极可以导通,读取到的bit是0;擦除后浮置栅极无电荷,源极和漏极不能导通,读取的bit是1(控制栅极的电平);</p><p>NorFlash一次最小可以读取1bit数据,NandFlash一次最小可以读取1byte数据;</p><p><strong>擦除数据</strong>:</p><p>NorFlash和NandFlash都是通过F-N隧道效应擦除数据(消耗浮置栅极的电荷)</p><h3 id="nand-与-nor-的异同">1.4 NAND 与 NOR 的异同</h3><p><strong>NandFlash</strong>:</p><ul><li><p>存储容量:适用于大容量的场景,不可运行程序;</p></li><li><p>擦写次数:擦写次数相对NorFlash较高;</p></li><li><p>擦写方式:按块、页擦写,可擦写次数较多,读写速率相对较高;</p></li><li><p>硬件接口:I/O口是数据线和地址线复用,通过CS等控制引脚控制时序完成地址传输和数据传输;</p></li><li><p>缺陷:需要管理坏块,NandFlash存在随机坏块问题,需要算法探测坏块并本分数据,EDC/ECC等一般在文件系统下实现,时序操作负责容易引起错误,只能以块为单位擦写,整体寿命相对短;</p></li><li><p>应用:当前市场的NandFlash用于大容量产品,如SSD的Flash、EMMC的Flash、UFS的Flash等都是NandFlash,不同的是SSD、EMMC、UFS等芯片集成的控制器和对外接口类型不同。</p></li><li><p>常见产品:市场常见产品均是串行接口,集成了控制器,控制器中集成坏块替换、均衡等管理;</p><ul><li><p>SSD(solid state disk)可以向外提供SATA或PCIe接口(代表产品有M.2 SSD,兼容SATA和PCIe接口);</p></li><li><p>EMMC(embeded MultiMedia Card)集成的控制器对外提供的接口类似于NandFlash的接口,统称SDIO(适用于SD卡的数据总线类型),以I/O地址数据线复用形式提供,CMD等实现指令操作;</p></li><li><p>UFS(Universal Flash Storage)对外提供的接口MIPI(Mobile Industry Processor Interface:该接口由ARM组织发起,目的是将摄像头、LCD显示屏、存储设备等统一为一个总线规范),处理器也需要支持MIPI接口,目前较新智能手机的SOC(ARM核)一般都支持该接口;</p></li></ul></li></ul><p><strong>NorFlash</strong>:</p><ul><li><p>存储容量:适用于存储容量小的场景,可运行程序;</p></li><li><p>擦写次数:擦写次数相对NandFlash较低;</p></li><li><p>擦写方式:按bit擦写,极少出现坏块,可靠性高,写入速率相对低,读取速率和NandFlash相差不大;</p></li><li><p>硬件接口:地址总线和数据总线是分开的,读写速率相对较高;</p></li><li><p>缺陷:写入速度低,可擦写次数相对NandFlash低;</p></li><li><p>应用:当前市场的NorFlash主要有串行和并行两种接口形式,并行的NorFlash芯片提供类似SRAM的接口,即有地址总线和数据总线,串行的NorFlash一般提供SPI等串行协议的接口实现数据读写;</p></li></ul><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/433fce1ece21483a537799cbd2373135.png" /></p><p>图1.11 Flash芯片内部组织</p><h2 id="二flash-的硬件电气特性">二、Flash 的硬件电气特性</h2><h3 id="芯片封装类型">2.1 芯片封装类型</h3><p>芯片封装依据厂商的设计和应用场景而不同,目前主要有SOP类、BGA类,相关封装对应的引脚定义参见以下描述;数据通道依据不同芯片也有不同的设计,当前有8bit数据通道和16bit数据通道。</p><h4 id="nandflash的常见芯片封装和引脚定义">2.1.1 NandFlash的常见芯片封装和引脚定义:</h4><ul><li><strong>SOP类芯片封装</strong></li></ul><p>8根数据线的存储芯片: <img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/6d881042f8a86709db162f2563592022.png" /> 图2.1 8通道的存储芯片TSOP或WSOP封装引脚定义</p><p>16根数据线的存储芯片:</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/6b01449822a84b30a8129b717291fb44.png" /></p><p>图2.2 16通道的存储芯片的TSOP或WSOP封装引脚定义</p><ul><li><strong>BGA类芯片封装</strong></li></ul><p>8根数据线的存储芯片:</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/d30987d50f1b70dcad496e57e99e4965.png" /></p><p>图2.3 8通道的存储芯片LGA封装引脚定义</p><p>16根数据线的存储芯片:</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/e942c9b3832c21009547a51989564fe5.png" /></p><p>图2.4 16通道的存储芯片LGA封装引脚定义</p><ul><li><strong>LGA封装</strong></li></ul><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/892eedb370cd6aa795da9384a85b655b.png" /> 图2.5 LGA-52封装尺寸</p><p>其他封装具体参见开源文档<a href="www.onfi.org">《Open Nand Flash Interface》</a>描述。</p><h4 id="norflash的常见芯片封装和引脚定义">2.1.2 NorFlash的常见芯片封装和引脚定义:</h4><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/99ed78b71e2911d55cbf360d30b44ffa.png" /> 图2.6 48引脚及44引脚NorFlash定义</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/08442590bf66bdc6ddc6cfe131d4431c.png" /> 图2.7 SPI接口的NorFlash TOP封装的引脚定义</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/afe0838ba1543a6726a4c6bac7d35f92.png" /> 图2.8 SPI接口的NorFlash BGA封装的引脚定义</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/9d4a99fffbcc2c49946d64686a5fad94.png" /> 图2.9 SPI接口的NorFlash的BGA封装尺寸信息</p><h3 id="芯片和处理器接口">2.2 芯片和处理器接口</h3><p>飞思卡尔(现属于NXP)处理器下,存储芯片等的硬件接口统称为IFC(Integrated flash controller),该总线在嵌入式系统中比较常见。IFC总线可以连接NandFlash、NorFlash、SRAM/DDR、EEPROM以及ASIC类,处理器的IFC总线一般带有NandFlash和NorFlash的控制器,以硬件的形式完成NandFlash或NorFlash的访问和控制;</p><p>以LS1021A处理器(ARM核)为例:</p><p>The IFC contains one NAND controller, one NOR flash controller, and one GPCM/generic-ASIC controller.</p><p>即IFC总线包含了NorFlash/NandFlash/GPCM/ASIC等控制器,帮助处理器完成对外围存储、器件的访问。</p><p><img src="https://raw.githubusercontent.com/xcrylu/BLOG-IMAGES/main/imges/03e5fb48e15ed8e3c033b70175abdb23.png" /> 图2.10 LS10*系列处理器的IFC总线相关描述</p><p>由上一节的芯片硬件接口可以看出,NandFlash没有数据线和地址线,只有I/O总线,其余引脚用于时序控制完成对应功能;</p><p>RK系列ARM处理器(瑞芯微),处理器对外的存储器接口,均以集成的方式展现,如MIPI、EMMC PHY等,这种情况下,就需要EMMC、UFS等芯片去连接,而不能直接用NandFlash连接到处理器上。</p><p>全志A、H系列ARM处理器,可以通过本地数据总线连接NandFlash,但名称不叫IFC,其中RK系列处理器的外置存储控制器,更适用于安卓系统的驱动,对于嵌入式系统也是一个新的发展趋势。</p><p><img src="https://i-blog.csdnimg.cn/blog_migrate/5b14a54d093b9df9954522a4d51f5c42.png"> 图2.11 RK3399处理器的框图</p><h3 id="flash读写">2.3 Flash读写</h3><p>NorFlash需要热电子注入,因此需要升压,电压要高于当前芯片的逻辑电压,因此NorFlash的写入速度较低,同样电压低的器件速度快,CPU从最初的5V电源系统更新到3.3V,乃至最新的1.8V和1.2V,都是为了提高元件的运行速度(频率),减少因逻辑切换引起的电压变换时延。</p><p>NandFlash由于借助半导体的P/N结特性,不存在电压超过芯片自身工作电压的工作情况,因此写入速度要大于NorFlash。</p><p>NorFlash和NandFlash的擦除速度相当,擦除原理均基于P/N结特性(F-N隧道效应),因此擦除速率几乎相等。</p><p>NandFlash的读写命令字规定(来自ONFI标准):</p><p>注:此规定是ONFI规定的,并非某厂商芯片的使用说明,某型号的芯片需要参照相关数据手册。</p><p>Flash的读、写、擦以及回写操作应为原子操作,执行原子操作时不应切换逻辑分区选择!</p><p>读取(包含回读)</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs js"><<span class="hljs-attr">CMD</span>: 00h> <ADDR: Column & Row> <CMD: 30h><br><CMD: 00h> <ADDR: Column & Row> <CMD: 31h><br><CMD: 00h> <ADDR: Column & Row> <CMD: 32h><br><CMD: 00h> <ADDR: Column & Row> <CMD: 35h><br></code></pre></td></tr></table></figure><ul><li>编程注意事项(包括回写编程): The Volume Select command may be issued prior to the 10h, 11h, or 15h command if the next command to this Volume is Change Row Address. After Volume Select command is issued to resume data input, the host shall wait tCCS before issuing Change Row Address command.</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs js"><<span class="hljs-attr">CMD</span>: 80h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 10h><br><CMD: 80h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 11h><br><CMD: 80h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 15h><br><CMD: 81h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 10h><br><CMD: 81h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 11h><br><CMD: 81h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 15h><br><CMD: 85h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 10h><br><CMD: 85h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 11h><br><CMD: 85h> <ADDR: Column & Row> <DIN: Data Input> <CMD: 15h><br><br></code></pre></td></tr></table></figure><p>• 擦除Flash命令:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs js"><<span class="hljs-attr">CMD</span>: 60h> <ADDR: Row> <CMD: D0h><br><CMD: 60h> <ADDR: Row> <CMD: D1h><br><CMD: 60h> <ADDR: Row> <CMD: 60h> <ADDR: Row> <CMD: D1h><br></code></pre></td></tr></table></figure><h2 id="三软件适配和文件系统">三、软件适配和文件系统</h2><h3 id="文件系统">3.1 文件系统</h3><p>此处以Linux为例。</p><p>Linux操作系统本身支持很多文件系统:ext系列(2~4)、cramfs、ubifs、jffs2、yaffs、yaffs2、等。</p><p>如果是发行版的linux,可以查看:/lib/modules/3.10.0-327.el7.x86_64/build/fs 目录下的文件夹,即可知道当前的linux支持的文件系统,同时该发行版支持的文件系统工具可以查看:ls /usr/sbin/ | grep mkfs。</p><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/67bc83b04f86762751fa6e5ad9134b5e.png" /> 图3.2 Linux下文件系统示意图</p><p>Linux下使用MTD工具管理Flash,其中支持在Flash上运行的文件系统有:cramfs、jffs、、ubifs等</p><h3 id="软件适配">3.2 软件适配</h3><p>Linux下适配NandFlash、NorFlash的分区信息时,通常是在设备树中配置mtd信息,以供linux启动后,用户层软件可以通过linux的ioctl实现对NandFlash或者NorFlash进行读写操作,来完成底层flash的数据替换等操作。</p><h2 id="四性能对比">四、性能对比</h2><h3 id="各类型颗粒性能对比">4.1 各类型颗粒性能对比</h3><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/ca6a893c0a564343b027e317a65cd365.png" /> 注:8线式表明芯片的数据物理连线为8根并行连线。</p><h3 id="nand和nor特性参数对比">4.2 Nand和Nor特性参数对比</h3><p><img src="https://cdn.jsdelivr.net/gh/xcrylu/BLOG-IMAGES/imges/0f5350f0bab3cc91bd8cfa6ccdded5bc.png" /></p><h3 id="参考资料">参考资料</h3><p>[1]. www.PCEVA.com.cn</p><p>[2]. ZOL.com.cn</p><p>[3].《POWERPC IFC总线与NOR_NAND 研究》</p><p>[4].《Open Nand Flash Interface》</p><p>[5]. https://blog.csdn.net/lh2016rocky/article/details/70886244</p><p>[6]. https://linux.cn/article-9798-1.html</p>]]></content>
<categories>
<category>技术笔记</category>
</categories>
<tags>
<tag>嵌入式</tag>
</tags>
</entry>
<entry>
<title>MOSFET结构及其工作原理详解</title>
<link href="/blogs/2026/01/28/mosfet%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E8%AF%A6%E8%A7%A3/"/>
<url>/blogs/2026/01/28/mosfet%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E8%AF%A6%E8%A7%A3/</url>
<content type="html"><![CDATA[<h1 id="mosfet结构及其工作原理详解">MOSFET结构及其工作原理详解</h1><p><strong>摘自:</strong> https://zhuanlan.zhihu.com/p/462392639 <img src="https://pic1.zhimg.com/70/v2-d0dba843b747691404eb4953c51790d6_1440w.avis?source=172ae18b&biz_tag=Post" alt="半导体结构示意图"></p><h2 id="mosfet基本概述">MOSFET基本概述</h2><p>MOSFET由MOS(Metal Oxide Semiconductor金属氧化物半导体)+FET(Field Effect Transistor场效应晶体管)这个两个缩写组成。即通过给金属层(M-金属铝)的栅极和隔着氧化层(O-绝缘层SiO2)的源极施加电压,产生电场的效应来控制半导体(S)导电沟道开关的场效应晶体管。由于栅极与源极、栅极与漏极之间均采用SiO2绝缘层隔离,MOSFET因此又被称为绝缘栅型场效应管。</p><p>市面上大家所说的功率场效应晶体管通常指绝缘栅MOS型(Metal Oxide Semiconductor FET),简称功率MOSFET(Power MOSFET)。实际上场效应管分为结型和绝缘栅两种不同的结构。场效应管是利用输入回路的电场效应来控制输出回路电流的一种半导体器件。它仅靠半导体中的多数载流子导电,又称为单极型晶体管。结型功率场效应晶体管一般称作静电感应晶体管(Static Induction Transistor-SIT)。其特点是用栅极电压来控制漏极电流,驱动电路简单,需要的驱动功率小,开关速度快,工作频率高,热稳定性优于GTR,但其电流容量小,耐压低,一般只适用于功率不超过10kW的电力电子装置。MOSFET功率场效应晶体管,大多数用作开关和驱动器,工作于开关状态,耐压从几十伏到上千伏,工作电流可达几安培到几十安。功率MOSFET基本上都是增强型MOSFET,它具有优良的开关特性。</p><h2 id="mosfet的分类">MOSFET的分类</h2><p>MOSFET的种类:</p><ul><li><p>按导电沟道类型可分为P沟道和N沟道。</p></li><li><p>按栅极电压幅值可分为:</p><ul><li>耗尽型-当栅极电压为零时漏源极之间就存在导电沟道;</li><li>增强型-对于N(P)沟道器件,栅极电压大于(小于)零时才存在导电沟道,功率MOSFET主要是N沟道增强型。</li></ul></li></ul><p><img src="https://picx.zhimg.com/v2-320b991f202aa5888a8b929a1c87e30b_1440w.jpg" alt="N 沟道增强型MOSFET结构和电器符号"></p><p><img src="https://pic2.zhimg.com/v2-b96f1ff5f73a5f98930da1afdb056365_1440w.jpg" alt="N沟道耗尽型MOSFET结构和电器符号"></p><p><img src="https://pic3.zhimg.com/v2-c5633a5d7e5f915ec19724f7d6c9cd70_1440w.jpg" alt="P沟道增强型MOSFET结构和电器符号"></p><p><img src="https://picx.zhimg.com/v2-c653d4b84b983500c8523994b44eebd7_1440w.jpg" alt="P沟道耗尽型MOSFET结构和电器符号"></p><h2 id="mos管结构原理图解以n沟道增强型为例">MOS管结构原理图解(以N沟道增强型为例)</h2><p>N沟道增强型MOS管结构如图5所示。它以一块低掺杂的P型硅片为衬底,利用扩散工艺制作两个高掺杂的N+区,并引入两个电极分别为源极S(Source)和漏极D(Drain),半导体上制作一层<span class="math inline">\(SiO_2\)</span>绝缘层,再在<span class="math inline">\(SiO_2\)</span>上面制作一层金属铝Al,引出电极,作为栅极G(Gate)。通常将衬底与源极接在一起使用。这样,栅极和衬底各相当于一个极板,中间是绝缘层,形成电容。当栅-源电压变化时,将改变衬底靠近绝缘层处感应电荷的多少,从而控制漏极电流的大小。</p><p><img src="https://pic4.zhimg.com/v2-5c496686e686c810d9a799ec94bc00a5_1440w.jpg" alt="N沟道增强型MOSFET原理图"></p><h2 id="mos管工作原理详解n沟道增强型为例">MOS管工作原理详解(N沟道增强型为例)</h2><ul><li><p>当栅-源之间不加电压时即 <span class="math inline">\(V_{GS}=0\)</span> 时,源漏之间是<strong>两只背向的PN结</strong>。不管<span class="math inline">\(V_{DS}\)</span>极性如何,其中总有<strong>一个PN结反偏</strong>,所以<strong>不存在</strong>导电沟道。</p></li><li><p>当 <span class="math inline">\(\mathbf{U_{DS}=0且U_{GS}>0}\)</span> 时,由于<span class="math inline">\(SiO_2\)</span>的存在,栅极<strong>电流为零</strong>。但是栅极金属层将<strong>聚集正电荷</strong>.它们<strong>排斥</strong>P型衬底靠近 <span class="math inline">\(SiO_2\)</span>一侧的<strong>空穴</strong>,使之剩下不能移动的<strong>负离子区</strong>,形成<strong>耗尽层</strong>,如图6所示 <img src="https://pic3.zhimg.com/v2-abfc4f6fb1706fc07dc71594492ffa64_1440w.jpg" alt="N沟道增强型MOSFET原理图"></p></li><li><p>当<strong>UGS增大</strong>时,一方面<strong>耗尽层增宽</strong>,另一方面将衬底的<strong>自由电子</strong>吸引到<strong>耗尽层与绝缘层之间</strong>,形成一个<strong>N型薄层</strong>,称为<strong>反型层</strong>,如图7所示。这个反型层就构成了漏-源之间的<strong>导电沟道</strong>。使沟道刚刚形成的栅-源电压称为<strong>开启电压UGS(th)/VT</strong>。<strong>UGS电压越大</strong>,形成的<strong>反层型越厚</strong>,导电沟道<strong>电阻越小</strong>。</p></li></ul><p><img src="https://pica.zhimg.com/v2-17869cb55a7d7d504cbe0a29d3e748ba_1440w.jpg" alt="N沟道增强型MOSFET原理图"></p><ul><li>当<strong>VGS>VT且VDS较小</strong>时,基本MOS结构的示意图如图8-1所示。图中反型沟道层的厚度定性地表明了<strong>相对电荷密度</strong>,这时的相对电荷密度在沟道长度方向上为一<strong>常数</strong>。相应的ID-VDS特性曲线如图8-1所示。</li></ul><p><img src="https://pic4.zhimg.com/v2-004a221cac433f1dd188ee767ad5f199_1440w.jpg" alt="N沟道增强型MOSFET原理图"></p><ul><li>当<strong>VGS>VT且VDS增大</strong>时,由于<strong>漏电压增大</strong>,<strong>漏端附近的氧化层压降减小</strong>,这意味着漏端附近的<strong>反型层电荷密度</strong>也将<strong>减小</strong>。漏端的<strong>沟道电导减小</strong>,从而<span class="math inline">\(I_D-V_{DS}\)</span>特性曲线的<strong>斜率减小</strong>,如图8-2所示。</li></ul><p><img src="https://pic4.zhimg.com/v2-1ecd64aaf75541a338f9236f0390941d_1440w.jpg" alt="N沟道耗尽型MOSFET原理图"></p><ul><li>当<span class="math inline">\(\mathbf V_{GS}>V_T且V_{DS}\)</span>增大<strong>到漏端的</strong> 氧化层压降等于<span class="math inline">\(V_T\)</span> 时,<strong>漏极</strong>处的反型层<strong>电荷密度为零</strong>,此时漏极处的<strong>电导为零</strong>,这意味着<span class="math inline">\(\mathbf I_D-V_{DS}\)</span>的特性曲线的<strong>斜率为零</strong>,称为<strong>预夹断</strong>,如图8-3所示。</li></ul><p><img src="https://pic4.zhimg.com/v2-2ac3ab4b9c6e9404afca7079b75aca37_1440w.jpg" alt="N沟道增强型MOSFET原理图"></p><ul><li>当<strong>VGS>VT且VDS>VDS(sat)</strong>时,沟道中反型电荷为零的点移向源端。如果UDS继续<strong>增大</strong>,夹断区随之<strong>延长</strong>,如图所示,而且<strong>UDS的增大</strong>部分几乎全部用于<strong>克服</strong>夹断区对<strong>漏极电流的阻力</strong>,漏电流<strong>ID为一常数</strong>,这种情形在ID-VDS对应于<strong>饱和区(恒流区)</strong>,如图8-4所示。</li></ul><p><img src="https://pic1.zhimg.com/v2-beb0479a664bfb53872f48488cea9488_1440w.jpg" alt="N沟道增强型MOSFET原理图"></p><h2 id="mosfet的特性曲线">MOSFET的特性曲线</h2><p>漏极电流ID和栅源间电压UGS的关系称为MOSFET的转移特性。<span class="math inline">\(I_D\)</span>较大时,<span class="math inline">\(I_D\)</span>与<span class="math inline">\(U_{GS}\)</span>的关系近似线性,曲线的斜率定义为跨导Gfs。图中随着<span class="math inline">\(V_{GS}\)</span>增大,<span class="math inline">\(I_D\)</span>的斜率增大。原因是由于<span class="math inline">\(V_{GS}\)</span>增大,形成的反层型越厚,导通沟道电阻越小,ID的增长速度越快。MOSFET有三个工作区域:截止区、饱和区和非饱和区,对应的输出特性曲线如图10所示。若电力 MOSFET工作在开关状态,即在截止区和非饱和区之间来回转换。</p><p><img src="https://picx.zhimg.com/v2-a6ee12eb3b12939e8abfbcd2a6956b8b_1440w.jpg" alt="N沟道增强型MOSFET Id-Vss 转移特性曲线"></p><p><img src="https://pic2.zhimg.com/v2-1d55b77b5ced5306520bae023c0fec65_1440w.jpg" alt="N沟道增强型MOSFET Id-V_DS 输出特性曲线"></p>]]></content>
<categories>
<category>技术笔记</category>
</categories>
<tags>
<tag>单片机</tag>
<tag>嵌入式</tag>
</tags>
</entry>
<entry>
<title>Hexo个人博客系统安装配置和添加文档</title>
<link href="/blogs/2024/08/30/Hexo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E5%92%8C%E6%B7%BB%E5%8A%A0%E6%96%87%E6%A1%A3/"/>
<url>/blogs/2024/08/30/Hexo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E5%92%8C%E6%B7%BB%E5%8A%A0%E6%96%87%E6%A1%A3/</url>
<content type="html"><![CDATA[<h2 id="什么是hexo">什么是Hexo?</h2><p>Hexo 是一个快速、简洁且高效的博客框架。 Hexo 使用 Markdown(或其他标记语言)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。</p><h2 id="安装">安装</h2><h3 id="安装-git">安装 Git</h3><ul><li>Windows:下载并安装 git。</li><li>Mac:使用 Homebrew, MacPorts 或者下载 安装程序。</li><li>Linux (Ubuntu, Debian):sudo apt-get install git-core</li><li>Linux (Fedora, Red Hat, CentOS):sudo yum install git-core Linux(Fedora、Red Hat、CentOS):sudo yum install git-core</li></ul><blockquote><p>Mac 用户</p>如果在编译时可能会遇到问题。 请先到 App Store 安装 Xcode。 Xcode 完成后,启动并进入 Preferences -> Download -> Command Line Tools -> Install 安装命令行工具。</blockquote><h3 id="安装-node.js">安装 Node.js</h3><p>Node.js 为大多数平台提供了官方的 安装程序。</p><p>其它的安装方法:</p><ul><li>Windows:通过 nvs(推荐)或者 nvm 安装.</li><li>Mac:使用 Homebrew 或 MacPorts 安装。</li><li>Linux(DEB/RPM-based):从 NodeSource 安装。</li><li>其它:使用相应的软件包管理器进行安装。 可以参考由 Node.js 提供的 指导。</li><li>对于 Mac 和 Linux 同样建议使用 nvs 或者 nvm,以避免可能会出现的权限问题。</li></ul><blockquote><p>Windows</p>使用 Node.js 官方安装程序时,请确保勾选 Add to PATH 选项(默认已勾选)</blockquote><blockquote><p>Mac / Linux</p>如果在尝试安装 Hexo 的过程中出现 EACCES 权限错误,请遵循 由 npmjs 发布的指导 修复该问题。</blockquote><blockquote><p>Linux</p>如果您使用 Snap 来安装 Node.js,在 初始化 博客时您可能需要手动在目标文件夹中执行 npm install。</blockquote><h3 id="安装-hexo">安装 Hexo</h3><p>所有必备的应用程序安装完成后,即可使用 npm 安装 Hexo。 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ npm install -g hexo-cli<br></code></pre></td></tr></table></figure> 进阶安装和使用 对于熟悉 npm 的进阶用户,可以仅局部安装 hexo 包。 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ npm install hexo<br></code></pre></td></tr></table></figure> 安装以后,可以使用以下两种方式执行 Hexo:</p><ol type="1"><li><p>npx hexo <command></p></li><li><p>Linux 用户可以将 Hexo 所在的目录下的 node_modules 添加到环境变量之中即可直接使用 hexo <command>: <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">'PATH="$PATH:./node_modules/.bin"'</span> >> ~/.profile<br></code></pre></td></tr></table></figure> 安装 Hexo 只需几分钟时间,若您在安装过程中遇到问题或无法找到解决方式,请 提交问题,我们会尽力解决您的问题。</p></li></ol><h2 id="quick-start">Quick Start</h2><h3 id="create-a-new-post">Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo new <span class="hljs-string">"My New Post"</span><br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="run-server">Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo server<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="generate-static-files">Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo generate<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="deploy-to-remote-sites">Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo deploy<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p><h3 id="修改主题">修改主题</h3><p>安装flexid主题</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ npm install --save hexo-theme-fluid <br></code></pre></td></tr></table></figure><p>然后在博客目录下创建 _config.fluid.yml,将主题的 <a href="https://github.com/fluid-dev/hexo-theme-fluid/blob/master/_config.yml">_config.yml</a>内容复制过去。</p><h3 id="指定主题">指定主题</h3><p>如下修改 Hexo 博客目录中的 _config.yml:</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs yml"><span class="hljs-attr">theme:</span> <span class="hljs-string">fluid</span> <span class="hljs-comment"># 指定主题</span><br><span class="hljs-attr">language:</span> <span class="hljs-string">zh-CN</span> <span class="hljs-comment"># 指定语言,会影响主题显示的语言,按需修改</span><br></code></pre></td></tr></table></figure><h3 id="发布文章">发布文章</h3><p>进入博客所在目录,右键打开 Git Bash Here,创建博文:</p><p>hexo new "My New Post" 然后 source 文件夹中会出现一个 My New Post.md 文件,就可以使用 Markdown 编辑器在该文件中撰写文章了。</p><p>写完后运行下面代码将文章渲染并部署到 GitHub Pages 上完成发布。以后每次发布文章都是这两条命令。</p><p>hexo g # 生成页面 hexo d # 部署发布</p><h3 id="hexo-常用命令">hexo 常用命令</h3><figure class="highlight axapta"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs axapta">hexo <span class="hljs-keyword">new</span> <span class="hljs-string">"name"</span> <span class="hljs-meta"># 新建文章</span><br>hexo <span class="hljs-keyword">new</span> page <span class="hljs-string">"name"</span> <span class="hljs-meta"># 新建页面</span><br>hexo g <span class="hljs-meta"># 生成页面</span><br>hexo d <span class="hljs-meta"># 部署</span><br>hexo g -d <span class="hljs-meta"># 生成页面并部署</span><br>hexo s <span class="hljs-meta"># 本地预览</span><br>hexo clean <span class="hljs-meta"># 清除缓存和已生成的静态文件</span><br>hexo help <span class="hljs-meta"># 帮助</span><br></code></pre></td></tr></table></figure><h3 id="常见问题">常见问题</h3><ol type="1"><li>Hexo 设置显示文章摘要,首页不显示全文</li></ol><p>Hexo 主页文章列表默认会显示文章全文,浏览时很不方便,可以在文章中插入 <span id="more"></span> 进行分段。</p><p>该代码前面的内容会作为摘要显示,而后面的内容会替换为 “Read More” 隐藏起来。 2. 设置网站图标</p><p>进入 themes/主题 文件夹,打开 _config.yml 配置文件,找到 favicon 修改,一般格式为:favicon: 图标地址。(不同主题可能略有差别)</p><ol start="3" type="1"><li>修改并部署后没有效果</li></ol><p>使用 hexo clean 清理后重新部署。</p><ol start="4" type="1"><li>开启 HTTPS 后访问网站显示连接不安全?</li></ol><p>证书还未部署生效,等待一会儿,清除浏览器缓存再试。</p>]]></content>
<tags>
<tag>hexo教程</tag>
</tags>
</entry>
</search>