汇编语言期末复习——第四章 程序结构
<p><span style="font-size: 18px">一、顺序程序结构</span></p><ol>
<li>程序的静态分析 略</li>
<li>程序的动态分析 略</li>
<li>实例:读取CMOS RAM数据程序 略</li>
</ol>
<p><span style="font-size: 18px">二、分支程序结构</span></p>
<ol>
<li>无条件转移指令<ol>
<li>代码段寄存器CS指出代码段的段基地址,指令指针IP给出将要执行的偏移地址</li>
<li>转移范围<ol>
<li>段内转移——只改变IP <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> </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> </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> </p>
<p> </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> </p>
</li>
</ol></li>
<li>MASM会根据存储模型和目标地址等信息自动识别是哪种转移。<ol>
<li>汇编程序提供了操作符:
<ul>
<li>SHORT</li>
<li>NEAR PTR </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> </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> </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> </p>
<p> </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> </p>
<p> </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> </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> </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> 可以使用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> </p>
</li>
</ul>
</li>
</ul>
</li>
</ol></li>
<li>多分支程序
<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> </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> </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
<ul>
<li>MOVSB ES: ← DS: SI++,DI++</li>
<li>MOVSW ES: ← DS: SI+=2,DI+=2</li>
</ul>
</li>
<li>存储 STOS
<ul>
<li>STOSB ES:←AL DI++</li>
<li>STOSW ES:←AX DI+=</li>
</ul>
</li>
<li>读取 LODS
<ul>
<li>AL←DS: SI++</li>
<li>AX←DS: SI+=2</li>
</ul>
</li>
<li>重复REP 计数器也是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"> SHORT </span>、<span style="text-decoration: underline"> NEAR </span>、<span style="text-decoration: underline"> FAR </span> 。</p>
<p> (3)假设BX=1256H,字变量TABLE的偏移地址是20A1H,数据段偏移地址32F7H处存放3280H,执行指令“JMP BX"后IP=<span style="text-decoration: underline"> 1256H </span>,执行指令”JMP TABLE“后IP=<span style="text-decoration: underline"> 3280H </span> 。</p>
<p> (4)"CMP AX,3721H"指令之后是JZ指令,发生转移的条件是AX=<span style="text-decoration: underline"> 3271H </span>,此时ZF= <span style="text-decoration: underline"> 1 </span>。</p>
<p> (5)执行""SHR BX,1"指令后,JNC发生转移,说明BX的D0= <span style="text-decoration: underline"> 0 </span>。</p>
<p> (6)在DX等于0时转移,可以使用指令“CMP DX, <span style="text-decoration: underline"> 0 ",</span>也可以使用"TEST DX, <span style="text-decoration: underline"> FFFFH </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> </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> </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> </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)">数字 < 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)">数字 > 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> </p><br><br>
来源:https://www.cnblogs.com/hotaru-klxx/p/15519272.html
頁:
[1]