汇编语言程序结构--分支&循环
<p>程序有顺序、循环、分支、子程序四种结构形式。顺序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,但作为完整的程序则很少见,因此在本文不做讨论。<br><br></p>
<p><img src="https://img2020.cnblogs.com/blog/2021750/202006/2021750-20200622113337359-55018414.jpg" alt="" loading="lazy"></p>
<br>
<h3 id="分支程序设计">分支程序设计</h3>
<hr>
<p>计算机程序在执行过程中,可以改变程序的执行顺序,根据一定的条件进行转移,使程序完成更复杂的功能。汇编语言提供了无条件转移指令和条件转移指令。</p>
<ul>
<li>分支程序根据条件是真或假决定执行不同的程序段</li>
<li>判断的条件是各种指令,如CMP、TEST等执行后寄存器中的状态位</li>
<li>通过转移指令可以实现分支控制</li>
</ul>
<br>
<p><img src="https://img2020.cnblogs.com/blog/2021750/202006/2021750-20200622113400328-1466381577.jpg" alt="" loading="lazy"></p>
<br>
<p><strong>单分支结构</strong></p>
<p>例:<br>
START: MOV AX,DATA<br>
MOV DS,AX<br>
LEA SI,BUF<br>
MOV AL,<br>
CMP AL,<br>
JNB NEXT ;如果X1不小于X2,则转到NEXT<br>
MOV AL, ;如果X1小于X2,则将A2送给AL<br>
NEXT: CMP AL,<br>
JNB NEXT1<br>
MOVAL,<br>
NEXT1: MOV Y,AL<br>
MOVAH,4CH<br>
INT 21H<br>
CODE ENDS<br>
ENDSTART</p>
<br>
<p><strong>跳跃表法</strong></p>
<p>根据不同的条件跳转到多个分支之一执行,将各个分支的地址存放在连续的数据区,称为跳跃表。</p>
<br>
<h2 id="循环程序的组成">循环程序的组成</h2>
<hr>
<p>例:将ARRAY数组中的50个数求和,并将和存入字变量S中。<br>
MOV AX,0 ;累加求和寄存器清0<br>
MOVBX,OFFSET ARRA Y ; 数组始址送BX中<br>
MOVCX,50 ;循环控制计数初始化<br>
AGAIN : ADDAX,<br>
ADDBX,2 ;数组地址增2,BX指向下一个元素<br>
DECCX ;循环控制计数减1<br>
JNZAGAIN ;计数不为0时继续循环<br>
MOVS,AX ;计数为0时循环结束,和存于S中</p>
<p>保证循环正常执行和结束的条件:<br>
➊正确地初始化循环控制计数和初始条件<br>
❷正确地检测循环条件<br>
❸必须保证能达到循环结束条件(例如在循环体内有修改循环控制值的指令)</p>
<br>
<p>一个循环程序通常由四部分构成:</p>
<p>(1)初始化部分<br>
建立循环初始值。如初始化地址指针,计数器,其他循环参数的起始值等。</p>
<p>(2)工作部分<br>
它是循环程序的这主要部分,是为完成某种特定功能而设计的程序段。</p>
<p>(3)修改部分</p>
<p>为保证正确的循环而修改某些参数。如修改计数器的值、操作数地址等。</p>
<p>(4)控制部分</p>
<p>判断循环结束条件是否成立。</p>
<p>通常判断循环是否结束的办法有两种:<br>
①用计数控制循环:循环是否已进行预定次数,它适用于已知循环次数的循环程序设计;<br>
②用条件控制循环:循环终止条件是否已成立, .它适用于未知循环次数的循环程序设计。</p>
<br>
<h2 id="循环指令">循环指令</h2>
<hr>
<p><strong>跳转指令</strong></p>
<p>jmp</p>
<p>格式:Jump short 标号</p>
<p>jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP; jmp指令要给出两种信息:转移的地址,转移的距离(段间转移、段内短转移,段内近转移)</p>
<p>其他跳转指令:</p>
<center>
<img src="https://img2020.cnblogs.com/blog/2021750/202006/2021750-20200615102124570-983809653.jpg" width="70%" height="70%">
</center>
<br>
<p><strong>LOOP 重复控制</strong></p>
<p>格式: LOOP OPR<br>
执行的操作: (CX) ←(CX)-1。 若CX≠0,跳转到标号OPR处循环执行;若CX=0,则退出循环,执行LOOP的下一条指令。</p>
<center>
<img src="https://img2020.cnblogs.com/blog/2021750/202006/2021750-20200615102201638-1952073164.jpg" width="70%" height="70%">
</center>
<br>
<p><strong>LOOPZ/LOOPE 条件重复控制</strong></p>
<p>格式: LOOPZ/LOOPE OPR</p>
<p>执行的操作: (CX) = (CX)-1。 若CX≠0,并且ZF=1,则跳转到标号OPR处循环执行; 若CX=0,或者ZF=0,则执行下一条指令。</p>
<center>
<img src="https://img2020.cnblogs.com/blog/2021750/202006/2021750-20200615101725842-1204604553.jpg" width="70%" height="70%">
</center>
<br>
<p><strong>LOOPNE/L OOPNZ 条件重复控制</strong></p>
<p>格式: LOOPNE/LOOPNZ shortlabel</p>
<p>操作:计数寄存器CX减1,如果零状态标志位ZF=0且CX≠0时,转向shortlabel指定循环入口执行,如果ZF=1或CX=0则执行后续指令。</p>
<center>
<img src="https://img2020.cnblogs.com/blog/2021750/202006/2021750-20200615101755448-846553079.jpg" width="70%" height="70%">
</center><br><br>
来源:https://www.cnblogs.com/axxio/p/13129459.html
頁:
[1]