夷老永宜 發表於 2021-11-8 11:49:00

汇编语言期末复习——第四章 程序结构

<p><span style="font-size: 18px">一、顺序程序结构</span></p>
<ol>
<li>程序的静态分析  略</li>
<li>程序的动态分析  略</li>
<li>实例:读取CMOS RAM数据程序&nbsp; &nbsp; 略</li>
</ol>
<p><span style="font-size: 18px">二、分支程序结构</span></p>
<ol>
<li>无条件转移指令<ol>
<li>代码段寄存器CS指出代码段的段基地址,指令指针IP给出将要执行的偏移地址</li>
<li>转移范围<ol>
<li>段内转移——只改变IP&nbsp;&nbsp;<ol>
<li>段内转移也称近转移(NEAR)</li>
<li>如果转移范围可以用1字节编码表达,即向地址增大方向转移127字节,向地址减小方向转移128字节,形成短转移(SHORT)</li>
</ol></li>
<li>段间转移——更改CS和IP<ol>
<li>也称远转移(FAR)</li>
</ol></li>
</ol></li>
<li>指令寻址方式<ol>
<li>相对寻址方式
<ul>
<li>提供目标地址相对于当前指令指针IP的位移量</li>
<li>目标地址(转移后的IP)=当前IP+位移量</li>
</ul>
</li>
<li>直接寻址方式
<ul>
<li>直接提供目标地址</li>
<li>目标地址(转移后的CS和IP)=指令操作数</li>
</ul>
</li>
<li>间接寻址方式
<ul>
<li>指示寄存器或存储单元</li>
<li>目标地址来自寄存器或存储单元,间接获得</li>
</ul>
</li>
<li>注:目标地址=目的地址=转移地址</li>
</ol></li>
<li>JMP指令<ol>
<li>四种类型<ol>
<li>段内转移,相对寻址
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">JMP</span> LABLE    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">IP=IP+位移量</span></pre>
</div>
<p>&nbsp;</p>
</li>
<li>段内转移,间接寻址
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">JMP</span> R16    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">IP=R16   寄存器间接寻址   </span>
<span style="color: rgba(0, 0, 255, 1)">JMP</span> M16    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">IP=M16存储器间接寻址</span></pre>
</div>
<p>&nbsp;</p>
</li>
<li>段间转移,直接寻址
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">JMP</span> LABLE    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">IP=LABLE的偏移地址,CS=LABLE的段选择器</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
</li>
<li>段间转移,间接寻址
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">JMP</span> M32    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">IP=M32,CS=M32+2</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ol></li>
<li>MASM会根据存储模型和目标地址等信息自动识别是哪种转移。<ol>
<li>汇编程序提供了操作符:
<ul>
<li>SHORT</li>
<li>NEAR PTR&nbsp;</li>
<li>FAR PTR</li>
<li>可以强制转换一个符号、段名或子程序名的类型,形成相应的控制转移。</li>
</ul>
</li>
</ol></li>
<li>实例:
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg403.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
nvar    dw ?
fvar    dd ?
    .code
    .startup
</span><span style="color: rgba(0, 128, 128, 1)">labl0:</span>    <span style="color: rgba(0, 0, 255, 1)">jmp</span> labl1             <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内(短)转移、相对寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl1:</span>    <span style="color: rgba(0, 0, 255, 1)">jmp</span> near ptr labl2    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内(近)转移、相对寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl2:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,offset labl3
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> ax                      <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内转移、寄存器间接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl3:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,offset labl4
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> nvar,ax
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> nvar                  <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内转移、存储器间接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl4:</span>    <span style="color: rgba(0, 0, 255, 1)">jmp</span> far ptr labl5   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段间转移、直接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl5:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,offset labl6
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> word ptr fvar,ax
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,seg labl6
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> word ptr fvar+<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">,dx
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> fvar                  <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段间转移、间接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl6:</span><span style="color: rgba(0, 0, 0, 1)">   
    .exit
    end</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ol></li>
</ol></li>
<li>条件转移指令<ol>
<li>格式及说明
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">JCC LABEL
</span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">条件满足,发生转移;</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">否则顺序执行下条指令</span></pre>
</div>
<p>&nbsp;</p>
</li>
<li>LABEL表示目标地址,采用段内相对寻址(只能是-128~127之间的短转移)</li>
<li>条件转移指令不影响标志,但要利用标志。</li>
<li>16种,两类标志判断如下:
<ul>
<li>单个标志状态作为条件</li>
<li>两数大小关系作为条件</li>
</ul>
</li>
<li><img src="https://img2020.cnblogs.com/blog/2004273/202111/2004273-20211107181729221-1950635993.jpg" alt="" width="1127" height="632" loading="lazy">
<p>&nbsp;</p>
<p>&nbsp;</p>
</li>
</ul>
</li>
<li>实例!开始疯狂上代码!
<ul>
<li>个数折半(如果是奇数就加一,如果是偶数直接显示)
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">    mov</span> ax,<span style="color: rgba(128, 0, 128, 1)">885</span>             <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">假设一个数据</span>
    <span style="color: rgba(255, 0, 0, 1)">shr ax,1               ;数据右移进行折半
    jnc goeven             ;余数为0,即CF=0条件成立,不需要处理,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span> ax,<span style="color: rgba(128, 0, 128, 1)">1</span>               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">否则余数为1,即CF=1,进行加1操作</span>
<span style="color: rgba(0, 128, 128, 1)">goeven:</span>    <span style="color: rgba(0, 0, 255, 1)">call</span> dispuiw    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示结果</span></pre>
</div>
</li>
<li>上述代码可以利用ADC优化成:
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">    mov</span> ax,<span style="color: rgba(128, 0, 128, 1)">887</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">假设一个数据</span>
    <span style="color: rgba(0, 0, 255, 1)">shr</span> ax,<span style="color: rgba(128, 0, 128, 1)">1</span>      <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数据右移进行折半</span>
    <span style="color: rgba(255, 0, 0, 1)">adc ax,0      ;余数=CF=1,进行加1操作;余数=CF=0,没有加1</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> dispuiw<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示结果</span></pre>
</div>
</li>
</ul>
</li>
<li>
<p>位测试程序(如果AL的D1=1 显示“READY TO" GO! D1=0显示”NOT READY")</p>
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">    .data
no_msg   db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Not Ready!</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
yes_msg    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Ready to Go!</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> al,56h               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">假设一个数据</span>
    <span style="color: rgba(255, 0, 0, 1)">test al,02h            ;测试D1位(使用D1=1,其他位为0的数据)</span>
    <span style="color: rgba(0, 0, 255, 1)">jz</span> nom                   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">D1=0条件成立,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset yes_msg    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">D1=1,显示准备好</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> done               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">跳转过另一个分支体!</span>
<span style="color: rgba(0, 128, 128, 1)">nom:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset no_msg <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示没有准备好</span>
<span style="color: rgba(0, 128, 128, 1)">done:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h<br></span></pre>
</div>
</li>
</ul>
</li>
<li>奇偶校验程序(在字符的ASC码中的1的个数为奇数令校验位为0)程序实现在ASC码的最高位加上校验位
<ul>
<li>
<div class="cnblogs_code">
<pre>Tdata    db ?            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">保存待发送数据的变量</span>

    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">1</span>             <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">1号功能</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">键盘输入</span>
    <span style="color: rgba(0, 0, 255, 1)">and</span> al,7fh         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">最高位置“0”、其他位不变,同时标志PF反映“1”的个数</span>
    <span style="color: rgba(0, 0, 255, 1)">jnp</span> next             <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">个数为奇数,则转向NEXT</span>
    <span style="color: rgba(0, 0, 255, 1)">or</span> al,80h            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">最高位置“1”、其他位不变 </span>
<span style="color: rgba(0, 128, 128, 1)">next:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> Tdata,al    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">保存待发送的数据</span></pre>
</div>
</li>
</ul>
</li>
<li>
<p>数据大小比较程序(相等显示“EQUAL”,第一个数大显示“FIRST”,第二个数大显示“SECOND”)</p>
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg407.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
var1    dw -</span><span style="color: rgba(128, 0, 128, 1)">3765</span><span style="color: rgba(0, 0, 0, 1)">
var2    dw </span><span style="color: rgba(128, 0, 128, 1)">8930</span><span style="color: rgba(0, 0, 0, 1)">
msg0    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Equal$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
msg1    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">First$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
msg2    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Second$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ax,var1         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">取第1个数据</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span> ax,var2         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">与第2个数据比较</span>
    <span style="color: rgba(0, 0, 255, 1)">je</span> equal            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">两数相等,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">jnl</span> first             <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">第1个数据大,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset msg2    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">第2个数据大</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> done
</span><span style="color: rgba(0, 128, 128, 1)">first:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset msg1
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> done
</span><span style="color: rgba(0, 128, 128, 1)">equal:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset msg0
</span><span style="color: rgba(0, 128, 128, 1)">done:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示结果</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    .exit
    end</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
</li>
</ul>
</li>
</ul>
</li>
</ol></li>
<li>单分支<ol>
<li style="list-style-type: none">
<ul>
<li>求绝对值
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg408.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
var    dw 0b422h             </span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">有符号数据</span>
result    dw ?               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">保存绝对值</span>
<span style="color: rgba(0, 0, 0, 1)">    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,var
    </span><span style="color: rgba(0, 0, 255, 1)">cmp</span> ax,<span style="color: rgba(128, 0, 128, 1)">0</span>               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">比较AX与0</span>
    <span style="color: rgba(0, 0, 255, 1)">jge</span> nonneg               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">条件满足:AX≥0,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">neg</span> ax                   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">条件不满足:AX<0,为负数,需求补得正值</span>
<span style="color: rgba(0, 128, 128, 1)">nonneg:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> result,ax   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">分支结束,保存结果</span>
<span style="color: rgba(0, 0, 0, 1)">    .exit
    end</span></pre>
</div>
</li>
</ul>
</li>
<li>
<p>字母判断程序</p>
<ul>
<li>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">1</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h       <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">输入一个字符,从AL返回值</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span> al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">A</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">与大写字母A比较</span>
    <span style="color: rgba(0, 0, 255, 1)">jb</span> done       <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">比大写字母A小,不是大写字母,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span> al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Z</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">与大写字母Z比较</span>
    <span style="color: rgba(0, 0, 255, 1)">ja</span> done       <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">比大写字母Z大,不是大写字母,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">or</span> al,20h   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">转换为小写</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dl,al
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h       <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示小写字母</span>
<span style="color: rgba(0, 128, 128, 1)">done:</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ul>
</li>
</ul>
</li>
</ol></li>
<li>双分支程序<ol>
<li style="list-style-type: none">
<ul>
<li>显示数据最高位
<ul>
<li>
<div class="cnblogs_code">
<pre>var    dw 0b422h   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">有符号数据</span>

    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> bx,var
    </span><span style="color: rgba(0, 0, 255, 1)">shl</span> bx,<span style="color: rgba(128, 0, 128, 1)">1</span>         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BX最高位移入CF标志</span>
    <span style="color: rgba(0, 0, 255, 1)">jc</span> one         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">CF=1,即最高位为1,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>       <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">CF=0,即最高位为0:DL←'0'</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> two          <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">一定要跳过另一个分支体</span>
<span style="color: rgba(0, 128, 128, 1)">one:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">'</span>   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">DL←'1'</span>
<span style="color: rgba(0, 128, 128, 1)">two:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h          <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示</span></pre>
</div>
<p>&nbsp;可以使用ADC消除分支:</p>
</li>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">XOR</span><span style="color: rgba(0, 0, 0, 1)"> DL,DL
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> bx,var
    </span><span style="color: rgba(0, 0, 255, 1)">shl</span> bx,<span style="color: rgba(128, 0, 128, 1)">1</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BX最高位移入CF标志</span>
    <span style="color: rgba(0, 0, 255, 1)">adc</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h   <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示</span></pre>
</div>
</li>
</ul>
</li>
<li>有符号数运算溢出程序
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg411.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
var1    dw </span><span style="color: rgba(128, 0, 128, 1)">24680</span><span style="color: rgba(0, 0, 0, 1)">
var2    dw -</span><span style="color: rgba(128, 0, 128, 1)">9999</span><span style="color: rgba(0, 0, 0, 1)">
var3    dw ?
okmsg    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Correct!</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">正确信息</span>
errmsg    db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ERROR ! Overflow!</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">错误信息</span>
<span style="color: rgba(0, 0, 0, 1)">    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,var1
    </span><span style="color: rgba(0, 0, 255, 1)">sub</span> ax,var2               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">求差</span>
    <span style="color: rgba(0, 0, 255, 1)">jo</span> error                  <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">有溢出,转移</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> var3,ax               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">无溢出,保存差值</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset okmsg         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示正确</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> disp
</span><span style="color: rgba(0, 128, 128, 1)">error:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset errmsg<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示错误</span>
<span style="color: rgba(0, 128, 128, 1)">disp:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    .exit
    end</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ul>
</li>
</ul>
</li>
</ol></li>
<li>多分支程序&nbsp;
<ul>
<li>可以使用表结构实现多分支</li>
</ul>
</li>
</ol>
<p><span style="font-size: 18px">三、循环程序结构</span></p>
<ol>
<li>循环指令
<ul>
<li>LOOP LABEL
<ul>
<li>CX=CX-1 如果CX不等于0,循环到label,否则顺序执行</li>
</ul>
</li>
<li>JCXZ LABEL
<ul>
<li>CX=0转移,否则顺序执行</li>
</ul>
</li>
<li>目标地址采用相对短转移</li>
<li>使用CX作为计数器
<ul>
<li>如果CX=0将循环pow(2,16)次发生错误</li>
<li>此时可以使用JCXZ先判断CX是否为零</li>
</ul>
</li>
<li>实例:数组求和程序
<ul>
<li>
<div class="cnblogs_code">
<pre>ARRAYDW<span style="color: rgba(128, 0, 128, 1)">136</span>,-<span style="color: rgba(128, 0, 128, 1)">138</span>,<span style="color: rgba(128, 0, 128, 1)">133</span>,<span style="color: rgba(128, 0, 128, 1)">130</span>,-<span style="color: rgba(128, 0, 128, 1)">161</span><span style="color: rgba(0, 0, 0, 1)">
SUMDW?

</span><span style="color: rgba(0, 0, 255, 1)">XOR</span><span style="color: rgba(0, 0, 0, 1)"> AX,AX
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> CX,LENGTHOF ARRAY
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> BX,OFFSET ARRAY
</span><span style="color: rgba(0, 128, 128, 1)">AGAIN:</span><span style="color: rgba(0, 0, 255, 1)">ADD</span><span style="color: rgba(0, 0, 0, 1)"> AX,ARRAY
</span><span style="color: rgba(0, 0, 255, 1)">ADD</span><span style="color: rgba(0, 0, 0, 1)"> BX,TYPE ARRAY
LOOP AGAIN
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span> SUM,AX</pre>
</div>
</li>
</ul>
</li>
</ul>
</li>
<li>计数控制循环
<ul>
<li>求最大值程序
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg414.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
array    dw -</span><span style="color: rgba(128, 0, 128, 1)">3</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">20</span>,<span style="color: rgba(128, 0, 128, 1)">900</span>,<span style="color: rgba(128, 0, 128, 1)">587</span>,-<span style="color: rgba(128, 0, 128, 1)">632</span>,<span style="color: rgba(128, 0, 128, 1)">777</span>,<span style="color: rgba(128, 0, 128, 1)">234</span>,-<span style="color: rgba(128, 0, 128, 1)">34</span>,-<span style="color: rgba(128, 0, 128, 1)">56</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">假设一个数组</span>
count    = lengthof array    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数组的元素个数</span>
max    dw ?    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">存放最大值</span>
<span style="color: rgba(0, 0, 0, 1)">    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> cx,count-<span style="color: rgba(128, 0, 128, 1)">1</span>         <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">元素个数减1是循环次数</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> si,offset array
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ax,            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">取出第一个元素给AX,用于暂存最大值</span>
<span style="color: rgba(0, 128, 128, 1)">again:</span>    <span style="color: rgba(0, 0, 255, 1)">add</span> si,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span> ax,            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">与下一个数据比较</span>
    <span style="color: rgba(0, 0, 255, 1)">jge</span> next               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">已经是较大值,继续下一个循环比较</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ax,            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX取得更大的数据</span>
<span style="color: rgba(0, 128, 128, 1)">next:</span>    loop again          <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">计数循环</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> max,ax               <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">保存最大值</span>
<span style="color: rgba(0, 0, 0, 1)">    .exit
    end</span></pre>
</div>
</li>
</ul>
</li>
<li>简单的加密解密程序
<ul>
<li style="list-style-type: none">
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg415.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
key    db </span><span style="color: rgba(128, 0, 128, 1)">234</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">假设的一个密钥</span>
buffer    db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">This is a secret.</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">待加密的信息(字符串)</span>
count    = sizeof buffer-<span style="color: rgba(128, 0, 128, 1)">1</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">不处理最后结尾字符</span>
msg1    db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Encrypted message: </span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
msg2    db </span><span style="color: rgba(128, 0, 128, 1)">13</span>,<span style="color: rgba(128, 0, 128, 1)">10</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Original messge: </span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> cx,count    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">CX=字符个数,作为循环的次数</span>
    <span style="color: rgba(0, 0, 255, 1)">xor</span> bx,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BX指向待处理的字符</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> al,key    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=密钥</span>
<span style="color: rgba(0, 128, 128, 1)">encrypt:</span>    <span style="color: rgba(0, 0, 255, 1)">xor</span> buffer,al    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">异或加密</span>
    <span style="color: rgba(0, 0, 255, 1)">inc</span> bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">指向下一个字符</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span><span style="color: rgba(0, 0, 0, 1)"> bx,cx
    </span><span style="color: rgba(0, 0, 255, 1)">jb</span> encrypt    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">没有指向最后字符,继续处理</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset msg1    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示提示信息</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset buffer    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示加密后的密文</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 128, 0, 1)">;
</span>    <span style="color: rgba(0, 0, 255, 1)">xor</span> bx,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BX指向待处理的字符</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> al,key    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=密钥</span>
<span style="color: rgba(0, 128, 128, 1)">decrypt:</span>    <span style="color: rgba(0, 0, 255, 1)">xor</span> buffer,al    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">异或解密</span>
    <span style="color: rgba(0, 0, 255, 1)">inc</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">dec</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">jnz</span> decrypt    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">等同于指令:loop decrypt</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset msg2
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset buffer    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示解密后的明文</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    .exit

    end</span></pre>
</div>
<p>&nbsp;  </p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>条件控制循环
<ul>
<li>字符个数统计(统计以0结尾的字符串中的字符个数)
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg416a.asm</span>
include io.<span style="color: rgba(0, 0, 255, 1)">inc</span><span style="color: rgba(0, 0, 0, 1)">
    .model small
    .stack
    .data
string    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Do you have fun with Assembly?</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">以0结尾的字符串</span>
<span style="color: rgba(0, 0, 0, 1)">    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">xor</span> bx,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BX用于记录字符个数,同时也用于指向字符的指针</span>
<span style="color: rgba(0, 128, 128, 1)">again:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> al,string
    </span><span style="color: rgba(0, 0, 255, 1)">cmp</span> al,<span style="color: rgba(128, 0, 128, 1)">0</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">也可以使用指令“test al,al”</span>
    <span style="color: rgba(0, 0, 255, 1)">jz</span><span style="color: rgba(0, 0, 0, 1)"> done
    </span><span style="color: rgba(0, 0, 255, 1)">inc</span> bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">个数加1</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> again    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">继续循环</span>
<span style="color: rgba(0, 128, 128, 1)">done:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ax,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示个数</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span><span style="color: rgba(0, 0, 0, 1)"> dispuiw
    .exit
    end</span></pre>
</div>
</li>
</ul>
</li>
<li>斐波那契
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg417a.asm</span>
include io.<span style="color: rgba(0, 0, 255, 1)">inc</span><span style="color: rgba(0, 0, 0, 1)">
    .model small
    .stack
    .data

    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ax,<span style="color: rgba(128, 0, 128, 1)">1</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=F(1)=1</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> dispuiw    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示第1个数</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> dispcrlf    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">回车换行</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> dispuiw    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示第2个数</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> dispcrlf    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">回车换行</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> bx,ax    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BX=F(2)=1</span>
<span style="color: rgba(0, 128, 128, 1)">again:</span>    <span style="color: rgba(0, 0, 255, 1)">add</span> ax,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=F(N)=F(N-2)+F(N-1)</span>
    <span style="color: rgba(0, 0, 255, 1)">jc</span><span style="color: rgba(0, 0, 0, 1)"> done
    </span><span style="color: rgba(0, 0, 255, 1)">call</span> dispuiw    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示一个数</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> dispcrlf    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">回车换行</span>
    <span style="color: rgba(0, 0, 255, 1)">xchg</span> ax,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=F(N-2),BX=F(N-1)</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> again
</span><span style="color: rgba(0, 128, 128, 1)">done:</span><span style="color: rgba(0, 0, 0, 1)">
    .exit
    end</span></pre>
</div>
</li>
</ul>
</li>
</ul>
</li>
<li>多重循环    
<ul>
<li>冒泡排序
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg418.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
array    dw </span><span style="color: rgba(128, 0, 128, 1)">587</span>,-<span style="color: rgba(128, 0, 128, 1)">632</span>,<span style="color: rgba(128, 0, 128, 1)">777</span>,<span style="color: rgba(128, 0, 128, 1)">234</span>,-<span style="color: rgba(128, 0, 128, 1)">34</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">假设一个数组</span>
count    = lengthof array    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数组的元素个数</span>
<span style="color: rgba(0, 0, 0, 1)">    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> cx,count    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">CX←数组元素个数</span>
    <span style="color: rgba(0, 0, 255, 1)">dec</span> cx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">元素个数减1为外循环次数</span>
<span style="color: rgba(0, 128, 128, 1)">outlp:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,cx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">DX←内循环次数</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> bx,offset array
</span><span style="color: rgba(0, 128, 128, 1)">inlp:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ax,    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">取前一个元素</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span> ax,    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">与后一个元素比较</span>
    <span style="color: rgba(0, 0, 255, 1)">jng</span><span style="color: rgba(0, 0, 0, 1)"> next
    </span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">前一个不大于后一个元素,则不进行交换</span>
    <span style="color: rgba(0, 0, 255, 1)">xchg</span> ax,    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">否则,进行交换</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ,ax
</span><span style="color: rgba(0, 128, 128, 1)">next:</span>    <span style="color: rgba(0, 0, 255, 1)">inc</span> bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">下一对元素</span>
    <span style="color: rgba(0, 0, 255, 1)">dec</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">jnz</span> inlp    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">内循环尾</span>
    loop outlp    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">外循环尾</span>
<span style="color: rgba(0, 0, 0, 1)">    .exit

    end</span></pre>
</div>
</li>
</ul>
</li>
<li>字符剔除(剔除空格
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg419.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
string    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Let us have a try !</span><span style="color: rgba(128, 0, 0, 1)">'</span>,0dh,0ah,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">以“$”结尾的字符串</span>
<span style="color: rgba(0, 0, 0, 1)">    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset string    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示处理前的字符串</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> si,offset string
</span><span style="color: rgba(0, 128, 128, 1)">outlp:</span>    <span style="color: rgba(0, 0, 255, 1)">cmp</span> byte ptr ,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">外循环,先判断后循环</span>
    <span style="color: rgba(0, 0, 255, 1)">jz</span> done    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">为“$”结束</span>
<span style="color: rgba(0, 128, 128, 1)">again:</span>    <span style="color: rgba(0, 0, 255, 1)">cmp</span> byte ptr ,<span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">检测是否是空格</span>
    <span style="color: rgba(0, 0, 255, 1)">jnz</span> next    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">不是空格继续循环</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> di,si    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">是空格,进入剔除空格分支</span>
<span style="color: rgba(0, 128, 128, 1)">inlp:</span>    <span style="color: rgba(0, 0, 255, 1)">inc</span> di    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">该分支是循环程序</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> al,    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">前移一个位置</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ,al
    </span><span style="color: rgba(0, 0, 255, 1)">cmp</span> byte ptr ,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">内循环,先循环后判断</span>
    <span style="color: rgba(0, 0, 255, 1)">jnz</span> inlp    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">内循环结束处</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> again    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">再次判断是否为空格(处理连续空格情况)</span>
<span style="color: rgba(0, 128, 128, 1)">next:</span>    <span style="color: rgba(0, 0, 255, 1)">inc</span> si    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">继续对后续字符进行判断处理</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> outlp    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">外循环结束处</span>
<span style="color: rgba(0, 128, 128, 1)">done:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset string    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示处理后的字符串</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    .exit

    end</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ul>
</li>
</ul>
</li>
<li>串操作指令<ol>
<li>以字节、字和双字为单位多个数据存放在连续的主存区形成数据串,(也就是数组)</li>
<li>特殊的寻址方式:
<ul>
<li>源操作数用寄存器SI间接寻址,默认在数据段DS中,即DS:,允许段超越</li>
<li>目的操作数用寄存器DI间接寻址,默认在附加段ES中,即ES:,不允许段超越</li>
<li>每执行一次串操作源指针SI和目的指针DI自动±1或±2</li>
<li>CLD设置方向标志DF=0 指针增加</li>
<li>STD设置方向标志DF=1 指针减小</li>
</ul>
</li>
<li>串传送<ol>
<li>传送 MOVS&nbsp;
<ul>
<li>MOVSB&nbsp; ES: ← DS:&nbsp; SI++,DI++</li>
<li>MOVSW&nbsp;&nbsp;ES: ← DS:&nbsp; SI+=2,DI+=2</li>
</ul>
</li>
<li>存储 STOS
<ul>
<li>STOSB&nbsp; ES:←AL&nbsp; DI++</li>
<li>STOSW ES:←AX&nbsp; DI+=</li>
</ul>
</li>
<li>读取 LODS
<ul>
<li>AL←DS:&nbsp; SI++</li>
<li>AX←DS: SI+=2</li>
</ul>
</li>
<li>重复REP&nbsp; 计数器也是CX</li>
</ol></li>
</ol></li>
</ol>
<p><span style="font-size: 18px">四、习题</span></p>
<p>4.1(2)数据的直接寻址和指令的直接寻址有什么区别?</p>
<p>    数据的直接寻址直接给偏移地址(变量名/有效地址)</p>
<p>    指令的直接寻址使用段内转移相对量(标号)</p>
<p>  (5)什么是奇偶校验?</p>
<p>    包括校验位在内的数据为为“1”的个数为奇数是奇校验。</p>
<p>  (6)助记符JZ和JE为什么表达同一条指令?</p>
<p>    JZ为两个数相减差值为零,JE为两个数相等。</p>
<p>  (9)如果循环体的代码量远超过128字节,还能用LOOP指令实现计数控制循环吗?</p>
<p>    短转移前后不能超过128字节。</p>
<p>  (10)什么是“先循环、后判断”循环结构?</p>
<p>    先执行一遍循环体。</p>
<p>4.2 判断题</p>
<p>  (2)指令的相对寻址都是段内转移。</p>
<p>    对。</p>
<p>  (4)JMP指令对应高级语言的GOTO语句,所以不能使用。</p>
<p>    错,可以使用。</p>
<p>  (6)JA和JG指令的条件都是“大于”,所以是同一个指令的两个助记符。</p>
<p>    错。JA判断无符号数JG判断有符号数。</p>
<p>  (7)JC和JB指令的判断条件都是CF=1,所以是同一条指令。</p>
<p>    错。JC前有可能是移位,JB必须是有减法操作才能判断。</p>
<p>  (10)若CX=0,则LOOP指令和JCXZ指令都发生转移。</p>
<p>    对,而且LOOP会执行pow(2,16)次。</p>
<p>4.3填空题</p>
<p>  (2)MASM给短转移、近转移、和远转移定义的类型名依次是<span style="text-decoration: underline">&nbsp; &nbsp;SHORT&nbsp;</span>、<span style="text-decoration: underline">&nbsp; &nbsp;NEAR&nbsp;&nbsp;</span>、<span style="text-decoration: underline">&nbsp; &nbsp;FAR&nbsp;</span>&nbsp;。</p>
<p>  (3)假设BX=1256H,字变量TABLE的偏移地址是20A1H,数据段偏移地址32F7H处存放3280H,执行指令“JMP BX"后IP=<span style="text-decoration: underline">&nbsp; &nbsp; 1256H&nbsp; &nbsp;</span>,执行指令”JMP TABLE“后IP=<span style="text-decoration: underline">&nbsp; 3280H&nbsp; </span>&nbsp;。</p>
<p>  (4)"CMP AX,3721H"指令之后是JZ指令,发生转移的条件是AX=<span style="text-decoration: underline">&nbsp; &nbsp;3271H&nbsp;&nbsp;</span>,此时ZF=&nbsp;<span style="text-decoration: underline">&nbsp; &nbsp;1&nbsp; &nbsp;</span>。</p>
<p>  (5)执行""SHR BX,1"指令后,JNC发生转移,说明BX的D0=&nbsp;<span style="text-decoration: underline">&nbsp; &nbsp;0&nbsp; &nbsp;</span>。</p>
<p>  (6)在DX等于0时转移,可以使用指令“CMP DX,&nbsp;<span style="text-decoration: underline">&nbsp; &nbsp; 0&nbsp; &nbsp; ",</span>也可以使用"TEST DX,&nbsp;<span style="text-decoration: underline">&nbsp; &nbsp;FFFFH&nbsp; &nbsp;</span>"构成条件,然后使用JE指令实现转移。</p>
<p>4.4 已知VAR1、VAR2、VAR3和VAR4是16位有符号整数,用汇编语言程序片段实现如下C语句:</p>
<p>  VAR4=(VAR1*6)/(VAR2-7)+VAR3</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">用汇编语言实现var4=(var1*6)/(var2-7)+var3</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
var1    dw</span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
var2 dw </span><span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">
var3 dw </span><span style="color: rgba(128, 0, 128, 1)">15</span><span style="color: rgba(0, 0, 0, 1)">
var4 dw ?
    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,var1
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> bx,<span style="color: rgba(128, 0, 128, 1)">6</span>
    <span style="color: rgba(0, 0, 255, 1)">mul</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> cx,var2
    </span><span style="color: rgba(0, 0, 255, 1)">sub</span> cx,<span style="color: rgba(128, 0, 128, 1)">7</span>
    <span style="color: rgba(0, 0, 255, 1)">div</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">add</span><span style="color: rgba(0, 0, 0, 1)"> ax,var3
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> var4,ax
   
    </span><span style="color: rgba(0, 0, 255, 1)">add</span><span style="color: rgba(0, 0, 0, 1)"> var4,30h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,var4
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    .exit
    end</span></pre>
</div>
<p>&nbsp;</p>
<p>4.7 为了验证例4-3程序的执行路径,可以在每个标号前后增加显示一个数字的功能,是的程序运行后显示数码123456.</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg403.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
nvar    dw ?
fvar    dd ?
    .code
    .startup
</span><span style="color: rgba(0, 128, 128, 1)">labl0:</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> labl1    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内(短)转移、相对寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl1:</span>   
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> near ptr labl2    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内(近)转移、相对寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl2:</span>   
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,offset labl3
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> ax    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内转移、寄存器间接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl3:</span>   
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,offset labl4
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> nvar,ax
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> nvar    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段内转移、存储器间接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl4:</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">4</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> far ptr labl5    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段间转移、直接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl5:</span>   
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">5</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,offset labl6
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> word ptr fvar,ax
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,seg labl6
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> word ptr fvar+<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">,dx
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span> fvar    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">段间转移、间接寻址</span>
    <span style="color: rgba(0, 0, 255, 1)">nop</span>
<span style="color: rgba(0, 128, 128, 1)">labl6:</span>   
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">6</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

    .exit
    end</span></pre>
</div>
<p>&nbsp;</p>
<p>4.13 8086处理器的指令CWD将AX符号扩展到DX。假若没有该指令,编程实现该指令功能。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">编程实现将ax符号扩展到dx</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
    .code
    .startup
</span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">第一种方法:用符号扩展的含义</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ax,45h <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">初始化ax</span>
    <span style="color: rgba(0, 0, 255, 1)">test</span><span style="color: rgba(0, 0, 0, 1)"> ax,ax
    </span><span style="color: rgba(0, 0, 255, 1)">js</span><span style="color: rgba(0, 0, 0, 1)"> one
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dx,<span style="color: rgba(128, 0, 128, 1)">0</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> over1
</span><span style="color: rgba(0, 128, 128, 1)">one:</span>
   <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,0ffffh
</span><span style="color: rgba(0, 128, 128, 1)">over1:</span>   
    <span style="color: rgba(0, 0, 255, 1)">nop</span>            <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">空操作,第一种方法结束</span>

<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">第二种方法:用移位实现</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ax,0f045h <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">初始化ax</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> bx,ax<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">为了不改变ax的值,将ax值赋值给bx</span>
    <span style="color: rgba(0, 0, 255, 1)">shl</span> bx,<span style="color: rgba(128, 0, 128, 1)">1</span>      <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">取ax的最高位到cf</span>
    <span style="color: rgba(0, 0, 255, 1)">rcr</span> dx,<span style="color: rgba(128, 0, 128, 1)">1</span>      <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">将cf的值移入dx最高位</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> cl,<span style="color: rgba(128, 0, 128, 1)">15</span>
    <span style="color: rgba(0, 0, 255, 1)">sar</span> dx,cl    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">dx算数右移15,dx所有位变成ax的符号位</span>
<span style="color: rgba(0, 0, 0, 1)">
.exit
    end</span></pre>
</div>
<p>&nbsp;</p>
<p>4.15 编程:先提示输入数字"INPUT NUMBER:0~9",然后再下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误'ERROR',继续等待输入数字。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">输入数字</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
errormsg    db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Error!</span><span style="color: rgba(128, 0, 0, 1)">'</span>,0dh,0ah,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">9个信息</span>
msg    db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Input number(1~9): $</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">提示输入字符串</span>
crlf    db 0dh,0ah,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">回车换行字符</span>
<span style="color: rgba(0, 0, 0, 1)">    .code
    .startup
</span><span style="color: rgba(0, 128, 128, 1)">again:</span>   
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset msg
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">提示输入</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">1</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">等待按键</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">push</span> ax    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">暂时将输入的按键字符保存到堆栈</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,offset crlf    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">回车换行</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span> ax    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">恢复按键字符</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span> al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数字 &lt; 1?</span>
    <span style="color: rgba(0, 0, 255, 1)">jb</span><span style="color: rgba(0, 0, 0, 1)"> error
    </span><span style="color: rgba(0, 0, 255, 1)">cmp</span> al,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数字 &gt; 9?</span>
    <span style="color: rgba(0, 0, 255, 1)">ja</span><span style="color: rgba(0, 0, 0, 1)"> error
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dl,al
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示数字</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> done<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">结束</span>
<span style="color: rgba(0, 128, 128, 1)">error:</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset errormsg
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">9</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span> 21h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">提示输入</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> again
</span><span style="color: rgba(0, 128, 128, 1)">done:</span><span style="color: rgba(0, 0, 0, 1)">
    .exit
    end</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/hotaru-klxx/p/15519272.html
頁: [1]
查看完整版本: 汇编语言期末复习——第四章 程序结构