泡泡马大冒险 發表於 2022-3-13 16:49:00

20192423杨斯凌 2021-2022-2 《汇编语言程序设计》前四章学习报告

<h1 id="20192423杨斯凌-2021-2022-2-汇编语言程序设计前四章学习报告" data-source-line="1"><span style="font-family: 仿宋">20192423杨斯凌 2021-2022-2 《汇编语言程序设计》前四章学习报告</span></h1>
<h2 id="第一章" data-source-line="4"><span style="font-family: 仿宋"><strong>第一章</strong></span></h2>
<hr>
<h3 id="汇编语言" data-source-line="7"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">汇编语言</span></h3>
<ul data-source-line="8">
<li><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)">汇编指令</span>是符号化的机器指令,它与机器指令一一对应——使用助记符(如MOV、ADD)表示相应的操作,使用地址或符号名(如AX)表示操作数。</span></li>
<li><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)">汇编语言</span>是汇编指令集(含伪指令集)和使用它们规则的统称。</span></li>
<li><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)">伪指令</span>是在程序设计时所需要的说明性指示语句,便于组织程序结构,无对应的机器指令</span></li>
<li><span style="font-family: 仿宋">本质上说:汇编指令就是符号化的机器指令,汇编语言就是符号化的机器语言。</span></li>
</ul>
<h3 id="数制" data-source-line="12"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">数制</span></h3>
<table data-source-line="14">
<thead>
<tr><th><span style="font-family: 仿宋">数制</span></th><th><span style="font-family: 仿宋">进位规则</span></th><th><span style="font-family: 仿宋">基数</span></th><th><span style="font-family: 仿宋">权值</span></th><th><span style="font-family: 仿宋">举例</span></th></tr>
</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">十进制</span></td>
<td><span style="font-family: 仿宋">0~9</span></td>
<td><span style="font-family: 仿宋">逢10进1</span></td>
<td><span style="font-family: 仿宋">10</span></td>
<td><span style="font-family: 仿宋">10^k</span></td>
</tr>
<tr>
<td><span style="font-family: 仿宋">二进制</span></td>
<td><span style="font-family: 仿宋">0,1</span></td>
<td><span style="font-family: 仿宋">逢2进1</span></td>
<td><span style="font-family: 仿宋">2</span></td>
<td><span style="font-family: 仿宋">2^k</span></td>
</tr>
<tr>
<td><span style="font-family: 仿宋">十六进制</span></td>
<td><span style="font-family: 仿宋">0~9,A~F</span></td>
<td><span style="font-family: 仿宋">逢16进1</span></td>
<td><span style="font-family: 仿宋">16</span></td>
<td><span style="font-family: 仿宋">16^k</span></td>
</tr>
<tr>
<td><span style="font-family: 仿宋">八进制</span></td>
<td><span style="font-family: 仿宋">0~7</span></td>
<td><span style="font-family: 仿宋">逢8进1</span></td>
<td><span style="font-family: 仿宋">8</span></td>
<td><span style="font-family: 仿宋">8^k</span></td>
</tr>
</tbody>
</table>
<h3 id="数制转换" data-source-line="21"><span style="font-family: 仿宋">数制转换</span></h3>
<p data-source-line="22"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">十进制→二进制</span></p>
<ul data-source-line="23">
<li><span style="font-family: 仿宋">降幂法</span></li>
</ul>
<ol data-source-line="24">
<li><span style="font-family: 仿宋">写出要转换的十进制数</span></li>
<li><span style="font-family: 仿宋">写出小于此数的各位权值,直到1为止(包括1)</span></li>
<li><span style="font-family: 仿宋">用要转换的数减去与之最接近的权值,如果够减则在相应位置记下1,否则计0;同时记录差数,差数成为下一轮要转换的数;直到权值为1的位置处有值为止</span></li>
<li><span style="font-family: 仿宋">从左到右依次写出各位,即为相应的二进制数</span></li>
</ol>
<ul data-source-line="29">
<li><span style="font-family: 仿宋">除法</span></li>
</ul>
<ol data-source-line="30">
<li><span style="font-family: 仿宋">整数</span><br><span style="font-family: 仿宋">将要转换的十进制数的整数不断除以2,直到商0为止,记下各次的余数(包括商0的那次)</span><br><span style="font-family: 仿宋">将第一个余数至最后一个余数从右向左排列写出即为相应的二进制数</span></li>
<li><span style="font-family: 仿宋">小数</span><br><span style="font-family: 仿宋">将要转换的小数部分不断乘以2,直到结果的小数部分为0或给定的精度为止,记下各次积的整数部分(包括0的那次)</span><br><span style="font-family: 仿宋">将第一个整数部分值至最后一个整数部分值从左向右排列写出即为相应的二进制数</span></li>

</ol>
<p data-source-line="37"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">二进制→十进制</span></p>
<ul data-source-line="38">
<li><span style="font-family: 仿宋">按权展开求和——一个二进制数的各位二进制数码乘以与其对应的权值之和</span></li>

</ul>
<p data-source-line="40"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">十进制→十六进制</span></p>
<ul data-source-line="41">
<li><span style="font-family: 仿宋">降幂法</span></li>
<li><span style="font-family: 仿宋">除法</span></li>

</ul>
<p data-source-line="44"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">二进制→十六进制</span></p>
<ul data-source-line="45">
<li><span style="font-family: 仿宋">从最低位(右起)开始每四位直接转换为一位十六进制数值</span></li>

</ul>
<p data-source-line="47"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">十六进制→二进制</span></p>
<ul data-source-line="48">
<li><span style="font-family: 仿宋">从最低位(右起)开始每位直接展开为四位二进制数值</span></li>

</ul>
<hr>
<h3 id="带符号数的表示" data-source-line="52"><span style="font-family: 仿宋">带符号数的表示</span></h3>
<ul data-source-line="53">
<li><span style="font-family: 仿宋">用最高位作为符号位,0代表“+”,1代表“-”,其余位用作数值位,代表数值。</span></li>

</ul>
<hr>
<h3 id="补码" data-source-line="57"><span style="font-family: 仿宋">补码</span></h3>
<ul data-source-line="58">
<li>
<p><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)">基本规则</span>——将一个数化为n位二进制形式后,最高位用于表示符号,0表示正数,1表示负数。</span><br><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)">正数</span>:与原码相同,最高位为0,其余位为相应二进制值</span><br><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)">负数</span>:</span><br><span style="font-family: 仿宋">方法1:2n-该数的绝对值的二进制形式</span><br><span style="font-family: 仿宋">方法2:该数绝对值的各位取反后末位加1</span></p>

</li>
<li>
<p><span style="font-family: 仿宋">补码的数值范围为[- 2n-1,2n-1-1]</span><br><span style="font-family: 仿宋">8位二进制补码表示的数值范围是-128~127</span><br><span style="font-family: 仿宋">16位二进制补码表示的数值范围是-32768~32767</span></p>

</li>
<li>
<p><span style="font-family: 仿宋">加法规则 :补 = 补 + 补</span><br><span style="font-family: 仿宋">减法规则 :补 = 补 + [-Y]补</span></p>

</li>

</ul>
<p data-source-line="71"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">真值→补码</span><br><span style="font-family: 仿宋">正数:相应的二进制形式</span><br><span style="font-family: 仿宋">负数:绝对值相应的二进制形式各位求反末位加1</span></p>
<p data-source-line="75"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">补码→真值</span><br><span style="font-family: 仿宋">二进制形式最高位为0:二进制对应的值即为真值</span><br><span style="font-family: 仿宋">二进制形式最高位为1:各位求反末位加1得到真值绝对值的二进制形式,在该值前面添加负号即为真值</span></p>
<hr>
<h3 id="字符表示" data-source-line="81"><span style="font-family: 仿宋">字符表示</span></h3>
<ul data-source-line="82">
<li><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)">字符</span>:字母、数字及专门符号</span><br><span style="font-family: 仿宋">ASCII (American Standard Code for Information Interchange)码,即美国信息交换标准代码:用一个字节来表示一个字符,低7位为字符的ASCII值。</span></li>
<li><span style="font-family: 仿宋">常用的ASCII码</span><br><span style="font-family: 仿宋">‘A ’ ~ ‘Z ’ : 41H~5AH</span><br><span style="font-family: 仿宋">‘a’ ~ ‘z’ : 61H~7A H</span><br><span style="font-family: 仿宋">‘0’ ~‘9’ : 30H~39H</span><br><span style="font-family: 仿宋">换行 0AH</span><br><span style="font-family: 仿宋">回车 0DH</span><br><span style="font-family: 仿宋">空格 20H</span></li>

</ul>
<hr>
<h3 id="逻辑运算" data-source-line="94"><span style="font-family: 仿宋">逻辑运算</span></h3>
<h4 id="与运算and" data-source-line="95"><span style="font-family: 仿宋">与运算(AND)</span></h4>
<table data-source-line="97">
<thead>
<tr><th><span style="font-family: 仿宋">A</span></th><th><span style="font-family: 仿宋">B</span></th><th><span style="font-family: 仿宋">A AND B</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>

</tbody>

</table>
<h4 id="或运算or" data-source-line="103"><span style="font-family: 仿宋">或运算(OR)</span></h4>
<table data-source-line="105">
<thead>
<tr><th><span style="font-family: 仿宋">A</span></th><th><span style="font-family: 仿宋">B</span></th><th><span style="font-family: 仿宋">A OR B</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>

</tbody>

</table>
<h4 id="非运算not" data-source-line="111"><span style="font-family: 仿宋">非运算(NOT)</span></h4>
<table data-source-line="113">
<thead>
<tr><th><span style="font-family: 仿宋">A</span></th><th><span style="font-family: 仿宋">NOT A</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>

</tbody>

</table>
<h4 id="异或运算xor" data-source-line="117"><span style="font-family: 仿宋">异或运算(XOR)</span></h4>
<table data-source-line="119">
<thead>
<tr><th><span style="font-family: 仿宋">A</span></th><th><span style="font-family: 仿宋">B</span></th><th><span style="font-family: 仿宋">A XOR B</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>

</tbody>

</table>
<hr>
<h2 id="第二章" data-source-line="127"><span style="font-family: 仿宋">第二章</span></h2>
<h3 id="ibm-pc微机基本结构" data-source-line="129"><span style="font-family: 仿宋">IBM-PC微机基本结构</span></h3>
<hr>
<p data-source-line="133"><span style="font-family: 仿宋">一. 微机的一般构成</span></p>
<ul data-source-line="134">
<li>
<p><span style="font-family: 仿宋">计算机一般应包括五大部件:</span></p>
<pre><span style="font-family: 仿宋"><code>运算器、控制器、存储器、输入设备和输出设备。
将运算器和控制器两大部件集成在一个集成电路芯片上,称为中央处理器 ,简称CPU,也叫微处理器.
</code></span></pre>
</li>
</ul>
<p data-source-line="139"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 中央处理器CPU</strong></span></p>
<pre><span style="font-family: 仿宋"><code>微型计算机中的中央处理器也叫微处理器。它包括运算器和控制器。
</code></span></pre>
<p data-source-line="142"><span style="font-family: 仿宋">功能:</span><br><span style="font-family: 仿宋">分析从主存储器取来的各条指令的功能,控制计算机各部件完成指定功能的各项操作。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 主存储器</strong></span></p>
<pre><span style="font-family: 仿宋"><code>- 主存储器是用来存放程序和数据的部件。它由若干个存储单元构成。
- 存储单元的多少表示存储器的容量。每个存储单元使用一个唯一的编号来标识,称为存储单元的地址。
- 对每个存储单元内容的存和取是按照地址进行访问的。
- 计算机存储信息的最小单位是二进制位bit,一位可存储一个二进制数0或1。每8位组成一个字节(BYTE)。
- 在大多数计算机中,存储器的组织都是以字节为基本单位。每一个基本单位称为一个存储单元。
</code></span></pre>
<p data-source-line="151"><span style="font-family: 仿宋">在计算机中,除了主存储器之外,一般还配置有辅助存储器,简称辅存。由于它的位置是在主机之外,因此也叫做外存。</span></p>
<p data-source-line="153"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 输入输出设备及接口</strong></span></p>
<pre><span style="font-family: 仿宋"><code>-输入设备将外部信息(程序、数据和命令)送入计算机。包括键盘、鼠标等。
-输出设备将计算机处理后的结果转换为人或其它系统能识别的信息形式向外输出。如显示器、打印机等。
-有的设备既具有输入功能又具有输出功能。如磁盘、磁带、触摸显示屏等。
</code></span></pre>
<p data-source-line="158"><span style="font-family: 仿宋">I/O接口是主机与I/O设备之间设置的逻辑控制部件。通过它实现主机与I/O设备间的信息传送。</span></p>
<p data-source-line="160"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4. 系统总线</strong></span></p>
<pre><span style="font-family: 仿宋"><code>-系统总线将CPU、存储器和I/O设备连接起来,实现各大部件之间的各种信息传送。
-系统总线包括地址总线、数据总线和控制总线三组。它们分别用于传送不同的信息。
</code></span></pre>
<hr>
<h3 id="intel-80868088-cpu的功能结构" data-source-line="167"><span style="font-family: 仿宋">Intel 8086/8088 CPU的功能结构</span></h3>
<p data-source-line="168"><span style="font-family: 仿宋">CPU执行指令序列就是重复执行以下两个步骤:</span></p>
<ul data-source-line="169">
<li><span style="font-family: 仿宋">从存储器中取指令</span></li>
<li><span style="font-family: 仿宋">执行指令规定的操作</span></li>
</ul>
<p data-source-line="172"><span style="font-family: 仿宋">这两个步骤的执行又分为串行方式和指令流水线方式。</span></p>
<ol data-source-line="173">
<li>
<p><span style="font-family: 仿宋">串行方式</span><br><span style="font-family: 仿宋">(1)当CPU在指令执行阶段,不需要占用系统总线,但此时总线也不工作,因此系统总线的空闲时间比较多 。</span><br><span style="font-family: 仿宋">(2)在从存储器取指令、取数据或存数据时,总线处于忙状态,其所占用的时间也较长。而CPU却只需要花很短的时间去处理,因此大部分时间处于闲置状态。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">采用串行工作方式的计算机其运行速度较慢</span></p>

</li>
<li>
<p><span style="font-family: 仿宋">指令流水线方式</span><br><span style="font-family: 仿宋">采用指令流水线工作方式的计算机具有较高的工作效率。CPU内部采用了一种先进的指令流水线结构,这种结构可以有效而充分地利用各主要硬件资源。</span><br><span style="font-family: 仿宋">要实现指令流水线方式,从CPU组成结构上要划分成多个单元。8086/8088CPU被划分成两个单元。</span></p>

</li>

</ol>
<p data-source-line="182"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 执行单元EU</strong></span><br><span style="font-family: 仿宋">EU的主要任务是分析与执行指令,具体包括:</span></p>
<pre><span style="font-family: 仿宋"><code>A、从指令队列中取出指令代码,由控制器译码后产生 相应的控制信号,控制各部件完成指令规足的操作。
B、对操作数执行各种指定的算术或逻辑运算。
C、向总线接口单元BIU发送访问主存或I/O的命令,并 提供相应的地址和传送的数据。
</code></span></pre>
<p data-source-line="188"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 总线接口单元BIU</strong></span><br><span style="font-family: 仿宋">BIU负责CPU与存储器、I/O的信息传送。具体包括:</span></p>
<pre><span style="font-family: 仿宋"><code>A、取指令——根据CS寄存器和指令指针IP形成20位的物 理地址,从相应的存储器单元中取出指令,暂存到指令队 列中,等待EU取走并执行。
B、存取数据——在EU执行指令的过程中,需要与存储器 或I/O端口传送数据时,由EU提供的数据和地址,结合段 寄存器,通过系统总线与存储器或I/O进行数据的存取。
</code></span></pre>
<p data-source-line="193"><span style="font-family: 仿宋">EU和BIU是既分工又合作的两个独立部分。它们的操 作在一定程度上是并行工作的,分别完成不同的任务,从 而大大加快了指令执行速度。</span></p>
<hr>
<h3 id="intel-80868088cpu寄存器结构及其用途" data-source-line="197"><span style="font-family: 仿宋">Intel 8086/8088CPU寄存器结构及其用途</span></h3>
<h4 id="一-通用寄存器" data-source-line="199"><span style="font-family: 仿宋">一、通用寄存器</span></h4>
<p data-source-line="200"><span style="font-family: 仿宋">Intel 8086/8088有8个16位通用寄存器,它们具有良好 的通用性,并且还可以用作某个特定的功能,可以由程序 设计人员进行编程访问。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 数据寄存器</strong></span></p>
<pre><span style="font-family: 仿宋"><code>它包括AX、BX、CX和DX四个寄存器。它们中的每一 个既可以是16位寄存器,也可以分成两个8位寄存器使用。 即可以当作8个独立的8位寄存器使用。
数据寄存器既可以用来存放参加运算的操作数,也可以 存放运算的结果。在多数情况下,使用这些寄存器时必须在 指令中明确指示。
</code></span></pre>
<p data-source-line="205"><span style="font-family: 仿宋">在有些指令中,不需要明确指出使用的寄存器名,即 隐念使用了某寄存器,称为隐含使用。</span><br><span style="font-family: 仿宋">个别指令对寄存器有特定的使用,并且又必须在指令中 指明它的名字,这类寄存器的使用称为特定使用。</span></p>
<p data-source-line="208"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 指针寄存器</strong></span></p>
<p data-source-line="210"><span style="font-family: 仿宋">指针寄存器有堆栈指针SP和基址指针BP</span><br><span style="font-family: 仿宋">它们一般被用来存放16位地址,在形成20位的物理地 址时常被作为偏移量使用。</span></p>
<pre><span style="font-family: 仿宋"><code>SP指针——在进行堆栈操作时,被隐含使用,被用来指向 堆栈顶部单元。
BP指针——被用来指向堆栈段内某一存储单元。BP除用作 地址指针外也可以象数据寄存器一样,存放参加运算的操 作数和运算的结果。
</code></span></pre>
<p data-source-line="215"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 变址寄存器</strong></span><br><span style="font-family: 仿宋">有两个16位的变址寄存器SI和DL 一般被用来作地址指针。</span></p>
<pre><span style="font-family: 仿宋"><code>SI——源变址寄存器       
DI—— 目的变址寄存器
</code></span></pre>
<p data-source-line="220"><span style="font-family: 仿宋">同BP寄存器一样,SI和DI也可以用作通用数据寄存器存放操作数和运算结果。</span></p>
<h4 id="二-段寄存器" data-source-line="221"><span style="font-family: 仿宋">二、段寄存器</span></h4>
<p data-source-line="222"><span style="font-family: 仿宋">8086/8088CPU在使用存储器时,将它划分成若干个段。每个段用来存放不同目的内容。每个存储段用一个段寄存器来指明该段的起始位置(也叫 段基址)。</span><br><span style="font-family: 仿宋">CPU在访问存储器时必须指明两个内容:</span></p>
<pre><span style="font-family: 仿宋"><code>(1)所访问的存储单元属于哪个段,即指明使用的段 寄存器。
(2)该存储单元与段起始地址(段基址)相距多少, 即偏移量。
</code></span></pre>
<p data-source-line="227"><span style="font-family: 仿宋">在程序设计中,一个程序将存储器划分成多少个存 储段是任意的。但在程序运行的任何时刻最多只有4个 段,分别由CS、DS、ES和SS指定。</span></p>
<h4 id="三-指令指针ip" data-source-line="229"><span style="font-family: 仿宋">三、指令指针IP</span></h4>
<pre><span style="font-family: 仿宋"><code>CPU在从存储器取指令时,以段寄存器CS作为代码段的 基址指针,以IP的内容作为偏移量,共同形成一条指令 的存放地址。
当CPU从内存中取岀一条指令后,IP内容自动修改为指 向下一条指令。
</code></span></pre>
<p data-source-line="234"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">注意:IP的内容不能被直接访问,既不能用指令去读IP 的值,也不能用指令给它赋值。但是可以通过某些指令的 执行而自动修改IP的内容。</span></p>
<ul data-source-line="235">
<li>
<p><span style="font-family: 仿宋">下面两种指令可以自动改变IP寄存器的内容。</span></p>
<pre><span style="font-family: 仿宋"><code>转移指令将指令中的目的地址的偏移量送入IP
子程序调用指令CALL,将IP原有内容自动压入堆栈, 而将子程序的入口地址偏移量自动送入IP,而返回指令 RET,又自动从堆栈中弹回原有IP的内容。
</code></span></pre>
</li>
</ul>
<h4 id="四-标志寄存器" data-source-line="239"><span style="font-family: 仿宋">四、标志寄存器</span></h4>
<p data-source-line="240"><span style="font-family: 仿宋">标志寄存器是用来反映CPU在程序运行时的某些状态, 如是否有进位、奇偶性、结果的符号、结果是否为零等等。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 进位标志位CF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>在进行算术运算时,若最高位(对字操作是第15位,字节操作是第7位)产生进位或借位时CF被自动置“1”,否则置“0”
在移位类指令中,CF也被用来存放从最高位(左移时)或最 低位(右移时)移岀的数值(0或1) o
</code></span></pre>
<p data-source-line="245"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 奇偶标志位PF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>当指令操作结果的低8位中含有1的个数为偶数时,贝IJPF 被置1,否则PF被置0。
</code></span></pre>
<p data-source-line="248"><span style="font-family: 仿宋">注意:PF只反映操作结果的低8位的奇偶性,与指令操作数的长度无关。</span></p>
<p data-source-line="250"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 辅助进位标志位AF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>在进行算术运算时,若低字节的低四位向高4位产 生进位或借位,即第3位产生进位或借位时,AF位被置1, 否则置0。AF标志位用于十进制运算的调整。
</code></span></pre>
<p data-source-line="253"><span style="font-family: 仿宋">注意:AF只反映运算结果低八位,与操作数长度无关。</span></p>
<p data-source-line="255"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4. 零值标志位ZF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>若运算结果各位全为0,贝IJZF被置1,否则置0。
</code></span></pre>
<p data-source-line="258"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>5. 符号标志位SF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>将运算结果视为带符号数,当运算结果为负数时SF 被置1,为正数时,则置0。
由于第7位是字节操作数的符号位,而第15位是字操 作数的符号位,因此,SF位与运算结果的最高位(第7 位或第15位)相同。
</code></span></pre>
<p data-source-line="262"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>6. 溢岀标志位OF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>当运算结果超过机器用补码所能表示数的范围时, 则OF置1,否则置0.
字节数据,机器用补码所能表示的数范围为-128〜+127。 字数据的表示范围为:-32768〜+32767
</code></span></pre>
<p data-source-line="266"><span style="font-family: 仿宋">注意:溢岀与进位是两个完全不同的概念,不能相互混淆。</span></p>
<p data-source-line="268"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>7. 单步标志位TF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>单步标志也叫跟踪位,该标志为控制标志位。单步标志 位供调试程序使用。
当TF位被设置为1时,每执行一条指令后,CPU暂停运 行,即产生单步中断。
</code></span></pre>
<p data-source-line="272"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>8. 中断允许标志位IF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>该标志位为控制标志位。当IF被设置为1时,CPU可以 响应可屏蔽中断,否则不允许响应可屏蔽中断。
</code></span></pre>
<p data-source-line="275"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>9. 方向标志位DF</strong></span></p>
<pre><span style="font-family: 仿宋"><code>DF也是控制标志位。它被用来规定串操作指令的增减 方向。
当DF=O时,串操作指令自动使变址寄存器(SI和DI) 的内容递増。当DF=1时,串操作指令自动使变址寄存器的 内容递减。
</code></span></pre>
<hr>
<h3 id="存储器组织结构" data-source-line="282"><span style="font-family: 仿宋">存储器组织结构</span></h3>
<h4 id="一-存储器的组成" data-source-line="283"><span style="font-family: 仿宋">一、存储器的组成</span></h4>
<pre><span style="font-family: 仿宋"><code>1. 存储器是由若干个存储单元构成存储单元的多少就表示了存储器的容量.
2. 每个存储单元存放相同长度的二进制数一个存储单元的长度一般为8位二进制数,即一个字节。
3. 每个存储单元有一个唯一的地址编号,简称地址。
4. 任何两个相邻字节单元就构成一个字单元
一个字存储单元(WORD)的长度为16位二进制数,即两个字节。字单元的地址为两个字节单元中较小地址字节单元的地址。16位长数据的存放规则是低8位放在较低地址字节单元中,高8位放在较高地址字节单元中。
5. 在定义一个地址时必须指岀是字节或字类型属性
</code></span></pre>
<h4 id="二-存储器的段结构" data-source-line="291"><span style="font-family: 仿宋">二、存储器的段结构</span></h4>
<p data-source-line="293"><span style="font-family: 仿宋">8086/8088系统的存储器段结构具有以下几个特点:</span></p>
<pre><span style="font-family: 仿宋"><code>1. 8086/8088CPU将1MB的存储空间划分成若干个段,每 个段最大长度为64K (65536)个字节单元组成。
2.每个段的基址(段基址)必须是一个小节的首址。
    段基址——一个段的起始地址。
    每个小节的首地址最低位必为0
3.逻辑段在物理存储器中可以是邻接的、间隔的、 部分重叠的和完全重叠的等4种情况。
4.在任一时刻,一个程序只能访问4个当前段中的内容。
    4个当前段分别是代码段、数据段、堆栈段和附加段。
</code></span></pre>
<h4 id="三-逻辑地址与物理地址及对应关系" data-source-line="302"><span style="font-family: 仿宋">三、逻辑地址与物理地址及对应关系</span></h4>
<p data-source-line="303"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 物理地址</strong></span><br><span style="font-family: 仿宋">在1MB的存储空间中,每个存储单元的物理地址是唯 一的,它就是该存储单元的20位地址。</span><br><span style="font-family: 仿宋">8086/8088的物理地址范围:<span style="background-color: rgba(255, 255, 0, 1)">00000H〜0FFFFFH</span></span></p>
<p data-source-line="307"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 逻辑地址</strong></span><br><span style="font-family: 仿宋">在程序设计中,为了便于程序的开发和对存储器进行动 态管理,使用了逻辑地址。</span><br><span style="font-family: 仿宋">逻辑地址包括两个部分:<span style="background-color: rgba(255, 255, 0, 1)">段基值和偏移量</span></span></p>
<pre><span style="font-family: 仿宋"><code>段基值:存放在某一个段寄存器中,是一个逻辑段的起始 单元地址(段基址)的高16位。
偏移量:表示某个存储单元与它所在段的段基址之间的字 节距离。
</code></span></pre>
<p data-source-line="314"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 逻辑地址转换为物理地址</strong></span><br><span style="font-family: 仿宋">当CPU要访问存储器时,需要由总线接口单元BIU将<span style="background-color: rgba(255, 255, 0, 1)">逻辑地址转换成物理地址</span>。</span></p>
<pre><span style="font-family: 仿宋"><code>转换方法:将逻辑地址的段基值左移4位,形成20位的段基址(低位为0)然后与16位的偏移量相加,结果即为20位的物理地址。
</code></span></pre>
<p data-source-line="319"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4.逻辑地址的来源</strong></span><br><span style="font-family: 仿宋">在程序的执行过程中,CPU根据不同操作类型访问存储器,其逻辑地址中段基值和偏移量的来源是不一样的。</span></p>
<hr>
<h3 id="堆栈及其操作方法" data-source-line="324"><span style="font-family: 仿宋">堆栈及其操作方法</span></h3>
<p data-source-line="325"><span style="font-family: 仿宋">堆栈是一个特定的存储区,访问该存储区一般需要按 照专门的规则进行操作。</span><br><span style="font-family: 仿宋">堆栈的用途:主要用于暂存数据以及在过程调用或处理 中断时保存断点信息。</span></p>
<h4 id="一-堆栈的构造" data-source-line="327"><span style="font-family: 仿宋">一、堆栈的构造</span></h4>
<p data-source-line="328"><span style="font-family: 仿宋">堆栈一般分为:<span style="background-color: rgba(255, 255, 0, 1)">专用堆栈存储器和软件堆栈</span></span></p>
<pre><span style="font-family: 仿宋"><code>专用堆栈存储器:按堆栈的工作方式专门设计的存储器
软件堆栈:由程序设计人员用软件在内存中划岀的一块存储区 作为堆栈来使用。8086/8088釆用这种方式。
</code></span></pre>
<p data-source-line="333"><span style="font-family: 仿宋">堆栈的一端是固定的,称为<span style="background-color: rgba(255, 255, 0, 1)">栈底</span>。栈底是堆栈存储区的最大地址单元。</span><br><span style="font-family: 仿宋">另一端是浮动的,称为<span style="background-color: rgba(255, 255, 0, 1)">栈顶</span>。在任何时刻,栈顶是最后存入 信息的存储单元。栈顶是随着堆栈中存放信息的多少而改变。</span><br><span style="font-family: 仿宋">为了指示现在堆栈中存放数据位置,通常设置一个寄存 器SP来指示栈顶位置。SP的内容始终指向栈顶单元,堆栈中数据进岀都由SP来控制</span><br><span style="font-family: 仿宋">在堆栈中存取数据的规则是:“<span style="background-color: rgba(255, 255, 0, 1)">先进后出FILO</span>”。</span></p>
<h4 id="二-80868088堆栈的组织" data-source-line="338"><span style="font-family: 仿宋">二、8086/8088堆栈的组织</span></h4>
<blockquote data-source-line="339">
<p><span style="font-family: 仿宋">在8086/8088微机中<strong>堆栈是由堆栈段寄存器SS指示的一段存储区。</strong></span><br><span style="font-family: 仿宋">顶由<strong>椎栈指针SP</strong>指示。</span><br><span style="font-family: 仿宋">当<strong>SP内容为最大(初始) 值时,表示堆栈为空。而当(SP) =0时,表示堆栈全满。</strong></span><br><span style="font-family: 仿宋">通过改变<strong>堆栈段寄存器SS</strong>的内容,即可改变到另一个 堆栈段,当改变了堆栈段寄存器SS的内容后,必须紧接着 赋予SP新值。</span></p>

</blockquote>
<h4 id="三-堆栈操作" data-source-line="344"><span style="font-family: 仿宋">三、堆栈操作</span></h4>
<p data-source-line="345"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 设置堆栈</strong></span></p>
<p data-source-line="347"><span style="font-family: 仿宋">设置堆栈主要是对堆栈段寄存器SS和堆栈指针SP赋值。</span></p>
<p data-source-line="349"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 进栈PUSH</strong></span></p>
<p data-source-line="351"><span style="font-family: 仿宋">进栈就是把数据存入堆栈。由指令PUSH或者由机器自动 实现,可以将通用寄存器、段寄存器或字存储单元的内容压 入堆栈顶部。</span></p>
<p data-source-line="353"><span style="font-family: 仿宋">进栈的执行过程:</span><br><span style="font-family: 仿宋">(1)首先将堆栈指针SP减2,即指向一个空的堆栈字单元</span></p>
<ul data-source-line="355">
<li><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">SP&lt;=(SP)-2</span></li>

</ul>
<p data-source-line="357"><span style="font-family: 仿宋">(2)将要储存的内容(寄存器或存储单元的内容)送入SP指向的字单元中。</span></p>
<ul data-source-line="358">
<li><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(SP) v=数据</span></li>

</ul>
<p data-source-line="360"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 岀栈POP</strong></span></p>
<p data-source-line="362"><span style="font-family: 仿宋">岀栈操作由POP指令或机器自动实现,它从堆栈顶 部弾出--个字到通用寄存器、段寄存器或字存储单元。</span></p>
<p data-source-line="364"><span style="font-family: 仿宋">岀栈的操作过程:</span><br><span style="font-family: 仿宋">(1)将SP指向的字单元(即栈顶字单元)内容送往指定 的寄存器或存储器。</span></p>
<ul data-source-line="366">
<li><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">寄存器/存储器v=((SP))</span></li>

</ul>
<p data-source-line="368"><span style="font-family: 仿宋">(2)堆栈指针SP内容加2,</span></p>
<ul data-source-line="369">
<li><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">SP&lt;= (SP) +2</span></li>

</ul>
<hr>
<h2 id="第三章-寻址方式与指令系统" data-source-line="374"><span style="font-family: 仿宋">第三章 寻址方式与指令系统</span></h2>
<h3 id="寻址方式" data-source-line="375"><span style="font-family: 仿宋">寻址方式</span></h3>
<p data-source-line="376"><span style="font-family: 仿宋">—条指令通常由两大部分构成:</span></p>
<p data-source-line="378"><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)"><strong>操作码</strong>:</span>表示该指令应完成的具体操作,如加法、减法、 乘法、移位等等。在汇编语言中使用一定的符号来表示,称 为助记符。如ADD、PUSH、POP、MOV等等。</span><br><span style="font-family: 仿宋"><span style="background-color: rgba(255, 255, 0, 1)"><strong>操作数</strong>:</span>表示该指令的操作对象。如移位操作的被移位数, 加法操作的加数等等。它可以是一个操作数,也可以是多个 操作数。这取决于操作码部分的具体需要。</span></p>
<p data-source-line="381"><span style="font-family: 仿宋"><strong>Intel 8086/8088各指令中提供操作数的方法有以下四种:</strong></span></p>
<pre><span style="font-family: 仿宋"><code>(1)        立即数操作数——操作数在指令代码中提供
(2)        寄存器操作数——操作数在CPU的通用寄存器或 段寄存器中
(3)        存储器操作数——操作数在内存的存储单元中
(4)        I/O端口操作数——操作数在输入/输出接口的寄 存器中
</code></span></pre>
<p data-source-line="388"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 立即数寻址</strong></span><br><span style="font-family: 仿宋">立即数寻址方式的指令中,所需操作数直接包含在指令 代码中,这种操作数称为立即数。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 寄存器寻址</strong></span><br><span style="font-family: 仿宋">寄存器寻址方式是指指令中所需的操作数在CPU的某个 寄存器中。寄存器可以是8位或16位通用寄存器,或者是段 寄存器。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 直接寻址</strong></span><br><span style="font-family: 仿宋">在直接寻址方式的指令中,操作数的有效地址EA只有 位移技地址分量。</span><br><span style="font-family: 仿宋">(1)用符号表示</span><br><span style="font-family: 仿宋">例:MOV BX, VAR =&gt;MOV BX, DS: VAR 它表示将数据段中,偏移了VAR个字节距离的字单元 内容送到寄存器BX中。</span><br><span style="font-family: 仿宋">(2)用常数表示</span><br><span style="font-family: 仿宋">例:MOV AX, DS: </span><br><span style="font-family: 仿宋">它表示从当前数据段开始,偏移100个字节的字单元内容 送到AX中。</span><br><span style="font-family: 仿宋">注意:用常数表示时,必须用方括号括起来。段寄存 器不能省略。</span></p>
<p data-source-line="401"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4. 寄存器间接寻址</strong></span></p>
<p data-source-line="403"><span style="font-family: 仿宋">操作数有效地址EA直接从基址寄存器(BX或BP)或 变址寄存器(SI或DI)中获得。</span></p>
<p data-source-line="405"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>5. 基址寻址和变址寻址</strong></span><br><span style="font-family: 仿宋">操作数的有效地址EA等于基地址分量或变址分量加上 指令中给出的位移量。</span><br><span style="font-family: 仿宋">指令中使用BX或BP时为基址寻址。指令中使用SI或DI时 为变址寻址。</span></p>
<p data-source-line="413"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>6. 基址变址寻址</strong></span><br><span style="font-family: 仿宋">操作数的有效地址是三个地址分量之和,即:</span></p>
<ul data-source-line="415">
<li><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">EA=基址+变址+位移量</span></li>

</ul>
<p data-source-line="418"><span style="font-family: 仿宋">当基址选用BX时隐含使用段寄存器DS,而选用BP时 则隐含使用段寄存器SS。</span></p>
<p data-source-line="422"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>7. 串操作寻址方式</strong></span></p>
<pre><span style="font-family: 仿宋"><code>在寻找源操作数时,隐含使用SI作为地址指针。
在寻找目的串时,隐含使用DI作为地址指针。
在串操作完成之后,自动对SI和DI进行修改,使它们指 向下一个操作数。
</code></span></pre>
<p data-source-line="428"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>8. I/O端口寻址</strong></span><br><span style="font-family: 仿宋">(1)存储器编址方法</span><br><span style="font-family: 仿宋">将I/O端口视为存储器的一个单元,对端口的访问就如 同访问存储单元一样。访问存储器的指令和各种寻址方式 同样适用对I/O端口的访问。</span><br><span style="font-family: 仿宋">特点:程序设计灵活,但需要占用存储地址空间。</span><br><span style="font-family: 仿宋">(2) I/O端口编址方法</span><br><span style="font-family: 仿宋">I/O端口的地址与存储器地址分开,并使用专门的输入指令和 输出指令。</span></p>
<ul data-source-line="434">
<li><span style="font-family: 仿宋">直接端口寻址</span><br><span style="font-family: 仿宋">在指令中直接给岀端口地址,端口地址一般采用2位十六进 制数,也可以用符号表示。</span></li>
<li><span style="font-family: 仿宋">寄存器间接端口寻址</span><br><span style="font-family: 仿宋">寄存器间接端口寻址:把I/O端口的地址先送到DX中,用 DX作间接寻址寄存器。</span><br><span style="font-family: 仿宋">如果访问的端口地址值大于255,则必须用I/O端口的间 接寻址方式。</span></li>

</ul>
<hr>
<h3 id="指令系统" data-source-line="442"><span style="font-family: 仿宋">指令系统</span></h3>
<h4 id="一-传送类指令" data-source-line="444"><span style="font-family: 仿宋">一、传送类指令</span></h4>
<p data-source-line="446"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 通用数据传送指令</strong></span><br><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">MOV DEST, SRC</span></span></p>
<p data-source-line="449"><span style="font-family: 仿宋">当指令执行完后,目的操作数原有的内容被源操作数内 容覆盖,即目的操作数和源操作数具有相同内容。</span></p>
<p data-source-line="451"><span style="font-family: 仿宋">MOV指令在使用时需注意以下几个问题:</span></p>
<pre><span style="font-family: 仿宋"><code>(1)立即数只能作源操作数,且它不能传送给段寄存器。
(2)段寄存器CS只能作源操作数,段寄存器之间不能直 接传送。
(3)存储单元之间不能直接传送数据
(4) MOV指令不影响标志位
</code></span></pre>
<p data-source-line="459"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2.交换指令</strong></span><br><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">XCHG DEST, SRC</span></span><br><span style="font-family: 仿宋">作用:源操作数和目的操作数两者内容相互交换。</span><br><span style="font-family: 仿宋">指令对标志寄存器各位无影响</span></p>
<pre><span style="font-family: 仿宋"><code>数据交换可以在寄存器之间或寄存器与存储器单元之 冋进行。但是不能在存储单元之间直接进行数据交换。寄 存器只能使用通用寄存器。
</code></span></pre>
<p data-source-line="466"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3.标志传送指令</strong></span><br><span style="font-family: 仿宋">(1)取标志寄存器指令</span></p>
<ul data-source-line="468">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">LAHF</span></span></li>
<li><span style="font-family: 仿宋">作用:将标志寄存器的低8位送入AH寄存器,即将标志</span><br><span style="font-family: 仿宋">SF、ZF、AF、PF和CF分别送入AH的第7、6、4、2、0 位,而AH的第5、3、1位不确定。</span></li>

</ul>
<p data-source-line="472"><span style="font-family: 仿宋">指令执行对标志寄存器各位无影响,即标志寄存器各位不变.</span></p>
<p data-source-line="474"><span style="font-family: 仿宋">(2)存储标志寄存器指令</span></p>
<ul data-source-line="475">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">SAH F</span></span></li>
<li><span style="font-family: 仿宋">作用:将寄存器AH中的第7、6、4、2、0位分别送入标志寄 存攜的SF、ZF、AF、PF和CF各标志位。而标志寄存器高8 位中的各标志位不受影响。</span></li>

</ul>
<p data-source-line="478"><span style="font-family: 仿宋">(3)标志进栈指令</span></p>
<ul data-source-line="479">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">PUSH F</span></span></li>
<li><span style="font-family: 仿宋">作用:先将堆栈指针SP减2,使其指向堆栈顶部的空字单元, 然后将16位标志寄存器的内容送SP指向的字单元。</span></li>

</ul>
<p data-source-line="482"><span style="font-family: 仿宋">(4)标志出栈指令</span></p>
<ul data-source-line="483">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">POP F</span></span></li>
<li><span style="font-family: 仿宋">作用:将由SP指向的堆栈顶部的一个字单元的内容送 入标志寄存器,然后SP的内容加2</span></li>

</ul>
<p data-source-line="486"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4.地址传送指令</strong></span></p>
<p data-source-line="488"><span style="font-family: 仿宋">(1)装入有效地址</span></p>
<ul data-source-line="489">
<li><span style="font-family: 仿宋">格式:<span style="background-color: rgba(255, 255, 0, 1)">LEA DEST, SRC</span></span></li>
<li><span style="font-family: 仿宋">作用:将SRC存储单元地址中的偏移量,即有效地址EA 传送到一个16位通用寄存器中。指令执行对标志寄存器各位无影响。</span></li>

</ul>
<p data-source-line="492"><span style="font-family: 仿宋">(2)装入地址指针指令</span></p>
<ul data-source-line="493">
<li><span style="font-family: 仿宋">格式:<span style="background-color: rgba(255, 255, 0, 1)">LDS DEST, SRC</span>&nbsp;</span></li>
<li><span style="font-family: 仿宋">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="background-color: rgba(255, 255, 0, 1)">LES DEST, SRC</span></span></li>
<li><span style="font-family: 仿宋">作用:把SRC存储单元开始的4个字节单元的内容 (32位地址指针)送入DEST通用寄存器和段寄存器 DS (LDS指令)或ES (LES指令),其中低字单 元内容为偏移量送通用寄存器,高字单元内容为段 基值送DS或ES。</span></li>

</ul>
<h4 id="二-算术运算类指令" data-source-line="496"><span style="font-family: 仿宋">二、算术运算类指令</span></h4>
<p data-source-line="497"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1.加法指令</strong></span></p>
<ul data-source-line="498">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">ADD DEST, SRC</span></span></li>
<li><span style="font-family: 仿宋">功能:目的操作数和源操作数和加,其和存放到 目的操作数中,而源操作数内容保持不变,即</span><br><span style="font-family: 仿宋">DEST&lt;=(DEST)+(SRC)。</span></li>

</ul>
<p data-source-line="503"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2.带进位加法指令</strong></span></p>
<ul data-source-line="504">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">ADC DEST, SRC</span></span></li>
<li><span style="font-family: 仿宋">该指令的功能与ADD基本相同,所不同的是其结果 还要加上进位标志CF的值,即:</span><br><span style="font-family: 仿宋">DEST&lt;=(DEST)+(SRC)+CF</span></li>

</ul>
<p data-source-line="510"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3 .加1指令</strong></span></p>
<ul data-source-line="511">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">INC DEST</span></span></li>
<li><span style="font-family: 仿宋">该指令为单操作数指令,其功能是将目的操作数加</span><br><span style="font-family: 仿宋">1,并送回到目的操作数,</span><br><span style="font-family: 仿宋">即:DEST&lt;=(DEST)+1</span></li>

</ul>
<p data-source-line="516"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4 .减法指令</strong></span></p>
<ul data-source-line="517">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">SUB DEST, SRC</span></span></li>
<li><span style="font-family: 仿宋">功能:目的操作数的内容减去源操作数的内容,结果 送入目的操作数,源操作数中内容保持不变。</span><br><span style="font-family: 仿宋">即:DEST&lt;= (DEST) — (SRC)</span></li>

</ul>
<p data-source-line="521"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>5 .带借位减法</strong></span></p>
<ul data-source-line="522">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">SBB DEST, SRC</span></span></li>
<li><span style="font-family: 仿宋">该指令的功能与SUB指令基本相同,不同的是在两 个操作数相减后再减去进位标志CF的值。</span><br><span style="font-family: 仿宋">即:DEST&lt;=(DEST) —(SRC)—CF。</span></li>

</ul>
<p data-source-line="526"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>6.减1指令</strong></span></p>
<ul data-source-line="527">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">DEC DEST</span></span></li>
<li><span style="font-family: 仿宋">该指令为单操作数指令,将目的操作数的内容减1 后,送回到目的操作数。</span><br><span style="font-family: 仿宋">即:DEST&lt;=(DEST) —1</span></li>

</ul>
<p data-source-line="531"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>7.求负数指令</strong></span></p>
<ul data-source-line="532">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">NEG DEST</span></span></li>
<li><span style="font-family: 仿宋">功能:用零减去目的操作数的内容,并送回目的操 作数。</span><br><span style="font-family: 仿宋">即:DEST&lt;=0-(DEST)</span></li>

</ul>
<h4 id="三-位操作类指令" data-source-line="536"><span style="font-family: 仿宋">三、位操作类指令</span></h4>
<p data-source-line="537"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1.逻辑运算指令</strong></span><br><span style="font-family: 仿宋">逻辑运算指令共有4条,它们的指令格式分别是:</span><br><span style="font-family: 仿宋">逻辑“与”指令&nbsp;<strong>AND DEST,SRC</strong></span><br><span style="font-family: 仿宋">逻辑“或”指令&nbsp;<strong>OR DEST,SRC</strong></span><br><span style="font-family: 仿宋">逻辑“异或”指令&nbsp;<strong>XOR DEST,SRC</strong></span><br><span style="font-family: 仿宋">逻辑“非”指令&nbsp;<strong>NOT DEST</strong></span></p>
<table data-source-line="544">
<thead>
<tr><th><span style="font-family: 仿宋">DEST</span></th><th><span style="font-family: 仿宋">SRC</span></th><th><span style="font-family: 仿宋">AND</span></th><th><span style="font-family: 仿宋">OR</span></th><th><span style="font-family: 仿宋">XOR</span></th><th><span style="font-family: 仿宋">NOT</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">1</span></td>
<td><span style="font-family: 仿宋">0</span></td>
<td><span style="font-family: 仿宋">0</span></td>

</tr>

</tbody>

</table>
<p data-source-line="551"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2.测试指令</strong></span></p>
<ul data-source-line="552">
<li><span style="font-family: 仿宋">指令格式:<span style="background-color: rgba(255, 255, 0, 1)">TEST DEST, SRC</span></span></li>
<li><span style="font-family: 仿宋">该指令的功能与AND指令相似,实现源操作数与 目的操作数进行按位“逻辑与"运算,对标志位 的影响与AND指令相同,但<span style="background-color: rgba(255, 255, 0, 1)">运算的结果不送入目 的操作数,即目的操作数内容也将保持不变</span>。</span></li>

</ul>
<p data-source-line="555"><span style="font-family: 仿宋"><strong>3.移位/循环移位指令</strong></span></p>
<p data-source-line="557"><span style="font-family: 仿宋">(1)<strong>算术移位</strong></span></p>
<table data-source-line="559">
<thead>
<tr><th><span style="font-family: 仿宋">算术左移</span></th><th><span style="font-family: 仿宋">SAL DEST,COUNT</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋"><strong>算术右移</strong></span></td>
<td><span style="font-family: 仿宋"><strong>SAR DEST,COUNT</strong></span></td>

</tr>

</tbody>

</table>
<p data-source-line="563"><span style="font-family: 仿宋">(2)<strong>逻辑移位</strong></span></p>
<table data-source-line="567">
<thead>
<tr><th><span style="font-family: 仿宋">逻辑左移</span></th><th><span style="font-family: 仿宋">SHL DEST,COUNT</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋"><strong>逻辑右移</strong></span></td>
<td><span style="font-family: 仿宋"><strong>SHR DEST,COUNT</strong></span></td>

</tr>

</tbody>

</table>
<p data-source-line="572"><span style="font-family: 仿宋">(3)<strong>循环移位</strong></span><br><span style="font-family: 仿宋">小循环:</span></p>
<table data-source-line="576">
<thead>
<tr><th><span style="font-family: 仿宋">循环左移</span></th><th><span style="font-family: 仿宋">ROL DEST,COUNT</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋"><strong>循环右移</strong></span></td>
<td><span style="font-family: 仿宋"><strong>ROR DEST,COUNT</strong></span></td>

</tr>

</tbody>

</table>
<p data-source-line="580"><span style="font-family: 仿宋">大循环:</span></p>
<table data-source-line="583">
<thead>
<tr><th><span style="font-family: 仿宋">带进位循环左移</span></th><th><span style="font-family: 仿宋">RCL DEST,COUNT</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">带进位循环右移</span></td>
<td><span style="font-family: 仿宋">RCR DEST,COUNT</span></td>

</tr>

</tbody>

</table>
<h4 id="四-处理器控制类指令" data-source-line="587"><span style="font-family: 仿宋">四、处理器控制类指令</span></h4>
<p data-source-line="589"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 标志位操作指令</strong></span><br><span style="font-family: 仿宋">它们都是无操作数指令,操作数隐含为标志寄存器的 某个标志位。能直接操作的标志位有CF、IF和DF。</span></p>
<p data-source-line="592"><span style="font-family: 仿宋">(1)消除进位标志&nbsp;CLC ;置CF为0</span><br><span style="font-family: 仿宋">(2)置1进位标志&nbsp;STC ;置CF为 1</span><br><span style="font-family: 仿宋">(3)进位标志取反&nbsp;CMC ; CF的值取反</span><br><span style="font-family: 仿宋">(4)清除方向标志 CLD;置DF为0</span><br><span style="font-family: 仿宋">(5)置1方向标志 STD;置DF为 1</span><br><span style="font-family: 仿宋">(6)清除中断标志 CLI;置IF为0</span><br><span style="font-family: 仿宋">(7)置1中断标志 STI;置IF为 1</span></p>
<p data-source-line="600"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 与外部事件同步的指令</strong></span></p>
<ul data-source-line="601">
<li><span style="font-family: 仿宋">HLT ;暂停指令</span></li>
<li><span style="font-family: 仿宋">WAIT ;等待指令</span></li>
<li><span style="font-family: 仿宋">ESC ;外部协处理器指令前缀</span></li>
<li><span style="font-family: 仿宋">LOCK ;总线锁定指令</span></li>

</ul>
<p data-source-line="606"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 空操作指令NOP</strong></span><br><span style="font-family: 仿宋">执行一次NOP占用CPU三个时钟周期,它不改变任 何寄存器或存储单元内容,主要用于延时。</span></p>
<hr>
<h3 id="指令编码" data-source-line="612"><span style="font-family: 仿宋">指令编码</span></h3>
<h4 id="一-双操作数指令编码格式" data-source-line="614"><span style="font-family: 仿宋">一、双操作数指令编码格式</span></h4>
<p data-source-line="616"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1. 操作特征部分</strong></span><br><span style="font-family: 仿宋">这部分为指令编码的首字节,它又分为以下三个段。</span><br><span style="font-family: 仿宋">(1) OPCODE:操作码字段</span><br><span style="font-family: 仿宋">该字段长度为6bit。它表示了该指令所执行的功能 和两个操作数的来源。</span><br><span style="font-family: 仿宋">(2)方向字段d</span><br><span style="font-family: 仿宋">该字段与第2部分寻址特征一起来决定源操作数和 目的操作数的来源。</span><br><span style="font-family: 仿宋">(3)字/字节字段W</span><br><span style="font-family: 仿宋">当W=1时,表示两操作数长度为字;当W=0时,表 示两操作数长度为字节。</span></p>
<p data-source-line="625"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2. 寻址特征部分</strong></span></p>
<ul data-source-line="627">
<li><span style="font-family: 仿宋">当d=l时,则目的操作数由REG字段确定,而源操作 数由MOD和R/M字段确定o</span></li>
<li><span style="font-family: 仿宋">当d=0时,则目的操作数由MOD和R/M字段确定,而 源操作数由REG字段确定。</span></li>

</ul>
<p data-source-line="630"><span style="font-family: 仿宋">(1) REG字段</span><br><span style="font-family: 仿宋">由REG字段确定的一个操作数是某一通用寄存器的 内容,即使用的是寄存器寻址方式。</span></p>
<table data-source-line="633">
<thead>
<tr><th><span style="font-family: 仿宋">REG</span></th><th><span style="font-family: 仿宋">000</span></th><th><span style="font-family: 仿宋">001</span></th><th><span style="font-family: 仿宋">010</span></th><th><span style="font-family: 仿宋">011</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋"><strong>段寄存器</strong></span></td>
<td><span style="font-family: 仿宋">ES</span></td>
<td><span style="font-family: 仿宋">CS</span></td>
<td><span style="font-family: 仿宋">SS</span></td>
<td><span style="font-family: 仿宋">DS</span></td>

</tr>

</tbody>

</table>
<p data-source-line="638"><span style="font-family: 仿宋">(2)寻址方式字段MOD和寄存器/存储器字段R/M</span></p>
<p data-source-line="640"><span style="font-family: 仿宋">这两个字段共同确定一个操作数。该操作数可以 在寄存器中,也可以在存储器中</span></p>
<p data-source-line="642"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3. 位移量部分</strong></span></p>
<p data-source-line="644"><span style="font-family: 仿宋">根据寻址特征中MOD和R/M字段确定的有效地址 计算方法,位移量可以是以下三种情况之一:</span></p>
<ul data-source-line="645">
<li><span style="font-family: 仿宋">没有位移量</span></li>
<li><span style="font-family: 仿宋">1字节位移量disp8</span></li>
<li><span style="font-family: 仿宋">2字节位移量displ6</span></li>

</ul>
<p data-source-line="649"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4. 立即数部分</strong></span></p>
<p data-source-line="651"><span style="font-family: 仿宋">如果指令的源操作数为立即数,则指令编码中包含 有该部分。它总是位于指令编码的最后1〜2字节。</span></p>
<h4 id="二-单操作数指令编码格式" data-source-line="652"><span style="font-family: 仿宋">二、单操作数指令编码格式</span></h4>
<p data-source-line="653"><span style="font-family: 仿宋">这种编码格式适用于只有一个操作数的指令,如INC、 DEC、移位/循环等指令。指令编码为2〜3字节。</span></p>
<p data-source-line="655"><span style="font-family: 仿宋">操作特征部分:</span><br><span style="font-family: 仿宋">包括OPCODE、V和W三个字段,其中V字段只有移位/ 循环指令中才有该字段。其它指令中没有该字段。</span></p>
<ul data-source-line="657">
<li><span style="font-family: 仿宋">V=0时,指令中使用常数1作为移位或循环次数。</span></li>
<li><span style="font-family: 仿宋">V=1时,指令中使用寄存器CL作移位次数。</span><br><span style="font-family: 仿宋">由于单操作数指令中只有一个操作数,因此寻址特征部分就不需要REG字段,而该字段被用作辅助操作码。</span></li>

</ul>
<h4 id="三-与ax或al有关的指令编码格式" data-source-line="661"><span style="font-family: 仿宋">三、与AX或AL有关的指令编码格式</span></h4>
<p data-source-line="662"><span style="font-family: 仿宋">这种编码格式用于隐含指定AX/AL作为一个操作数 的双操作数指令。</span><br><span style="font-family: 仿宋">采用这种编码格式的指令,除一个操作数隐含指定为 AX/AL外,另一个操作数可以是立即数或存储单元。</span><br><span style="font-family: 仿宋">立即数:则编码中应有1〜2字节的立即数</span><br><span style="font-family: 仿宋">存储单元:只能使用直接寻址方式,位 移量由disp字段给岀。</span></p>
<h4 id="四-其它指令编码格式" data-source-line="667"><span style="font-family: 仿宋">四、其它指令编码格式</span></h4>
<p data-source-line="668"><span style="font-family: 仿宋">除上述三种编码格式外,还有一些指令的编码格式更简单。如标志位操作指令、堆栈操作指令等。 这些指令的编码格式一般只有一个字节。</span></p>
<hr><hr>
<h2 id="第四章-汇编语言程序格式" data-source-line="684"><span style="font-family: 仿宋">第四章 汇编语言程序格式</span></h2>
<h3 id="汇编语言语句种类及其格式" data-source-line="686"><span style="font-family: 仿宋">汇编语言语句种类及其格式</span></h3>
<h4 id="一-指令语句" data-source-line="688"><span style="font-family: 仿宋">一、指令语句</span></h4>
<p data-source-line="690"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1 .标号字段</strong></span></p>
<ul data-source-line="692">
<li><span style="font-family: 仿宋">标号是可选字段,它后面必须有“:”标号是一 条指令的符号地址,代表了该指令的第一个字节存放地址。</span></li>
<li><span style="font-family: 仿宋">标号一般放在一个程序段或子程序的入口处,控制 程序的执行转到该程序位置。</span></li>
<li><span style="font-family: 仿宋">例 ADDR1: MOV AL, 100</span></li>

</ul>
<p data-source-line="697"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2 .指令助记符字段</strong></span></p>
<ul data-source-line="698">
<li><span style="font-family: 仿宋">该字段是一条指令的必选项,它表示这条语句要求 CPU完成什么具体操作,如MOV、ADD、SHL等。</span></li>
<li><span style="font-family: 仿宋">有些指令还可以在指令助记符的前面加上前缀,实 现一定的附加操作。</span></li>

</ul>
<p data-source-line="702"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3.操作数字段</strong></span></p>
<ul data-source-line="703">
<li><span style="font-family: 仿宋">一条指令可以有一个操作数、两个操作数或者无操作数。</span></li>

</ul>
<p data-source-line="705"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4.注释字段</strong></span></p>
<ul data-source-line="706">
<li><span style="font-family: 仿宋">注释字段为可选项,该字段以分号“;”开始。</span></li>
<li><span style="font-family: 仿宋">它的作用是为阅读程序的人加上一些说明性内容</span></li>
<li><span style="font-family: 仿宋">注释字段不会产生机器目标代码,它不会影响程 序和指令的功能。</span></li>
<li><span style="font-family: 仿宋">注释字段可以是一条指令的后面部分,也可以是 整个语句行。</span></li>

</ul>
<h4 id="二-伪指令语句" data-source-line="711"><span style="font-family: 仿宋">二、伪指令语句</span></h4>
<p data-source-line="712"><span style="font-family: 仿宋">伪指令语句又叫<span style="background-color: rgba(255, 255, 0, 1)">命令语句</span>。</span><br><span style="font-family: 仿宋">伪指令本身并不产生对应的机器目标代码。它仅 仅是告诉汇编程序对其后面的指令语句和伪指令 语句的操作数应该如何处理。</span></p>
<p data-source-line="715"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1.符号名字段</strong></span></p>
<ul data-source-line="717">
<li><span style="font-family: 仿宋">该字段为可选项。根据伪指令的不同,符号名可 以是常量名、变量名、过程名、结构名和记录名</span></li>
<li><span style="font-family: 仿宋">一条伪指令语句的符号名可以作其它伪指令语句 或指令语句的操作数,这时它表示一个常量或存储器地址</span></li>

</ul>
<p data-source-line="720"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2.伪指令符字段</strong></span></p>
<ul data-source-line="721">
<li><span style="font-family: 仿宋">该字段是伪指令语句的必选项,它规定了汇编 程序所要完成的具体操作。</span></li>

</ul>
<p data-source-line="723"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3.操作数字段</strong></span></p>
<ul data-source-line="724">
<li><span style="font-family: 仿宋">该字段是否需要,以及需要几个是由伪指令符 字段来决定。</span></li>
<li><span style="font-family: 仿宋">操作数可以是一个常数</span></li>

</ul>
<p data-source-line="727"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4.注释字段</strong></span></p>
<ul data-source-line="728">
<li><span style="font-family: 仿宋">注释字段为可选项,该字段必须以分号开始。 其作用与指令语句的注释字段相同。</span></li>

</ul>
<h4 id="三-标识符" data-source-line="730"><span style="font-family: 仿宋">三、标识符</span></h4>
<p data-source-line="731"><span style="font-family: 仿宋">指令语句中的标号利伪指令语句中符号名统 称为标识符。标识符是由若干个字符构成的。</span><br><span style="font-family: 仿宋">标识符构成规则:</span><br><span style="font-family: 仿宋">1.字符的个数为1〜31个;</span><br><span style="font-family: 仿宋">2.第一个字符必须是字母、问号、@或下划线“<em>” 这4种字符之一;<br>3.从第二个字符开始,可以是字母、数字、@、“</em>”</span><br><span style="font-family: 仿宋">或问号“?”;</span><br><span style="font-family: 仿宋">4.不能使用属于系统专用的保留字。</span></p>
<hr>
<h3 id="汇编语言数据" data-source-line="741"><span style="font-family: 仿宋">汇编语言数据</span></h3>
<p data-source-line="743"><span style="font-family: 仿宋">在汇编语言中常用的数据形式有:<span style="background-color: rgba(255, 255, 0, 1)">常数、变 量和标号</span>。</span></p>
<h5 id="一-常数" data-source-line="744"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">一、常数</span></h5>
<p data-source-line="745"><span style="font-family: 仿宋">常数有以下几种形式:</span></p>
<blockquote data-source-line="747">
<p><span style="font-family: 仿宋">1.二进制数:以字母B结尾。</span><br><span style="font-family: 仿宋">2.八进制数:以字母O或Q结尾。</span><br><span style="font-family: 仿宋">3.十进制数:以字母D结尾,或者没有结尾字 母。</span><br><span style="font-family: 仿宋">4.十六进制数:以字母H结尾,如果常数的第一个数字为字母,为了与标识符加以区别,必须在其前面冠以数字“0”。</span><br><span style="font-family: 仿宋">5.实数。</span><br><span style="font-family: 仿宋">6.字符串常数:用引号(单引号或双引号)括起 来的一个或多个字符,这些字符以它的ASCII码 值存储在内存。</span></p>

</blockquote>
<p data-source-line="754"><span style="font-family: 仿宋">常数在程序中可以用在以下几种情况:</span></p>
<blockquote data-source-line="756">
<p><span style="font-family: 仿宋">(1)作指令语句的源操作数</span><br><span style="font-family: 仿宋">(2)在指令语句的直接寻址方式、变址(基址)寻 址方式或基址变址寻址方式中作位移量。</span><br><span style="font-family: 仿宋">(3)在数据定义伪指令中使用</span></p>

</blockquote>
<p data-source-line="761"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>二、变量</strong></span></p>
<p data-source-line="763"><span style="font-family: 仿宋"><strong>1.变量的定义与预置</strong></span><br><span style="font-family: 仿宋">定义变量就是给变量在内存中分配一定的存储单 元。也就是给这个存储单元赋与一个符号名,即变量 名,同时还要将这些存储单元预置初值。</span><br><span style="font-family: 仿宋">变量定义的一般格式:</span></p>
<table data-source-line="766">
<thead>
<tr><th><span style="font-family: 仿宋">定义变量</span></th><th><span style="font-family: 仿宋">含义</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">DB</span></td>
<td><span style="font-family: 仿宋">定义字节变量</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">DW</span></td>
<td><span style="font-family: 仿宋">定义字变量</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">DD 表达式1,表达式2...</span></td>
<td><span style="font-family: 仿宋">定义4字节变量</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">DQ</span></td>
<td><span style="font-family: 仿宋">定义8字节变量</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">DT</span></td>
<td><span style="font-family: 仿宋">定义10字节变量</span></td>

</tr>

</tbody>

</table>
<p data-source-line="775"><span style="font-family: 仿宋">其中表达式1、表达式2是给存储单元赋的初值。</span></p>
<p data-source-line="777"><span style="font-family: 仿宋">当变量被定义后,就具有了以下<strong>三个属性</strong>:</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(1)段属性</span><br><span style="font-family: 仿宋">它表示变量存放在哪一个逻辑段中。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(2)偏移量属性(OFFSET)</span><br><span style="font-family: 仿宋">它表示变量所在位置与段起始点之间的字节数。</span><br><span style="font-family: 仿宋">段属性和偏移量属性就构造了变量的逻辑地址</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(3)类型属性</span><br><span style="font-family: 仿宋">它表示变量占用存储单元的字节数。</span></p>
<p data-source-line="786"><span style="font-family: 仿宋">在变量的定义语句中,给变量赋初值的表达式可以使 用下面4种形式:</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(1)数值表达式</span></p>
<ul data-source-line="788">
<li><span style="font-family: 仿宋">例如:DATA1 DB 32, 30H</span></li>

</ul>
<p data-source-line="790"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(2) ?表达式</span></p>
<ul data-source-line="791">
<li><span style="font-family: 仿宋">不帯引号的问号“?"表示可以预置任意内容。</span></li>

</ul>
<p data-source-line="793"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(3)字符串表达式</span></p>
<ul data-source-line="794">
<li><span style="font-family: 仿宋">对于DB伪指令,字符串为用引号括起来的不超过255 个字符。给每一个字符分配一个字节单元。字符串按从左 到右,将字符的ASCII编码值以地址递增的排列顺序依次 存放。</span></li>

</ul>
<p data-source-line="796"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(4) DUP表达式</span></p>
<ul data-source-line="797">
<li><span style="font-family: 仿宋">DUP称为重复数据操作符。</span></li>
<li><span style="font-family: 仿宋">格式:</span><br><span style="font-family: 仿宋">变量名 DW/DB/DD 表达式1 DUP (表达式2)</span></li>

</ul>
<p data-source-line="801"><span style="font-family: 仿宋">其中:表达式1是重复的次数,表达式2是重复的内容。</span></p>
<p data-source-line="804"><span style="font-family: 仿宋"><strong>2.变量的使用</strong></span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(1)在指令语句中引用</span></p>
<ul data-source-line="806">
<li><span style="font-family: 仿宋">在指令语句中直接引用变量名就是对其存储单元的内容进 行存取</span></li>
<li><span style="font-family: 仿宋">当变量出现在变址(基址)寻址或基址变址寻址的操作数 中时表示取用该变量的偏移量。</span></li>

</ul>
<p data-source-line="809"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">(2)在伪指令语句中引用</span></p>
<p data-source-line="811"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>三、标号</strong></span></p>
<ul data-source-line="812">
<li><span style="font-family: 仿宋">标号写在一条指令的前面,它就是该指令在内存的 存放地址的符号表示,也就是指令地址的别名。</span></li>
<li><span style="font-family: 仿宋">标号主要用在程序中需要改变程序的执行顺序时, 用来标记转移的目的地,即作转移指令的操作数。</span></li>

</ul>
<p data-source-line="815"><span style="font-family: 仿宋">每个标号具有<strong>三属性</strong></span></p>
<blockquote data-source-line="816">
<p><span style="font-family: 仿宋">(1)段属性(SEG)</span><br><span style="font-family: 仿宋">它表示该标号所代表的地址在娜个逻辑段中,即段基值。</span><br><span style="font-family: 仿宋">(2)偏移量属性(OFFSET)</span><br><span style="font-family: 仿宋">它表示该标号所代表的地址在段内与段起点间的字节 数,即地址的偏移量。</span><br><span style="font-family: 仿宋">(3)距离属性(也叫类型属性)</span><br><span style="font-family: 仿宋">它表示该标号可以被段内还是段间的指令调用。</span></p>

</blockquote>
<ul data-source-line="823">
<li><span style="font-family: 仿宋"><strong>NEAR (近):</strong>&nbsp;该标号只能作段内转移,也就是说只能</span><br><span style="font-family: 仿宋">是与该标号所指指令同在一个逻辑段的转移指令和 调用指令才能使用它。</span></li>
<li><span style="font-family: 仿宋"><strong>FAR (远):</strong>&nbsp;该标号可以被非本段的转移和调用指令使用。</span><br><span style="font-family: 仿宋">标号的距离属性可以右两种方法来指定:</span><br><span style="font-family: 仿宋">a.隐含方式</span><br><span style="font-family: 仿宋">b.用LABEL伪指令给标号指定距离属性</span></li>

</ul>
<h4 id="符号定义语句" data-source-line="829"><span style="font-family: 仿宋">符号定义语句</span></h4>
<h6 id="一-等值语句" data-source-line="831"><span style="font-family: 仿宋">一、等值语句</span></h6>
<p data-source-line="832"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">语句格式:符号名 EQU 表达式</span></p>
<ul data-source-line="833">
<li><span style="font-family: 仿宋">功能:用符号名来表示EQU右边的表达式。后面的程序中 一旦岀现该符号名,汇编程序将把它替换成该表达式。</span><br><span style="font-family: 仿宋">表达式可以是任何形式,常见的以下:</span></li>

</ul>
<blockquote data-source-line="835">
<p><span style="font-family: 仿宋">1.常数或数值表达式</span><br><span style="font-family: 仿宋">COUNT EQU 5</span><br><span style="font-family: 仿宋">NUM EQU COUNT+5</span><br><span style="font-family: 仿宋">2 .地址表达式</span><br><span style="font-family: 仿宋">ADRI EQU DS: </span><br><span style="font-family: 仿宋">ADRI被定义为在DS数据段中以BP作基址寻址的一个 存储单元。</span><br><span style="font-family: 仿宋">3.变量、寄存器名或指令助记符</span></p>

</blockquote>
<h6 id="二-等号语句" data-source-line="843"><span style="font-family: 仿宋">二、等号语句</span></h6>
<p data-source-line="844"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">格式:符号名 =表达式</span><br><span style="font-family: 仿宋">-等号语句与等值语句具有相同的作用。但等号语句可以 对一个符号进行多次定义。</span></p>
<hr>
<h3 id="表达式与运算符" data-source-line="849"><span style="font-family: 仿宋">表达式与运算符</span></h3>
<p data-source-line="851"><span style="font-family: 仿宋">表达式是指令或伪指令语句操作数的常见形式。它由 常数、变量、标号等通过操作运算符连接而成。</span></p>
<h6 id="一-算术运算符" data-source-line="853"><span style="font-family: 仿宋">一、算术运算符</span></h6>
<p data-source-line="854"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">+、-、*、/、MOD、SHL、SHR、[]</span></p>
<blockquote data-source-line="855">
<p><span style="font-family: 仿宋">1.运算符“+”和“-”也可作单目运算符,表示数的正负。</span><br><span style="font-family: 仿宋">2. 使用“+”、“-”、“*”、和“/”运算符时,参加运算 的数和运算结果都是<strong>整数</strong>。</span><br><span style="font-family: 仿宋">3.“/”运算为取商的整数部分,而“MOD”运算取除法运 算的余数。</span><br><span style="font-family: 仿宋">4.“<span style="background-color: rgba(255, 255, 0, 1)">SHR&nbsp;</span>”和“<span style="background-color: rgba(255, 255, 0, 1)">SHL&nbsp;</span>”为逻辑移位运算符</span><br><span style="font-family: 仿宋">“SHR”为右移,<span style="background-color: rgba(255, 255, 0, 1)">左边移出来的空位用0补入</span>。</span><br><span style="font-family: 仿宋">“SHL”为左移,<span style="background-color: rgba(255, 255, 0, 1)">右边移出来的空位用0补入</span>。</span><br><span style="font-family: 仿宋">5.下标运算符“[]”具有相加的作用</span><br><span style="font-family: 仿宋">一般使用格式:&nbsp;<span style="background-color: rgba(255, 255, 0, 1)">表达式1 [表达式2]</span></span></p>

</blockquote>
<h6 id="二-逻辑运算符" data-source-line="866"><span style="font-family: 仿宋">二、逻辑运算符</span></h6>
<p data-source-line="867"><span style="font-family: 仿宋">逻辑运算符<span style="background-color: rgba(255, 255, 0, 1)">有NOT、AND、OR和XOR</span>等四个,它们执 行的都是按<strong>位逻辑</strong>运算。</span></p>
<h6 id="三-关系运算符" data-source-line="869"><span style="font-family: 仿宋">三、关系运算符</span></h6>
<p data-source-line="870"><span style="font-family: 仿宋">关系运算符包括:</span></p>
<table data-source-line="872">
<thead>
<tr><th><span style="font-family: 仿宋">运算符</span></th><th><span style="font-family: 仿宋">含义</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">EQ</span></td>
<td><span style="font-family: 仿宋">等于</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">NE</span></td>
<td><span style="font-family: 仿宋">不等于</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">LT</span></td>
<td><span style="font-family: 仿宋">小 于</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">LE</span></td>
<td><span style="font-family: 仿宋">小于等于</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">GT</span></td>
<td><span style="font-family: 仿宋">大于</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">GE</span></td>
<td><span style="font-family: 仿宋">大于等于</span></td>

</tr>

</tbody>

</table>
<p data-source-line="881"><span style="font-family: 仿宋">关系运算的结果只能是**“真”(全1)或“假”(全0)**</span></p>
<h6 id="四-数值返回运算符" data-source-line="883"><span style="font-family: 仿宋">四、数值返回运算符</span></h6>
<p data-source-line="886"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1.SEG运算符</strong></span><br><span style="font-family: 仿宋">作用:取变量或标号所在段的段基值。</span></p>
<p data-source-line="890"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2.OFFSET运算符</strong></span><br><span style="font-family: 仿宋">该运算符的作用是取变量或标号在段内的偏移量。</span></p>
<p data-source-line="893"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3.TYPE运算符</strong></span><br><span style="font-family: 仿宋">作用:取变量或标号的类型属性, 来说就是取它的字节长度。</span></p>
<p data-source-line="896"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4.LENGTH运算符</strong></span><br><span style="font-family: 仿宋">该运算符用于取<strong>变量的长度</strong>。</span><br><span style="font-family: 仿宋">>如果变量是用重复数据操作符DUP说明的,则LENGTH运 算取外层DUP给定的值。</span><br><span style="font-family: 仿宋">>如果没有用DUP说明,贝0LENGTH运算返回值总是1。</span></p>
<p data-source-line="901"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>5.SIZE运算符</strong></span><br><span style="font-family: 仿宋">该运算符只能作用于变量,SIZE取值等于LENGTH和 TYPE两个运算符返回值的乘积。</span></p>
<h6 id="五-属性修改运算符" data-source-line="904"><span style="font-family: 仿宋">五、属性修改运算符</span></h6>
<p data-source-line="906"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1.PTR运算符</strong></span></p>
<ul data-source-line="907">
<li><span style="font-family: 仿宋">使用格式:&nbsp;<span style="background-color: rgba(255, 255, 0, 1)">类型PTR地址表达式</span></span></li>
<li><span style="font-family: 仿宋">作用:将地址表达式所指定的标号、变量或用其它形式表 示的存储器地址的类型属性修改为“类型”所指的值。</span><br><span style="font-family: 仿宋">类型可以是BYTE、WORD、DWORD、NEAR和FAR。 这种修改是临时的,只在含有该运算符的语句内有效。</span></li>

</ul>
<p data-source-line="911"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2.HIGH/LOW 运算符</strong></span></p>
<ul data-source-line="912">
<li><span style="font-family: 仿宋">使用格式:<span style="background-color: rgba(255, 255, 0, 1)">HIGH表达式</span>&nbsp;</span></li>
<li><span style="font-family: 仿宋">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="background-color: rgba(255, 255, 0, 1)"> LOW表达式</span></span></li>
<li><span style="font-family: 仿宋">这两个运算符用来将表达式的偵分离出高字节和低字节。</span></li>

</ul>
<p data-source-line="915"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">注意:HIGH/LOW运算符不能用来分离一个变量、寄 存器或存储器单元的高字节与低字节。</span></p>
<p data-source-line="917"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3.THIS运算符</strong></span></p>
<ul data-source-line="918">
<li><span style="font-family: 仿宋">THIS运算符一般与等值运算符EQU连用,用来定 义一个变量或标号的类型属性。所定义的变量或标号的</span><br><span style="font-family: 仿宋">段基值利偏移量与紧跟其后的变量或标号相同。</span></li>

</ul>
<h6 id="六-运算符的优先级" data-source-line="921"><span style="font-family: 仿宋">六、运算符的优先级</span></h6>
<p data-source-line="922"><span style="font-family: 仿宋">在一个表达式中如果存在多个运算符时,在计算时就有先 后顺序问题。不同的运算符具有不同的运算优先级别。</span></p>
<table data-source-line="925">
<thead>
<tr><th><span style="font-family: 仿宋">优先级别</span></th><th><span style="font-family: 仿宋">运算符</span></th></tr>

</thead>
<tbody>
<tr>
<td><span style="font-family: 仿宋">(最高)1</span></td>
<td><span style="font-family: 仿宋">LENGTH, SIZE ,圆括号</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">2</span></td>
<td><span style="font-family: 仿宋">PTR, OFFSET, SEG, TYPE, THIS</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">3</span></td>
<td><span style="font-family: 仿宋">HIGH, LOW</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">4</span></td>
<td><span style="font-family: 仿宋">*, /, MOD, SHR, SHL</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">5</span></td>
<td><span style="font-family: 仿宋">+ ,-</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">6</span></td>
<td><span style="font-family: 仿宋">EQ, NE, LT, LE, GT, GE</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">7</span></td>
<td><span style="font-family: 仿宋">NOT</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">8</span></td>
<td><span style="font-family: 仿宋">AND</span></td>

</tr>
<tr>
<td><span style="font-family: 仿宋">(最低)9</span></td>
<td><span style="font-family: 仿宋">OR, XOR</span></td>

</tr>

</tbody>

</table>
<p data-source-line="937"><span style="font-family: 仿宋">汇编程序在计算表达式时,按以下规则进行运算:</span></p>
<ul data-source-line="938">
<li><span style="font-family: 仿宋">先执行优先级别高的运算,再算较低级别运算;</span></li>
<li><span style="font-family: 仿宋">相同优先级别的操作,按照在表达式中的顺序,从 左到右进行;</span></li>
<li><span style="font-family: 仿宋">可以用圖括号改变运算的顺序。</span></li>

</ul>
<hr>
<h3 id="程序的段结构" data-source-line="944"><span style="font-family: 仿宋">程序的段结构</span></h3>
<h6 id="一-段定义伪指令" data-source-line="946"><span style="font-family: 仿宋">一、段定义伪指令</span></h6>
<ul data-source-line="947">
<li><span style="font-family: 仿宋">伪指令SEGMENT和ENDS用于定义一个逻辑段。使 用时必须配对,分别表示定义的开始与结束。</span></li>
<li><span style="font-family: 仿宋">格式:</span><br><span style="font-family: 仿宋">段名SEGMENT [定位类型][组合类型]『'类别名']</span><br><span style="font-family: 仿宋">......本段语句序列</span><br><span style="font-family: 仿宋">段名ENDS</span></li>

</ul>
<p data-source-line="953"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1、段名</strong></span></p>
<ul data-source-line="954">
<li><span style="font-family: 仿宋">段名是用户自己任意选定的,符合标识符定义 规则的一个名称。</span></li>
<li><span style="font-family: 仿宋">最好选用与该逻辑段用途相关的名称。如第--个数 据段为DATA1,第二个数据为DATA2等。</span></li>
<li><span style="font-family: 仿宋">一个段的升始与结尾用的段名必须-致。</span></li>

</ul>
<p data-source-line="958"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2、定位类型</strong></span></p>
<blockquote data-source-line="959">
<p><span style="font-family: 仿宋">(1)<strong>PAGE</strong>:表示该段从一个页面的边界开始</span><br><span style="font-family: 仿宋">由于一个页面为256个字节,并且页面编号从0开始,因此, PAGE定位类型的段起始地址的最后8位二进制数一定为0, 即以00H结尾的地址。</span><br><span style="font-family: 仿宋">(2)<strong>PARA</strong>:表示该段从一个小节的边界开始</span><br><span style="font-family: 仿宋">如果用户未选定位类型,则缺省为PARA。</span><br><span style="font-family: 仿宋">(3)&nbsp;<strong>WORD</strong>:表示该段从一个偶数字节地址开始,即段起始 单元地址的最后一位二进制数一定是0。</span><br><span style="font-family: 仿宋">(4)&nbsp;<strong>BYTE</strong>:表示该段起始单元地址可以是任一地址值。</span><br><span style="font-family: 仿宋">注意:定位类型为PAGE和PARA时,段起始地址与段基址 相同。定位类型为WORD和BYTE时,段起始地址与段基址 可能不同。</span></p>

</blockquote>
<p data-source-line="967"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3、组合类型</strong></span></p>
<blockquote data-source-line="969">
<p><span style="font-family: 仿宋">(1)若未指定组合类型,表示本段与其它段<span style="background-color: rgba(255, 255, 0, 1)">无连接关系</span>。在 装入内存时,本段有自己的物理段,因此有自己的段基址</span><br><span style="font-family: 仿宋">(2)&nbsp;<strong>PUBLIC</strong>:在满足定位类型的前提下,将与该段同名的 段邻接在一起,形成一个新的逻辑段,共用一个段基址。段 内的所有偏移量调整为相对于新逻辑段的段基址。</span><br><span style="font-family: 仿宋">(3)&nbsp;<strong>COMMON</strong>:产生一个覆盖段。在多个模块连接时,把 该段与其它也用COMMON说明的同名段置成相同的段基址, 这样可达到共享同一存储区。共享存储区的长度由同名段中 最大的段确定。</span><br><span style="font-family: 仿宋">(4)&nbsp;<strong>STACK</strong>:把所有<strong>同名段</strong>连接成一个连续段,且系统自动 对SS段寄存器<strong>初始化</strong>为该连续段的段基址。并初始化堆栈指 针<strong>SP</strong>。</span><br><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋">用户程序中应至少有一个段用STACK说明,否则需要用 户程序自己初始化SS和SP。</span><br><span style="font-family: 仿宋">(5)&nbsp;<strong>AT表达式</strong>:表示本段可定位在表达式所指示的<strong>小节</strong>边界上。表达式的值也就是段基值。</span><br><span style="font-family: 仿宋">(6)&nbsp;<strong>MEMORY</strong>:表示本段在存储器中应定位在所有其它段之 后的最高地址上。如果有多个用MEMORY说明的段,则只处 理第一个用MEMORY说明的段。其余的被视为COMMON</span></p>

</blockquote>
<p data-source-line="977"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>4.类别名</strong></span></p>
<ul data-source-line="978">
<li><span style="font-family: 仿宋">类别名为某一个段或几个相同类型段设定的类型名称。系 统在进行连接处理时,把类别名相同的段存放在相邻的存储 区,但段的划分与使用仍按原来的设定。</span></li>
<li><span style="font-family: 仿宋">类别名必须用<span style="background-color: rgba(255, 255, 0, 1)">单引号</span>引起来。所用字符串可任意选定,</span></li>

</ul>
<h6 id="二-段寻址伪指令" data-source-line="981"><span style="font-family: 仿宋">二、段寻址伪指令</span></h6>
<ul data-source-line="982">
<li><span style="font-family: 仿宋">段寻址伪指令ASSUME的作用是告诉汇编程序,在处理源 程序时,定义的段与哪个寄存器关联。</span></li>
<li><span style="font-family: 仿宋"><strong>一般格式</strong>:<span style="background-color: rgba(255, 255, 0, 1)">ASSUME段寄存器名:段名,段寄存器名:段名,..</span></span></li>

</ul>
<h6 id="三-段寄存器的装入" data-source-line="986"><span style="font-family: 仿宋">三、段寄存器的装入</span></h6>
<p data-source-line="988"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>1、DS和ES的装入</strong></span><br><span style="font-family: 仿宋">在程序中,使用<span style="background-color: rgba(255, 255, 0, 1)">数据传送语句</span>来实现对DS和ES的装入。</span></p>
<p data-source-line="992"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>2、SS的装入</strong></span><br><span style="font-family: 仿宋">SS的装入有<strong>两种方法</strong></span></p>
<blockquote data-source-line="994">
<p><span style="font-family: 仿宋">(1)在段定义伪指令的组合类型项中,使用STACK参 数,并在段寻址伪指令ASSUME语句中把该段与SS段寄 存器关联。</span><br><span style="font-family: 仿宋">(2)如果在段定义伪指令的组合类型中,<span style="background-color: rgba(255, 255, 0, 1)">未使用STACK</span>&nbsp;参数,或者是在程序中要调换到另一个堆栈,这时,可以 使用类似于DS和ES的装入方法。</span></p>

</blockquote>
<p data-source-line="997"><span style="background-color: rgba(255, 255, 0, 1); font-family: 仿宋"><strong>3、CS的装入</strong></span></p>
<p data-source-line="999"><span style="font-family: 仿宋">装入CS和IP一般有下面两种情况。</span></p>
<blockquote data-source-line="1000">
<p><span style="font-family: 仿宋">(1)由系统软件按照结束伪指令指定的地址装入初始的CS和IP</span><br><br><span style="font-family: 仿宋">(2)在程序运行期间,当执行某些指令时,CPU自动修改 CS和IP,使它们指向新的代码段。</span></p>

</blockquote>
<hr>
<h3 id="过程定义伪指令procendp" data-source-line="1009"><span style="font-family: 仿宋">过程定义伪指令(PROC/ENDP)</span></h3>
<p data-source-line="1011"><span style="font-family: 仿宋">过程定义伪指令格式如下:</span><br><span style="font-family: 仿宋">过程名 PROC </span><br><span style="font-family: 仿宋">...</span><br><span style="font-family: 仿宋">RET</span><br><span style="font-family: 仿宋">...</span><br><span style="font-family: 仿宋">过程名ENDP</span></p>
<ul data-source-line="1017">
<li><span style="font-family: 仿宋"><strong>过程名</strong>是子程序的名称,它被用作过程调用指令CALL的目的操作数。</span></li>

</ul>
<hr>
<h3 id="当前位置计数器与定位伪指令orgorigin" data-source-line="1021"><span style="font-family: 仿宋">当前位置计数器$与定位伪指令ORG(Origin)</span></h3>
<ul data-source-line="1023">
<li><span style="font-family: 仿宋"><strong>定位伪指令ORG ——用来改变位置计数器的值。</strong></span></li>
<li><span style="font-family: 仿宋">格式:ORG 数值表达式</span></li>
<li><span style="font-family: 仿宋">作用:将数值表达式的值赋给当前位置计数器$。ORG语 句为其后的数据或指令设置起始偏移量。</span></li>
<li><span style="font-family: 仿宋">表达式的值必须为正值。表达式中也可以包含有当前 位置计数器的现行值$。</span></li>

</ul>
<hr>
<h3 id="标题伪指令title" data-source-line="1030"><span style="font-family: 仿宋">标题伪指令TITLE</span></h3>
<ul data-source-line="1031">
<li><span style="font-family: 仿宋">语句格式:TITLE 标题名</span></li>
<li><span style="font-family: 仿宋">作用:给所在程序指定一个标题。以便在列表文件的每一页 的第一行都显示这个标题。其中标题是用户任意选用的字符 串,字符个数不能超过60。</span></li>

</ul>
<hr>
<h3 id="从程序返回操作系统的方法" data-source-line="1036"><span style="font-family: 仿宋">从程序返回操作系统的方法</span></h3>
<h4 id="一-使用程序段前缀psp-program-segment-prefix实现返回" data-source-line="1038"><span style="font-family: 仿宋">一、使用程序段前缀PSP (Program Segment Prefix)实现返回</span></h4>
<p data-source-line="1040"><span style="font-family: 仿宋">1.将用户程序编制成一个过程,类型为FAR;</span><br><span style="font-family: 仿宋">2.将PSP的起始逻辑地址压栈,即将INT 20H指令的地址压栈;</span><br><span style="font-family: 仿宋">3.在用户程序结尾处,使用一条RET指令。执行该指令将使 保存在堆栈中的PSP的起始地址弹出到CS和IP中。</span><br><span style="font-family: 仿宋">程序结构:</span></p>
<pre><span style="font-family: 仿宋"><code>DATA SEGMENT

DATA ENDS
STACK1 SEGMENT STACK

STACK1 ENDSCODE SEGMENTBEGIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACK1PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATAMOV DS,AX

RETBEGIN ENDPCODE ENDS
END BEGIN
</code></span></pre>
<h4 id="二-使用dos系统功能调用实现返回" data-source-line="1059"><span style="font-family: 仿宋">二、使用DOS系统功能调用实现返回</span></h4>
<p data-source-line="1060"><span style="font-family: 仿宋">执行DOS功能调用4CH,也可以控制用户程序结束, 并返回DOS操作系统。</span><br><span style="font-family: 仿宋">在程序结束时,使用两条指令:</span><br><span style="font-family: 仿宋"><code>MOV AH, 4CH INT 21H</code></span><br><span style="font-family: 仿宋">代码段的结构为:</span></p>
<pre><span style="font-family: 仿宋"><code>CODE SEGMENT
ASSUME CS:CODE       
BEGIN:MOV AX, DATA
MOV DS, AX
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN<br></code></span></pre>
<hr>
<pre><span style="font-family: 仿宋"><code><br><span style="font-family: 黑体, &quot;Heiti SC&quot;"><strong><span style="font-size: 14pt">学习体会</span></strong></span></code></span></pre>
<p><span style="font-family: 仿宋">汇编语言既是最低级的语言也是最底层的,与我们计算机内部的结构联系十分密切,而且在《汇编语言程序设计》这门课前四章的学习中也深刻的了解到了这一点。比如说寄存器、中断、还要各种寻址方式以及进栈出栈,好多的都是和计算机硬件有关。前面几章都是对计算机内部结构和一些常用的指令以及寻址方式的讲解。</span></p>
<p><span style="font-family: 仿宋">但只通过几天浅显的学习汇编语言,感觉对于所学的知识点掌握程度并不是很良好,总有一种抓不住重点的感觉。希望在接下来的学习中能学以致用。</span></p>
<pre><span style="font-family: 仿宋"><code>&nbsp;</code></span></pre><br><br>
来源:https://www.cnblogs.com/ayano/p/16000946.html
頁: [1]
查看完整版本: 20192423杨斯凌 2021-2022-2 《汇编语言程序设计》前四章学习报告