泽舟 發表於 2021-11-9 20:51:00

汇编语言期末复习——第五章 模块化程序设计

<p>一、子程序结构</p>
<ul>
<li>子程序=函数=过程</li>
<li>子程序指令
<ul>
<li>子程序调用指令
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">CALL</span> LABEL <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">调用标号、子程序名指定的子程序</span></pre>
</div>
</li>
<li>分成近调用(段内调用)和远调用(段间调用)</li>
<li>入栈返回地址:将CALL下条指令的地址压入堆栈
<ul>
<li>近调用:IP入栈</li>
<li>远调用:CS和IP都入栈</li>
</ul>
</li>
</ul>
</li>
<li>子程序返回指令
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">RET</span></pre>
</div>
</li>
<li>分为有参数返回和无参数返回,都是出栈返回地址</li>
</ul>
</li>
<li>过程定义伪指令
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">过程名PROC
…………
…………
过程名ENDP</span></pre>
</div>
<p>过程定义应该书写于.EXIT和END之间;也可以安排在主程序开始执行的第一条语句之前</p>
</li>
<li>PROC后面可以加参数:NEAR/FAR</li>
</ul>
</li>
</ul>
</li>
<li>子程序设计
<ul>
<li>利用过程定义伪指令声明</li>
<li>最后利用RET返回主程序,主程序执行CALL指令调用子程序</li>
<li>压入弹出成对使用使堆栈保持平衡</li>
<li>子程序开始时保护用到的寄存器内容,返回前逆序弹出恢复到原来的寄存器中。</li>
<li>安排在代码段的主程序之外</li>
<li>允许嵌套和递归</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)">eg502.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data

    .code
    .startup
   
    </span><span style="color: rgba(0, 0, 255, 1)">call</span><span style="color: rgba(0, 0, 0, 1)"> dispcrlf

    .exit
<span style="color: rgba(255, 0, 0, 1)">dispcrlf    proc    </span></span><span style="color: rgba(255, 0, 0, 1)">;回车换行子程序</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)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dl,0dh    <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)">2</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> dl,0ah    <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)">2</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> dx    <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)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)"><span style="color: rgba(255, 0, 0, 1)">dispcrlf    endp</span>

    end</span></pre>
</div>
</li>
</ul>
</li>
</ul>
<p>二、参数传递</p>
<ul>
<li>传递参数的多少反应程序模块间的耦合程度</li>
<li>传递的内容:
<ul>
<li>数据本身</li>
<li>数据的存储地址</li>
</ul>
</li>
<li>传递方法:
<ul>
<li>寄存器</li>
<li>变量</li>
<li>堆栈</li>
</ul>
</li>
</ul>
<ol>
<li>寄存器传递参数
<ul>
<li>把参数存于约定的寄存器
<ul>
<li>少量数据直接传递数值</li>
<li>大量数据只能传递地址</li>
</ul>
</li>
<li>带有出口参数的寄存器不能保存和恢复</li>
<li>使用低八位寄存器时不保证不影响高八位数据</li>
<li>例:显示一个数据的数值(数值和ASC码的转换)
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg410.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)">AX=</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 128, 1)">4</span> DUP(?),<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">H</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><span style="color: rgba(0, 0, 0, 1)"> AX,123AH
      </span><span style="color: rgba(0, 0, 255, 1)">MOV</span> CX,<span style="color: rgba(128, 0, 128, 1)">4</span>
      <span style="color: rgba(0, 0, 255, 1)">XOR</span><span style="color: rgba(0, 0, 0, 1)"> BX,BX
    </span><span style="color: rgba(0, 128, 128, 1)">AGAIN:</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AX,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AX,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AX,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AX,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">PUSH</span><span style="color: rgba(0, 0, 0, 1)"> AX
      </span><span style="color: rgba(0, 0, 255, 1)">CALL</span><span style="color: rgba(0, 0, 0, 1)"> HTOASC
      </span><span style="color: rgba(255, 0, 0, 1)">MOV STRING+3,AL
      </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)">POP</span><span style="color: rgba(0, 0, 0, 1)"> AX
      LOOP AGAIN

      </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)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> DX,OFFSET STRING
      </span><span style="color: rgba(0, 0, 255, 1)">INT</span><span style="color: rgba(0, 0, 0, 1)"> 21H
    .exit
      HTOASC PROC
      </span><span style="color: rgba(255, 0, 0, 1)">AND AL,0FH
      OR AL,30H
      </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, 0, 255, 1)">JBE</span><span style="color: rgba(0, 0, 0, 1)"> ABCD
      </span><span style="color: rgba(255, 0, 0, 1)">ADD AL,7</span>
      <span style="color: rgba(0, 128, 128, 1)">ABCD:</span> <span style="color: rgba(0, 0, 255, 1)">RET</span><span style="color: rgba(0, 0, 0, 1)">
      HTOASC ENDP

    end</span></pre>
</div>
<p>&nbsp;</p>
</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)">eg504.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)">6789</span>,-<span style="color: rgba(128, 0, 128, 1)">1234</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">1</span>,-<span style="color: rgba(128, 0, 128, 1)">9876</span>,<span style="color: rgba(128, 0, 128, 1)">32767</span>,-<span style="color: rgba(128, 0, 128, 1)">32768</span>,<span style="color: rgba(128, 0, 128, 1)">5678</span>,-<span style="color: rgba(128, 0, 128, 1)">5678</span>,<span style="color: rgba(128, 0, 128, 1)">9000</span><span style="color: rgba(0, 0, 0, 1)">
count    = lengthof array
    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> cx,count
    </span><span style="color: rgba(0, 0, 255, 1)">xor</span><span style="color: rgba(0, 0, 0, 1)"> bx,bx
</span><span style="color: rgba(0, 128, 128, 1)">again:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> ax,array   <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)">call</span> dispsiw    <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)">add</span><span style="color: rgba(0, 0, 0, 1)"> bx,type array
    </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, 0, 1)">    loop again
    .exit
dispsiw    proc    </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)">push</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, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">test</span> ax,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)">jnz</span><span style="color: rgba(0, 0, 0, 1)"> dsiw1
    </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)">是零,显示“0”后退出</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><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> dsiw5
</span><span style="color: rgba(0, 128, 128, 1)">dsiw1:</span>    <span style="color: rgba(0, 0, 255, 1)">jns</span> dsiw2    <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)">AX数据暂存于BX</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)">-</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><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,bx
    </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)">数据求补(绝对值)</span>
<span style="color: rgba(0, 128, 128, 1)">dsiw2:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
    <span style="color: rgba(0, 0, 255, 1)">push</span> bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">10压入堆栈,作为退出标志</span>
<span style="color: rgba(0, 128, 128, 1)">dsiw3:</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)">数据(商)为零,转向显示</span>
    <span style="color: rgba(0, 0, 255, 1)">jz</span><span style="color: rgba(0, 0, 0, 1)"> dsiw4
    </span><span style="color: rgba(0, 0, 255, 1)">xor</span> dx,dx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">扩展被除数DX.AX</span>
    <span style="color: rgba(0, 0, 255, 1)">div</span> bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数据除以10:DX.AX÷10</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span> dl,30h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">余数(0~9)转换为ASCII码</span>
    <span style="color: rgba(0, 0, 255, 1)">push</span> dx    <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)"> dsiw3
</span><span style="color: rgba(0, 128, 128, 1)">dsiw4:</span>    <span style="color: rgba(0, 0, 255, 1)">pop</span> dx    <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> dl,<span style="color: rgba(128, 0, 128, 1)">10</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">是结束标志10,则退出</span>
    <span style="color: rgba(0, 0, 255, 1)">je</span><span style="color: rgba(0, 0, 0, 1)"> dsiw5
    </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, 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)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> dsiw4
</span><span style="color: rgba(0, 128, 128, 1)">dsiw5:</span>    <span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">dispsiw    endp

dispcrlf    proc    </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)">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)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dl,0dh    <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)">2</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> dl,0ah    <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)">2</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> dx    <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)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">dispcrlf    endp

    end</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ul>
</li>
</ul>
</li>
<li>变量传递参数
<ul>
<li>子程序和主程序如果在同一模块不需要特殊说明</li>
<li>如果不在同一个模块需要利用PUBLEC EXTREN说明</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)">eg505.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
count    = </span><span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">
array    dw count dup(</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
temp    dw ?    </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)"> cx,count
    </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)">call</span> readbw    <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,temp    <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)">存放到数据缓冲区</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span><span style="color: rgba(0, 0, 0, 1)"> bx,type array
    </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, 0, 1)">    loop again
    .exit

readbw    proc    </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)">push</span> ax    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">出口参数:共享变量TEMP</span>
    <span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> bx
   </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> cx
</span><span style="color: rgba(0, 128, 128, 1)">rdbw1:</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> cx,<span style="color: rgba(128, 0, 128, 1)">16</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, 128, 1)">rdbw2:</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)">cmp</span> al,<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)">检测键入字符是否合法</span>
    <span style="color: rgba(0, 0, 255, 1)">jb</span> rderr    <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, 0, 255, 1)">ja</span><span style="color: rgba(0, 0, 0, 1)"> rderr
    </span><span style="color: rgba(0, 0, 255, 1)">sub</span> al,<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)">对输入的字符进行转化</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的值乘以2</span>
    <span style="color: rgba(0, 0, 255, 1)">or</span> bl,al    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BL和AL相加</span>
    loop rdbw2    <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> temp,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">把BX的二进制结果存放TEMP返回</span>
    <span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</span>
<span style="color: rgba(0, 128, 128, 1)">rderr:</span>   <span style="color: rgba(0, 0, 255, 1)">push</span> ds    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">保护DS</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> ax,cs    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">因信息保存在代码段,所以需要设置DS=CS</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ds,ax
    </span><span style="color: rgba(0, 0, 255, 1)">lea</span> dx,errmsg    <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> ds    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">恢复DS</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> rdbw1
errmsg    db 0dh,0ah,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Input error, enter again: $</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
readbw    endp

dispcrlf    proc    </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)">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)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dl,0dh    <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)">2</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> dl,0ah    <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)">2</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> dx    <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)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">dispcrlf    endp

    end</span></pre>
</div>
<p>&nbsp;</p>
</li>
<li>有符号十进制数输入程序
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg506.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
count    = </span><span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">
array    dw count dup(</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
temp    dw ?    </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)"> cx,count
    </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)">call</span> readsiw    <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,temp    <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)">保存到数据缓冲区</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span> bx,<span style="color: rgba(128, 0, 128, 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, 0, 1)">    loop again
    .exit
readsiw    proc    </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)">push</span> ax    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">出口参数:变量TEMP=补码表示的二进制数值</span>
    <span style="color: rgba(0, 0, 255, 1)">push</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)">push</span><span style="color: rgba(0, 0, 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)">xor</span> cx,cx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">CX为正负标志,0为正,-1为负</span>
<span style="color: rgba(0, 128, 128, 1)">rsiw0:</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)">cmp</span> al,<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><span style="color: rgba(0, 0, 0, 1)"> rsiw1
    </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)">-</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)">jnz</span><span style="color: rgba(0, 0, 0, 1)"> rsiw2
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> cx,-<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)">rsiw1:</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, 128, 128, 1)">rsiw2:</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)">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)">不是0~9之间的字符,则输入数据结束</span>
    <span style="color: rgba(0, 0, 255, 1)">jb</span><span style="color: rgba(0, 0, 0, 1)"> rsiw3
    </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, 0, 255, 1)">ja</span><span style="color: rgba(0, 0, 0, 1)"> rsiw3
    </span><span style="color: rgba(0, 0, 255, 1)">sub</span> al,30h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">是0~9之间的字符,则转换为二进制数</span>
    <span style="color: rgba(0, 0, 255, 1)">xor</span> ah,ah    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL零位扩展为AX</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)">利用移位和加法实现数值乘10:BX←BX×10</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dx,bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">参见例3-8</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, 0, 255, 1)">shl</span> bx,<span style="color: rgba(128, 0, 128, 1)">1</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span> bx,<span style="color: rgba(128, 0, 128, 1)">1</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span> bx,ax    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">已输入数值乘10后,与新输入数值相加</span>
    <span style="color: rgba(0, 0, 255, 1)">jmp</span> rsiw1    <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)">rsiw3:</span>    <span style="color: rgba(0, 0, 255, 1)">cmp</span> cx,<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)">是负数,进行求补</span>
    <span style="color: rgba(0, 0, 255, 1)">jz</span><span style="color: rgba(0, 0, 0, 1)"> rsiw4
    </span><span style="color: rgba(0, 0, 255, 1)">neg</span><span style="color: rgba(0, 0, 0, 1)"> bx
</span><span style="color: rgba(0, 128, 128, 1)">rsiw4:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> temp,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)">pop</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">readsiw    endp

dispcrlf    proc    </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)">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)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dl,0dh    <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)">2</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> dl,0ah    <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)">2</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> dx    <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)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">dispcrlf    endp

    end</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ul>
</li>
</ul>
</li>
<li>堆栈传递参数<ol>
<li>注意PUSH后不能是常数</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)">eg507.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)">675</span>, <span style="color: rgba(128, 0, 128, 1)">354</span>, -<span style="color: rgba(128, 0, 128, 1)">34</span>, <span style="color: rgba(128, 0, 128, 1)">198</span>, <span style="color: rgba(128, 0, 128, 1)">267</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">2371</span>, -<span style="color: rgba(128, 0, 128, 1)">67</span>, <span style="color: rgba(128, 0, 128, 1)">4257</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,lengthof array
    </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><span style="color: rgba(0, 0, 0, 1)"> bx,offset array
    </span><span style="color: rgba(0, 0, 255, 1)">push</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)">call</span> mean    <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)">add</span> sp,<span style="color: rgba(128, 0, 128, 1)">4</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">平衡堆栈(压入了4个字节数据)</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> dispsiw    <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
mean    proc    </span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">计算16位有符号数平均值子程序</span>
    <span style="color: rgba(0, 0, 255, 1)">push</span> bp    <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> bp,sp    <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)">push</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)">push</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> 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> cx,    <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> ax,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)">mean1:</span>    <span style="color: rgba(0, 0, 255, 1)">add</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)">add</span> bx,type array    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">指向下一个数据</span>
    loop mean1    <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)">cwd</span>    <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, 255, 1)">idiv</span> word ptr     <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, 255, 1)">pop</span> dx    <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)">pop</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bp
    </span><span style="color: rgba(0, 0, 255, 1)">ret</span><span style="color: rgba(0, 0, 0, 1)">
mean    endp
dispsiw    proc    </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)">push</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, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">test</span> ax,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)">jnz</span><span style="color: rgba(0, 0, 0, 1)"> dsiw1
    </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)">是零,显示“0”后退出</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><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> dsiw5
</span><span style="color: rgba(0, 128, 128, 1)">dsiw1:</span>    <span style="color: rgba(0, 0, 255, 1)">jns</span> dsiw2    <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)">AX数据暂存于BX</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)">-</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><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,bx
    </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)">数据求补(绝对值)</span>
<span style="color: rgba(0, 128, 128, 1)">dsiw2:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> bx,<span style="color: rgba(128, 0, 128, 1)">10</span>
    <span style="color: rgba(0, 0, 255, 1)">push</span> bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">10压入堆栈,作为退出标志</span>
<span style="color: rgba(0, 128, 128, 1)">dsiw3:</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)">数据(商)为零,转向显示</span>
    <span style="color: rgba(0, 0, 255, 1)">jz</span><span style="color: rgba(0, 0, 0, 1)"> dsiw4
    </span><span style="color: rgba(0, 0, 255, 1)">xor</span> dx,dx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">扩展被除数DX.AX</span>
    <span style="color: rgba(0, 0, 255, 1)">div</span> bx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数据除以10:DX.AX÷10</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span> dl,30h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">余数(0~9)转换为ASCII码</span>
    <span style="color: rgba(0, 0, 255, 1)">push</span> dx    <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)"> dsiw3
</span><span style="color: rgba(0, 128, 128, 1)">dsiw4:</span>    <span style="color: rgba(0, 0, 255, 1)">pop</span> dx    <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> dl,<span style="color: rgba(128, 0, 128, 1)">10</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">是结束标志10,则退出</span>
    <span style="color: rgba(0, 0, 255, 1)">je</span><span style="color: rgba(0, 0, 0, 1)"> dsiw5
    </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, 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)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> dsiw4
</span><span style="color: rgba(0, 128, 128, 1)">dsiw5:</span>    <span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">dispsiw    endp
    end</span></pre>
</div>
<p>&nbsp;</p>
</li>
</ul>
</li>
</ol></li>
</ol>
<p>三、宏结构</p>
<ol>
<li>宏汇编<ol>
<li>定义和调用
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">;声明<br>宏名    MACRO[形参表]
          ……
          ……
      ENDM<br>;调用<br>宏名实参列表</span></pre>
</div>
</li>
<li>例:
<ul>
<li>宏定义
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">WriteString    macro msg
      </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> ax
      </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
      </span><span style="color: rgba(0, 0, 255, 1)">lea</span><span style="color: rgba(0, 0, 0, 1)"> dx,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><span style="color: rgba(0, 0, 0, 1)"> 21h
      </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> dx
      </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
      endm</span></pre>
</div>
</li>
<li>宏调用
<div class="cnblogs_code">
<pre>WriteStringmsg</pre>
</div>
</li>
<li>宏展开
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">lea</span><span style="color: rgba(0, 0, 0, 1)"> dx,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><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span> ax</pre>
</div>
</li>
</ul>
</li>
</ul>
</li>
<li>宏和子程序
<ul>
<li>宏:
<ul>
<li>仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变</li>
<li>
<p>通过形参、实参结合实现参数传递,简捷直观、灵活多变</p>
</li>
<li>
<p>当程序段较短或要求较快执行时,应选用宏</p>
</li>
</ul>
</li>
<li>
<p>子程序</p>
<ul>
<li>
<p><em id="__mceDel">还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢</em></p>
</li>
<li>
<p><em id="__mceDel">需要利用寄存器、存储单元或堆栈等传递参数</em></p>
</li>
<li>
<p>当程序段较长或为减小目标代码时,要选用子程序</p>
</li>
</ul>
</li>
</ul>
</li>
</ol></li>
<li>
<p>一些其他的说明</p>
<ul>
<li>
<p>MASM具体支持的多模块程序结构的方法:</p>
<ul>
<li>
<p>源文件包含</p>
</li>
<li>
<p>模块连接</p>
</li>
<li>
<p>子程序库</p>
</li>
<li>
<p>库文件包含</p>
</li>
</ul>
</li>
<li>
<p>&nbsp;源文件包含</p>
<ul>
<li>
<p>各种常量定义、声明语句等组织在包含文件(*.inc)</p>
</li>
<li>
<p>常用的或有价值的宏定义放在宏定义文件(*.mac)</p>
</li>
<li>
<p>常用的子程序形成汇编语言源文件(*.asm)</p>
</li>
</ul>
</li>
<li>
<p>使用源文件包含伪指令INCLUDE将指定的文本文件内容插入主题源程序文件。  </p>
</li>
</ul>
</li>
</ol>
<p>四、课后习题!</p>
<p>5.1(1)指令“CALL BX“采用了指令的什么寻址方式?</p>
<p>    寄存器间接寻址</p>
<p>  (5)子程序采用堆栈传递参数,为什么要特别注意堆栈平衡问题?</p>
<p>    子程序保持堆栈平衡才能保证执行RET指令时当前栈顶的内容是正确的返回地址。</p>
<p>    主程序保持平衡才能释放传递参数占用的堆栈空间,否则多次调用可能使堆栈溢出。</p>
<p>5.2 判断题</p>
<p>  (2)CALL指令的执行并不影响堆栈指针SP。</p>
<p>    错,IP入栈 sp-2</p>
<p>  (5)子程序需要保护寄存器,包括保护传递入口参数和出口参数的通用寄存器。</p>
<p>    错,出口参数寄存器不能保护。</p>
<p>  (6)利用INCLUDE包含的源文件实际上只是源程序的一部分。</p>
<p>    对。</p>
<p>  (7)宏调用与子程序调用一样都要使用CALL指令实现。</p>
<p>    错。宏调用:宏名+参数列表</p>
<p>  (8)宏定义可以与子程序一样,书写与主程序之后。</p>
<p>    错,不可以。</p>
<p>5.3 填空题</p>
<p>  (1)指令”RET i16"的功能相当于"RET"指令和“ADD SP,<span style="text-decoration: underline">&nbsp; &nbsp; 2&nbsp; &nbsp;&nbsp;</span>.”组合。</p>
<p>  (4)数值10在计算机内部用二进制“1010”编码表示,用十六进制表达是:<span style="text-decoration: underline">&nbsp; &nbsp; 0AF&nbsp; &nbsp;</span>.如果将该编码加37H,则为<span style="text-decoration: underline">&nbsp; &nbsp;41H&nbsp; &nbsp;</span>,他是字符<span style="text-decoration: underline">&nbsp; &nbsp;A&nbsp; &nbsp;</span>的ASCII码值。</p>
<p>  (5)利用堆栈传递子程序参数的方法是固定的,例如寻址堆栈段数据的寄存器是<span style="text-decoration: underline">&nbsp; &nbsp;BP&nbsp; &nbsp;</span>。</p>
<p>  (7)过程定义开始是“TEST PROC"语句,则过程定义结束的语句是<span style="text-decoration: underline">&nbsp; &nbsp;TEST ENDP&nbsp;&nbsp;</span>。宏定义开始是”DISP MACRO"语句,则宏定义结束的语句是<span style="text-decoration: underline">&nbsp; &nbsp;ENDM&nbsp;&nbsp;</span>。</p>
<p>5.5 请按如下说明编写子程序。</p>
<p>子程序功能:把用ASCII码表示的两位十进制数转换为压缩BCD码</p>
<p>入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码</p>
<p>出口参数:AL=对应BCD码</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">把用asc码表示的两位十进制数转换称压缩的BCD码</span>
    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">入口参数:DH=十位数的ASC码,DL=个位数的ASC码</span>
    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">出口参数:AL=对应的BCD码</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data    </span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">数据段</span>
      inmsg    db <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Enter two numbers(0-9):$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
      errmsg    db 0dh,0ah,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Input error, enter again: $</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    .code    </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)">    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset inmsg
    </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, 128, 0, 1)">输入两位十进制数字,结果分别保存到DH和DL</span>
<span style="color: rgba(0, 128, 128, 1)">rdhw1:</span>    <span style="color: rgba(0, 0, 255, 1)">xor</span> dx,dx    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">;DX一开始是0哇</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> bx,<span style="color: rgba(128, 0, 128, 1)">2</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> cl,<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)">rdhw2:</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, 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)">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)">检测键入字符是否合法</span>
    <span style="color: rgba(0, 0, 255, 1)">jb</span> rderr    <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)">9</span><span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">ja</span> rderr    <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)">shl</span> dx,cl<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">;将十位上的数左移至高八位DH上 在第二次循环的时候起作用!!</span>
    <span style="color: rgba(0, 0, 255, 1)">or</span> dl,al<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">;这步应该是相当于ADD DL,AL吧</span>
    <span style="color: rgba(0, 0, 255, 1)">dec</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">jnz</span> rdhw2 <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> btobcd <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(128, 0, 128, 1)">3</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)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> done
   
</span><span style="color: rgba(0, 128, 128, 1)">rderr:</span>   
    <span style="color: rgba(0, 0, 255, 1)">mov</span> dl,0dh    <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)">2</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> dl,0ah    <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)">2</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)">lea</span> dx,errmsg   <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)">jmp</span> rdhw1 <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)">nop</span><span style="color: rgba(0, 0, 0, 1)">
    .exit    </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)">   
btobcd    proc    </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)">出口参数:AL=输入的数据</span>
    <span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </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> cl,<span style="color: rgba(128, 0, 128, 1)">4</span>
   <span style="color: rgba(0, 0, 255, 1)">and</span> dh,0fh    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">dh高4位清零</span>
    <span style="color: rgba(0, 0, 255, 1)">or</span> al,dh    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL和DH相加;;AL不是零么???</span>
    <span style="color: rgba(0, 0, 255, 1)">and</span> dl,0fh    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">减30H;;为啥不直接用SUB呢???为什么???</span>
    <span style="color: rgba(0, 0, 255, 1)">shl</span> ax,cl    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX左移4位</span>
    <span style="color: rgba(0, 0, 255, 1)">or</span> al,dl    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL和DL相加</span>
    <span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">ret</span><span style="color: rgba(0, 0, 0, 1)">
btobcd endp
    end

</span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">为什么子程序保护了CX不保护DX?? 入口参数不用保护嘛??</span></pre>
</div>
<p>&nbsp;</p>
<p>5.7 编写一个程序,在键盘上按一个键,将其返回的ASCII码值表示出来,如果按下ESC键(1BH)则退出。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示输入字符的ASC码</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">如果输入的是ESC(1BH)则退出</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
asc db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">00H</span><span style="color: rgba(128, 0, 0, 1)">'</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)">$</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
crlf 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)">$</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, 128, 128, 1)">ReadAsc:</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, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
    </span><span style="color: rgba(0, 0, 255, 1)">cmp</span><span style="color: rgba(0, 0, 0, 1)"> al,1Bh
    </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)">输入一个字符,输入ESC退出;ESC的ASCii码为1BH</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset crlf
    </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> cx,<span style="color: rgba(128, 0, 128, 1)">2</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用做asc数组下标</span>
<span style="color: rgba(0, 128, 128, 1)">again:</span>   
    <span style="color: rgba(0, 0, 255, 1)">rol</span> al,<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)">高4位循环移位进入低4位,作为子程序的入口参数</span>
    <span style="color: rgba(0, 0, 255, 1)">rol</span> al,<span style="color: rgba(128, 0, 128, 1)">1</span>
    <span style="color: rgba(0, 0, 255, 1)">rol</span> al,<span style="color: rgba(128, 0, 128, 1)">1</span>
    <span style="color: rgba(0, 0, 255, 1)">rol</span> al,<span style="color: rgba(128, 0, 128, 1)">1</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)">子程序利用AL返回结果,所以需要保存AX中的数据</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span> htoasc    <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> asc,al    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">保存转换后的ASCII码</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)">inc</span><span style="color: rgba(0, 0, 0, 1)"> bx
    loop again
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> dx,offset asc
    </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)"> ReadAsc
   
</span><span style="color: rgba(0, 128, 128, 1)">done:</span>
   <span style="color: rgba(0, 0, 255, 1)">nop</span><span style="color: rgba(0, 0, 0, 1)">
    .exit
   
htoasc    proc    </span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">将AL低4位表达的一位十六进制数转换为ASCII码</span>
    <span style="color: rgba(0, 0, 255, 1)">and</span> al,0fh    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">只取AL的低4位</span>
    <span style="color: rgba(0, 0, 255, 1)">or</span> al,30h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL高4位变成3,实现加30H</span>
    <span style="color: rgba(0, 0, 255, 1)">cmp</span> al,39h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">是0~9,还是A~F</span>
    <span style="color: rgba(0, 0, 255, 1)">jbe</span><span style="color: rgba(0, 0, 0, 1)"> htoend
    </span><span style="color: rgba(0, 0, 255, 1)">add</span> al,<span style="color: rgba(128, 0, 128, 1)">7</span>    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">是A~F,其ASCII码再加上7</span>
<span style="color: rgba(0, 128, 128, 1)">htoend:</span>    <span style="color: rgba(0, 0, 255, 1)">ret</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)">htoasc    endp

    end</span></pre>
</div>
<p>&nbsp;</p>
<p>5.8 编写一个子程序,它以二进制形式显示AL中8位数据,并设计一个主程序验证。</p>
<div class="cnblogs_code">
<pre><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, 0, 1)">    .model small
    .stack
    .data
    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> al,35H <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">用于验证结果,子程序运行正确的话应该输出00110101</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span><span style="color: rgba(0, 0, 0, 1)"> asctob
    </span><span style="color: rgba(0, 0, 255, 1)">nop</span><span style="color: rgba(0, 0, 0, 1)">
    .exit

asctob    proc    </span><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)">push</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> cx,<span style="color: rgba(128, 0, 128, 1)">8</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> bl,al<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">将al的初始数据赋值给bl</span>
   
<span style="color: rgba(0, 128, 128, 1)">again:</span>
    <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)">rol</span> bl,<span style="color: rgba(128, 0, 128, 1)">1</span>   
    <span style="color: rgba(0, 0, 255, 1)">adc</span><span style="color: rgba(0, 0, 0, 1)"> dl,30h   
    </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><span style="color: rgba(0, 0, 0, 1)"> 21h
    loop again
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">asctob    endp

    end</span></pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><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><span style="color: rgba(0, 0, 0, 1)"> al,12h
</span><span style="color: rgba(0, 0, 255, 1)">mov</span> cx,<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> bl,al
</span><span style="color: rgba(0, 128, 128, 1)">again:</span>
    <span style="color: rgba(0, 0, 255, 1)">call</span><span style="color: rgba(0, 0, 0, 1)"> cout
    loop again
    .exit
cout proc
</span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> ax
</span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> dx
</span><span style="color: rgba(0, 0, 255, 1)">shl</span> bl,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">jc</span><span style="color: rgba(0, 0, 0, 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)">0</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 0, 255, 1)">jmp</span><span style="color: rgba(0, 0, 0, 1)"> over
</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, 128, 1)">over:</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><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> dx
</span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> ax
</span><span style="color: rgba(0, 0, 255, 1)">ret</span><span style="color: rgba(0, 0, 0, 1)">
cout endp
    end</span></pre>
</div>
<p>&nbsp;</p>
<p>5.11 编写一个计算字节校验和的子程序。所谓“校验和”是指不计进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果和这个出口参数。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg101.asm</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
      array db </span><span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">2</span>,<span style="color: rgba(128, 0, 128, 1)">3</span>,<span style="color: rgba(128, 0, 128, 1)">4</span>,<span style="color: rgba(128, 0, 128, 1)">5</span>,<span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">
      sumdb ?
    .code
    .startup
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> bx,offset array<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> cx,lengthof array <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><span style="color: rgba(0, 0, 0, 1)"> getSum
    </span><span style="color: rgba(0, 0, 255, 1)">int</span> <span style="color: rgba(128, 0, 128, 1)">3</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span> sum, al <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, 0, 1)">    .exit
   
getSum    proc    </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)">push</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">push</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </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, 128, 128, 1)">again:</span>
    <span style="color: rgba(0, 0, 255, 1)">add</span><span style="color: rgba(0, 0, 0, 1)"> al,
    </span><span style="color: rgba(0, 0, 255, 1)">inc</span><span style="color: rgba(0, 0, 0, 1)"> bx
    loop again
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> cx
    </span><span style="color: rgba(0, 0, 255, 1)">pop</span><span style="color: rgba(0, 0, 0, 1)"> bx
    </span><span style="color: rgba(0, 0, 255, 1)">ret</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)">getSum    endp

    end</span></pre>
</div>
<p>&nbsp;</p>
<p>5.13 设计一个从低地址到高地址逐个字节显示某个主存区与内容的子程序DISPMEM。入口参数:AX=主存偏移地址,CX=字节个数(主存区域的长度)。同时编写一个主程序进行验证。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">将ax=主存偏移地址,cx=字节个数的主存区域从低地址到高地址逐个字节显示</span>
<span style="color: rgba(0, 0, 0, 1)">    .model small
    .stack
    .data
MSG db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">abcdefg</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
crlf 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)">$</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><span style="color: rgba(0, 0, 0, 1)"> AX,OFFSET MSG
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span> CX,<span style="color: rgba(128, 0, 128, 1)">20</span>
<span style="color: rgba(0, 0, 255, 1)">CALL</span><span style="color: rgba(0, 0, 0, 1)"> DISP

    .exit
DISP PROC
</span><span style="color: rgba(0, 0, 255, 1)">PUSH</span><span style="color: rgba(0, 0, 0, 1)"> AX
</span><span style="color: rgba(0, 0, 255, 1)">PUSH</span><span style="color: rgba(0, 0, 0, 1)"> SI
</span><span style="color: rgba(0, 0, 255, 1)">PUSH</span><span style="color: rgba(0, 0, 0, 1)"> DX
</span><span style="color: rgba(0, 0, 255, 1)">PUSH</span><span style="color: rgba(0, 0, 0, 1)"> BX
</span><span style="color: rgba(0, 0, 255, 1)">XOR</span><span style="color: rgba(0, 0, 0, 1)"> BX,BX
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> BX,AX
</span><span style="color: rgba(0, 0, 255, 1)">XOR</span><span style="color: rgba(0, 0, 0, 1)"> SI,SI
</span><span style="color: rgba(0, 128, 128, 1)">A1:</span>   
      <span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> AL,
      </span><span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">PUSH</span><span style="color: rgba(0, 0, 0, 1)"> AX
      </span><span style="color: rgba(0, 0, 255, 1)">AND</span><span style="color: rgba(0, 0, 0, 1)"> AL,0FH
      </span><span style="color: rgba(0, 0, 255, 1)">OR</span><span style="color: rgba(0, 0, 0, 1)"> AL,30H
      </span><span style="color: rgba(0, 0, 255, 1)">CMP</span><span style="color: rgba(0, 0, 0, 1)"> AL,39H
      </span><span style="color: rgba(0, 0, 255, 1)">JBE</span><span style="color: rgba(0, 0, 0, 1)"> A2
      </span><span style="color: rgba(0, 0, 255, 1)">ADD</span> AL,<span style="color: rgba(128, 0, 128, 1)">7</span>
<span style="color: rgba(0, 128, 128, 1)">A2:</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><span style="color: rgba(0, 0, 0, 1)"> 21H
      </span><span style="color: rgba(0, 0, 255, 1)">INC</span><span style="color: rgba(0, 0, 0, 1)"> SI
      
      </span><span style="color: rgba(0, 0, 255, 1)">POP</span><span style="color: rgba(0, 0, 0, 1)"> AX
      </span><span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
      <span style="color: rgba(0, 0, 255, 1)">AND</span><span style="color: rgba(0, 0, 0, 1)"> AL,0FH
      </span><span style="color: rgba(0, 0, 255, 1)">OR</span><span style="color: rgba(0, 0, 0, 1)"> AL,30H
      </span><span style="color: rgba(0, 0, 255, 1)">CMP</span><span style="color: rgba(0, 0, 0, 1)"> AL,39H
      </span><span style="color: rgba(0, 0, 255, 1)">JBE</span><span style="color: rgba(0, 0, 0, 1)"> A3
      </span><span style="color: rgba(0, 0, 255, 1)">ADD</span> AL,<span style="color: rgba(128, 0, 128, 1)">7</span>
<span style="color: rgba(0, 128, 128, 1)">A3:</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><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)"> DX,OFFSET crlf
      </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
      
LOOP A1
</span><span style="color: rgba(0, 0, 255, 1)">POP</span><span style="color: rgba(0, 0, 0, 1)"> BX
</span><span style="color: rgba(0, 0, 255, 1)">POP</span><span style="color: rgba(0, 0, 0, 1)"> DX
</span><span style="color: rgba(0, 0, 255, 1)">POP</span><span style="color: rgba(0, 0, 0, 1)"> SI
</span><span style="color: rgba(0, 0, 255, 1)">POP</span><span style="color: rgba(0, 0, 0, 1)"> AX
</span><span style="color: rgba(0, 0, 255, 1)">RET</span><span style="color: rgba(0, 0, 0, 1)">
DISP ENDP
    end</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/hotaru-klxx/p/15524216.html
頁: [1]
查看完整版本: 汇编语言期末复习——第五章 模块化程序设计