小东西 發表於 2021-10-30 12:54:00

汇编语言学习笔记(4)——汇编基本指令集

<hr><hr>
<p>注:为讲授方便,使用下列符号:</p>
<table border="0">
<tbody>
<tr>
<td>N</td>
<td>代表立即数</td>
<td>N8、N16、N32代表8、16、 32位立即数</td>
</tr>
<tr>
<td>R</td>
<td>代表寄存器操作数</td>
<td>R8、R16、R32代 表8、16、32位寄存器操作数</td>
</tr>
<tr>
<td>M</td>
<td>代表内存操作数</td>
<td>M8、M16、M32代 表8、16、32位内存操作数</td>
</tr>
<tr>
<td>S</td>
<td>代表段寄存器</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<hr><hr>
<p>一、传送类指令</p>
<p> 1. 通用传送</p>
<ul>
<li>数据传送</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211022161519738-1244332715.png" alt="" width="495" height="161" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:源→目,源不变,不影响6种标志</li>
<li>说明:CS不能做目标,不能向段寄存器写入立即数 ;禁止2个内存单元直接传送 ;源、目属性要一致</li>
</ul>
</li>
<li>有效地址传送</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211022162254380-1266421227.png" alt="" width="498" height="64" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:计算内存单元的有效地址(不是其中的操作数)→目标
<ul>
<li>LEA BX , BUF;将BUF单元的有效地址→BX</li>
<li>LEA BX , ;将数据段SI+5变址的那个单元的有效地址→BX</li>
</ul>
</li>
<li>注:有效地址就是偏移地址,LEA指令等效于 OFFSET运算符;LEA BX,BUF 等效于 MOV BX,OFFSET BUF</li>
</ul>
</li>
<li>交换指令</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211022163331900-97786462.png" alt="" width="446" height="129" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:完成2个操作数互换</li>
<li>说明: 段寄存器、立即数不能参加互换 !;2个内存操作数不能互换,源、目的类型一致</li>
</ul>
</li>
</ul>
<p> 2 . 堆栈操作指令</p>
<ul>
<li>栈顶:栈区的低地址</li>
<li>栈底:栈区的高地址</li>
<li>堆栈段寄存器SS:存放堆 栈段段基址</li>
<li>堆栈指针ESP(SP):存放 栈顶单元的偏移地址</li>
<li>SS、ESP(SP)初值,由程序 员赋值或DOS系统自动赋值</li>
<li>堆栈指针SP的初值决定了堆栈的大小,SP 始终指向堆栈的顶部,即始终指向最后压入堆栈的信息所在的单元 。</li>
<li>堆栈指令
<ul>
<li>堆栈指令</li>
</ul>
</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211022165557924-1575239155.png" alt="" width="333" height="76" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li style="list-style-type: none">
<ul>
<li>说明:非直接寻址的内存操作数,必须用PTR说明属性</li>
</ul>
</li>
<li>出栈指令</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211022165635081-2033546384.png" alt="" width="314" height="93" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<ul>
<li style="list-style-type: none">
<ul>
<li style="list-style-type: none">
<ul>
<li>说明: 非直接寻址的内存操作数,必须用PTR说明属性</li>
</ul>
</li>
<li>16位寄存器进栈/出栈
<ul>
<li>PUSHA ;依次把AX、CX、DX、BX、 SP、BP、SI、DI压栈(共2´8 字节)</li>
<li>POPA ;从栈顶弹出2*8字节依次放入DI、 SI、BP、SP、BX、DX、CX、 AX</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>        </p>
<hr><hr>
<p>&nbsp;</p>
<p>二、算数运算&nbsp;</p>
<ul>
<li>加减法</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112025225-567687232.png" alt="" width="505" height="191" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:ADD :源+目→目</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SUB :目–源→目</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ADC :源+目+上条指令执行后的C标→目</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SBB :目–源–上条指令执行后的C标→目</li>
<li>注:此四种操作都影响A、C、O、P、S、Z标志</li>
<li>说明:源、目操作数的属性(长度)要一致 ;若操作数中有内存操作数时,请注意是 否需要使用PTR运算符。</li>
</ul>
</li>
<li>二进制加减法</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112130867-1693372614.png" alt="" width="401" height="125" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:I NC:目+1→目;影响A、O、P、S、Z,不影响C标
<ul>
<li>I NC:目+1→目;影响A、O、P、S、Z,不影响C标</li>
<li>I NC:目+1→目;影响A、C、O、P、S、Z</li>
</ul>
</li>
<li>说明:对于非直接寻址的内存操作数,要用PTR 明确说明属性</li>
</ul>
</li>
<li>比较指令</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112247800-1091721654.png" alt="" width="390" height="74" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:目-源,产生A、C、O、P、S、Z 6个状态标志, 不破坏源、目。该指令一般后跟条件转移指令。</li>
<li>说明:★ 源、目操作数不能同为M ★ 操作数中出现内存操作数时,请注意是否需 要使用PTR运算符</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>&nbsp;二进制乘法</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112347151-71944776.png" alt="" width="381" height="88" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112402265-667379747.png" alt="" width="622" height="166" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>★ MUL默认乘数、被乘数、乘积为无符号二进数</li>
<li>★ IMUL默认乘数、被乘数、乘积为有符号二进数</li>
<li>★ 高位积为0,则C标、O标=0,否则为1</li>
<li>★ 乘数、被乘数等长,乘积为双倍长</li>
</ul>
</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112447933-151689836.png" alt="" width="562" height="150" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>说明:源、目不能同为M</li>
<li>功能:源×目→目</li>
</ul>
</li>
</ul>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112528245-1154549528.png" alt="" width="511" height="88" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:源×立即数→目</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>&nbsp;二进制除法</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112559257-1660627283.png" alt="" width="367" height="63" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112622103-1321935122.png" alt="" width="578" height="193" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>说明:★ DIV默认除数、被除数、商、余数均为无 符号数;IDIV默认除数、被除数、商、余数 均为有符号数</li>
<li>★ 被除数应为除数的双倍长</li>
<li>★ 如除数太小,使商超出范围,则引发CPU中断 ,具体处理方法由操作系统决定,若为DOS操作 系统,则显示:Divided overflow 后返回DOS</li>
</ul>
</li>
<li>BCD码调整指令
<ul>
<li>组合/未组合BCD码数(即压缩/未压缩BCD 码数)<br>
<ul>
<li>组合BCD码:一字节中含有2位BCD码 </li>
<li>未组合BCD码:一字节中含有1位BCD码(高4位为0)</li>
<li>注意:1010~1111不是BCD码</li>














</ul>














</li>
<li>BCD码数的加减运算<br>
<ul>
<li>指令系统中没有实现BCD码数加法的指令,只能借用ADD、ADC指令。但是ADD、ADC指令默 认操作数是二进数,其运算法则是“逢二进一” , 而BCD码数加法要求按“逢十进一”运算。</li>
<li>因此借用ADD、ADC指令进行BCD码数的加 法还必须对结果进行修正,修正后的结果才是 BCD码数的和数。</li>














</ul>














</li>














</ul>














</li>














</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112906141-1317618914.png" alt="" width="477" height="178" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<ul>
<li style="list-style-type: none">
<ul>
<li style="list-style-type: none">
<ul>
<li>事实上,N1和N2可以是任意的BCD码数, 借用ADD、ADC运算后必须具体分析运算结果, 然后根据不同的情况选择加06H修正,或是加 60H修正,或是加66H修正。 因此借用ADD、ADC指令进行BCD码数的加 法还必须对结果进行修正,修正后的结果才是 BCD码数的和数。</li>
<li>如果对于每一次BCD码数的加法都要由 程序员来判断结果的话,这太麻烦了,因此 指令系统中设计了一条“组合BCD码数加法 调整指令¾¾DAA”由硬件进行分析,再对 结果进行调整。</li>
<li>上例编程时只需要按以下方式设计程序即可</li>














</ul>














</li>














</ul>














</li>














</ul>
<p>&nbsp;</p>
<p>&nbsp;  <img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030112947759-664446442.png" alt="" width="166" height="63" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>组合BCD码加法调整:DAA
<ul>
<li>功能:默认操作对象为AL,并且根据具体情况对 AL中的高/低4位进行修正。</li>
<li>应用:紧跟在以AL为目标寄存器的ADD/ADC之 后,但AL中必须是组合BCD码数之和。</li>














</ul>














</li>














</ul>














</li>














</ul>
<hr><hr>
<p>&nbsp;</p>
<p>三、&nbsp;转移和调用指令</p>
<ul>
<li>&nbsp;转移类指令分类
<ul>
<li>按照转移条件分:无条件转移和有条件转移 </li>
<li>按照转移范围分:段内转移和段间转移</li>
<li> 按照获取转移地址的方法分: 直接转移和间接转移</li>











</ul>











</li>
<li>无条件转移<br>
<ul>
<li>功能:无条件转移,执行指定标号处的指令</li>











</ul>











</li>











</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030113118924-626210644.png" alt="" width="549" height="201" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>说明: ①标号是转移地址标号。 ②SHORT是短转移,其转移范围相对于指令地址 而言在+129~ -126个单元之间。③段内“JMP 标号”,在实模式下,可转移到64K代码 段的任何位置。</li>











</ul>











</li>
<li>有条件转移</li>











</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030122102119-633381906.png" alt="" width="437" height="105" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<ul>
<li style="list-style-type: none">
<ul>
<li>
<p>按标志位的当前状态转移(设转移地址标号为XYZ)</p>











</li>











</ul>











</li>











</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">JCXYZ       ;当前C标志为1转
JNC XYZ       ;当前C标志为0转
JZXYZ       ;当前Z标志为1转
JNZ XYZ       ;当前Z标志为0转
JCXYZ       ;当前C标志为1转
JNC XYZ       ;当前C标志为0转
JZXYZ       ;当前Z标志为1转
JNZ XYZ       ;当前Z标志为0转</span></pre>
</div>
<ul>
<li style="list-style-type: none">
<ul>
<li>无符号数条件转移(设转移地址标号为XYZ)
<ul>
<li>应用:CMP N1, N2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;N1,N2为无符号数</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="cnblogs_code">
<pre>JAXYZ     ;N1 &gt;<span style="color: rgba(0, 0, 0, 1)"> N2转
JNA XYZ     ;N1≤N2转
JCXYZ     ;N1 </span>&lt;<span style="color: rgba(0, 0, 0, 1)"> N2转
JNC XYZ     ;N1 ≥ N2转</span></pre>
</div>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>&nbsp;有符号数条件转移(设转移地址标号为XYZ)
<ul>
<li>应用:CMP N1,N2; N1,N2 为有符号数(机器数)</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">JGXYZ     ;被减数的真值大于减数的真值转
JGE XYZ     ;被减数的真值大于等于减数的真值转
JLXYZ     ;被减数的真值小于减数的真值转
JLE XYZ     ;被减数的真值小于等于减数的真值转</span></pre>
</div>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>循环控制转移</li>
</ul>
</li>
</ul>
<div class="cnblogs_code">
<pre>LOOP XYZ     ;CX-<span style="color: rgba(128, 0, 128, 1)">1</span>→ CX, 结果不为零转</pre>
</div>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li style="list-style-type: none">
<ul>
<li>注意:循环控制转移,其转移范围相对于指令地址 而言为:-126 ~+129</li>
</ul>
</li>
</ul>
</li>
<li>调用与返回指令<br>
<ul>
<li>★ 调用:调用子程序,即无条件转到子程序的第一条指令 </li>
<li>★ 返回:返回断点,即返回到CALL的后继指令</li>
<li> ★ 子程序:能完成一定功能的相对独立的程序段</li>








</ul>








</li>








</ul>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030122601479-422081285.png" alt="" width="507" height="163" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>汇编语言的子程序(也称为过程)定义语句</li>








</ul>








</li>








</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">过程名   PROC   属性
    子程序实体
      RET
过程名    ENDP</span></pre>
</div>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>&nbsp;说明:
<ul>
<li>过程名,即子程序名,以字母开头,长度≤31 ! 经汇编之后,过程名就是子程序第一条指令的地址。</li>
<li>PROC/ENDP 是子程序的定界语句</li>
<li>属性 有2种描述:1、NEAR(或缺省)代表近过程,即该子程序和调用它的那条指令在同一个代码段;2、FAR 代表远过程,即该子程序和调用它的那条指令不在同一个代码段</li>
<li>RET子程序返回指令</li>
</ul>
</li>
<li>段内调用</li>
</ul>
</li>
</ul>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030122818841-1116714760.png" alt="" width="350" height="87" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li style="list-style-type: none">
<ul>
<li>功能:&nbsp;断口偏移地址→堆栈
<ul>
<li>(SP)←(SP)-2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;←(IP)</li>
</ul>
</li>
<li>子程序入口的偏移地址→IP,从而转子程序</li>
</ul>
</li>
<li>段间调用</li>
</ul>
</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030123003911-1438595016.png" alt="" width="305" height="41" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li style="list-style-type: none">
<ul>
<li>功能: 断口的“段基址:偏移地址”→堆栈
<ul>
<li>首先 (SP)←(SP)-2 [ CS:IP ]←(CS)</li>
<li>然后 (SP)←(SP)-2 [ CS:IP ]←(IP)</li>
</ul>
</li>
<li>子程序入口的“段基址:偏移地址”→CS:IP, 实现段间转移</li>
</ul>
</li>
<li>段内/段间返回指令 RET
<ul>
<li>功能: 有NEAR属性的RET指令,从栈顶弹出2字节→IP</li>
<li>(IP)← (SP)←(SP) + 2</li>
<li>有FAR属性的RET指令,从栈顶弹出4字节→IP,CS</li>
<li>(IP)← (SP)←(SP) + 2</li>
<li>(CS)← (SP)←(SP) + 2</li>
<li>如果栈顶是断口地址,则能返回断点,否则不能</li>
</ul>
</li>
</ul>
</li>
<li>中断调用与中断返回
<ul>
<li>中断调用  INT N (N=0 ~ 255)
<ul>
<li>功能:标志寄存器→ 堆栈</li>
<li>“ INT N ”的后继指令地址“CS:IP”→堆栈 无条件转向N型中断服务程序</li>
</ul>
</li>
<li>中断返回 IRET
<ul>
<li>功能:从栈顶依次弹出6 个元素→ IP,CS,标志寄存器</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr><hr>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>四、逻辑运算</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030123505766-1827999259.png" alt="" width="589" height="213" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030123523228-1100452537.png" alt="" width="515" height="297" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p>说明:移位指令的操作数为R/M, 移位次数可以是立即数或CL&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030123651206-1722502352.png" alt="" width="641" height="411" loading="lazy" style="display: block; margin-left: auto; margin-right: auto">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr><hr>
<p>&nbsp;五、串操作指令</p>
<ul>
<li>串(内存串)的定义: 内存中若干连续的变量(字节,字或双字)</li>
<li>关于串操作指令的总说明
<ul>
<li>80X86有6条串操作指令,它们是串传送、串比较、串搜索、串装入、串存储和I/O串操作,本小节仅介绍前5条。</li>
<li>各种串操作指令虽然功能不同,但有许多共同之处,例如: 源串和目标串的存储及寻址方式都有隐含规定,即:源串要 放在数据段,目标串要放在ES附加段,在16位寻址操作,CPU 自动用SI间址访问数据段,用DI间址访问ES附加段、用CX做 为串计数器。在32位寻址操作下,CPU自动用ESI间址访问数 据段,用EDI间址访问ES附加段,用ECX做串计数器。</li>
<li>由于实模式下逻辑段的最大体积为64K,没有必要使用32 位寻址,为了描述方便,在介绍指令功能的时候,均以16位寻址为基础。</li>
</ul>
</li>
<li>串传送<br>
<ul>
<li>功能:把DS:的若干元素→ ES:的若干单元</li>


</ul>


</li>


</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124330010-293307293.png" alt="" width="407" height="88" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>说明: ①关于“元素”的概念 在字节串传送指令中,一个元素就是1个字节 在字串传送指令中,一个元素为2个字节 在双字串传送指令中,一个元素为4个字节
<ul>
<li>②指令执行前的准备工作: 源串的首地址/末地址→DS:SI 目串的首地址/末地址→ES:DI D标志置0/置1 </li>
<li>③该指令传送一个元素后,CPU自动修改SI,DI 当D标志为0时,SI,DI增量修改 当D标志为1时,SI,DI减量修改</li>


</ul>


</li>


</ul>


</li>


</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124415917-829319043.png" alt="" width="578" height="191" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><em id="__mceDel"><strong><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124459878-191811179.png" alt="" width="350" height="72" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></strong></em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>&nbsp;准备工作:① 同基本型格式 ② 欲传送的元素个数→CX</li>


</ul>


</li>


</ul>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124529044-1177178288.png" alt="" width="516" height="210" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li>串装入</li>


</ul>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124550993-336967665.png" alt="" width="470" height="76" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>准备工作:串首址/末址→DS:SI,0/1 →D标</li>


</ul>


</li>
<li>串存储&nbsp;</li>


</ul>
<p>&nbsp;</p>
<p class="_mce_tagged_br"><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124649317-1448871167.png" alt="" width="463" height="103" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li class="_mce_tagged_br">准备工作:目标区首址/末址→ES:DI,0/1 →D标</li>


</ul>


</li>


</ul>
<p class="_mce_tagged_br">&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124720363-1482191209.png" alt="" width="204" height="103" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>准备工作:同基本型;欲存储的元素个数→CX</li>
<li>功能:每存储一个元素,自动修改DI, 且CX-1→CX, CX=0时止</li>


</ul>


</li>
<li>串比较
<ul>
<li>比较两串字符是否相等。两串字符对应字符相等,则两串字符相等,有一个字符不等,则两串字符不等</li>


</ul>


</li>


</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124828871-928733982.png" alt="" width="263" height="108" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>准备工作:源串首址/末址→DS:SI;目串首址/末址→ES:DI ,0/1 →D标</li>


</ul>


</li>


</ul>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124850375-619740429.png" alt="" width="370" height="438" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124904732-1155794682.png" alt="" width="220" height="208" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>准备工作:同基本型;串元素的个数→ CX</li>


</ul>


</li>


</ul>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030124928478-901866300.png" alt="" width="706" height="438" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>Z标志在具有REPE/REPNE的串指令中的实际使用: 通过Z的取值(Z=0或Z=1)可以判断重复进行 的串指令是否正常退出,以便进行下一步处理。</li>


</ul>


</li>
<li>串搜索
<ul>
<li>在ES:的目标区,搜索是否有规定的“关键字”  </li>


</ul>


</li>


</ul>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030125028821-321196418.png" alt="" width="178" height="88" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<ul>
<li style="list-style-type: none">
<ul>
<li>准备:目标区首址/未址→ES:DI, 0/1 →D标;关键字→AL/AX/EAX。</li>
<li>功能:比较AL/AX/EAX=ES:? 修改DI
<ul>
<li>&nbsp;若ES:[改前DI]=关键字,则Z置1,否则Z置0</li>


</ul>


</li>


</ul>


</li>


</ul>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030125142648-1189616735.png" alt="" width="415" height="374" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030125154419-1678315618.png" alt="" width="434" height="188" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none">
<ul>
<li>准备工作:同基本型;目标串元素的个数→ CX&nbsp;</li>


</ul>


</li>


</ul>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2531609/202110/2531609-20211030125225526-1173175233.png" alt="" width="704" height="438" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p>
<hr><hr>
<p>&nbsp;</p>
<p>六、&nbsp;处理机控制指令</p>
<ul>
<li>C标置0 CLC
</li>
<li>C标置1 STC
</li>
<li>C标取反 CMC
</li>
<li>D标置0 CLD</li>
<li>D标置1 STD
</li>
<li>I标置0 CLI
</li>
<li>I标置1 STI
</li>
<li>空操作 NOP
</li>
<li>暂停 HLT</li>
</ul>
<hr><hr><br><br>
来源:https://www.cnblogs.com/taking/p/15439845.html
頁: [1]
查看完整版本: 汇编语言学习笔记(4)——汇编基本指令集