蒲柳青 發表於 2020-11-5 19:19:00

汇编语言实验2

<p><span style="font-size: 18px">一、实验目的</span><br>1. 理解并掌握汇编源程序组成与结构<br>2. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法<br>3. 理解汇编源程序中地址表示、段寄存器的用法<br>4. 理解和掌握寄存器间接寻址方式<br>5. 通过汇编指令loop的使用理解编程语言中循环的本质</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">二、实验准备</span><br>1. 学习/复习第5章使用和loop实现循环的编程应用示例(教材5.5节,5.8节)<br>2. 复习第3章「栈」的知识<br>3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法<br>4. 复习8086汇编中内存单元地址的表示,以及段寄存器DS, SS, ES, CS的用途</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">三、实验内容 </span></p>
<p>1. 实验任务1 使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">ex1.asm</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> assume <span style="color: rgba(0, 128, 128, 1)">cs:</span><span style="color: rgba(0, 0, 0, 1)">code
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">code segment
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax, 0b810h
</span><span style="color: rgba(0, 128, 128, 1)"> 5</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, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</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(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</span>[<span style="color: rgba(128, 0, 128, 1)">1</span>], <span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</span>[<span style="color: rgba(128, 0, 128, 1)">2</span>], <span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</span>[<span style="color: rgba(128, 0, 128, 1)">3</span>], <span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</span>[<span style="color: rgba(128, 0, 128, 1)">4</span>], <span style="color: rgba(128, 0, 128, 1)">3</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</span>[<span style="color: rgba(128, 0, 128, 1)">5</span>], <span style="color: rgba(128, 0, 128, 1)">3</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</span>[<span style="color: rgba(128, 0, 128, 1)">6</span>], <span style="color: rgba(128, 0, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> byte ptr <span style="color: rgba(0, 128, 128, 1)">ds:</span>[<span style="color: rgba(128, 0, 128, 1)">7</span>], <span style="color: rgba(128, 0, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ah, 4ch
</span><span style="color: rgba(0, 128, 128, 1)">15</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)">16</span> <span style="color: rgba(0, 0, 0, 1)">code ends
</span><span style="color: rgba(0, 128, 128, 1)">17</span> end</pre>
</div>
<p>要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行,使用debug工具调试可执行文件。</p>
<ul>
<li>使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果</li>


</ul>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105143044893-1946281840.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105143134406-1830108506.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<ul>
<li>使用debug工具对程序进行调试</li>


</ul>
<p>使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105144409841-1058870472.png"></p>
<p>&nbsp;</p>
<p>结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编<br>使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105144545595-1531978786.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>2. 实验任务2<br>使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)"> ex2.asm</span>
assume <span style="color: rgba(0, 128, 128, 1)">cs:</span><span style="color: rgba(0, 0, 0, 1)">code
code segment
</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax, 0b810h
</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)">mov</span> bx, <span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax, 101H
</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, 128, 128, 1)">s:</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, 0, 255, 1)">add</span> bx, <span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 0, 255, 1)">add</span><span style="color: rgba(0, 0, 0, 1)"> ax, 101H
loop smov ah, 4chint 21hcode endsend</span></pre>
</div>
<p>要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,用debug工具调试可执行文件。</p>
<ul>
<li>使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果</li>
</ul>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145252067-821488669.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<ul>
<li>使用debug工具对程序进行调试。</li>
</ul>
<p>结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编。</p>
<p>灵活使用t命令、p命令、g命令,对ex2.exe进行调试。(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)。</p>
<p>R命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145502085-1658311915.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>t命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145517534-936839660.png"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145526023-1079957001.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>p命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145540049-540114556.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145549979-72815793.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145601340-1394450255.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;g命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145635832-910654095.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145735646-792063879.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?</p>
<p>它们的功能效果都是向显存中写入数据,但是他们的循环次数cx不同所以具体是实现上,第一个实验显示4个图像,第二个实验显示8个图像。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;3. 实验任务3<br>综合使用loop,,编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H。</p>
<div class="cnblogs_code">
<pre>assume <span style="color: rgba(0, 128, 128, 1)">cs:</span><span style="color: rgba(0, 0, 0, 1)">code
code segment
</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,0b800h
</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)">mov</span><span style="color: rgba(0, 0, 0, 1)"> bx,07b8h
</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> cx,000fh
</span><span style="color: rgba(0, 128, 128, 1)">s:</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ,0237h
</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)">inc</span><span style="color: rgba(0, 0, 0, 1)"> bx
loop s
</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,4c00h
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
code ends
end</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145851631-2077427719.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145908708-1526624382.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105145923807-1102038411.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。</p>
<p>根据上图猜测:高位字节里存放颜色信息,低位字节存放数字信息。</p>
<p>&nbsp;</p>
<p>4. 实验任务4</p>
<ul>
<li>编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。</li>
</ul>
<div class="cnblogs_code">
<pre>assume <span style="color: rgba(0, 128, 128, 1)">cs:</span><span style="color: rgba(0, 0, 0, 1)">code
code segment
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,0h
    </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)">mov</span><span style="color: rgba(0, 0, 0, 1)"> bx,0200h
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span> dx,0h    <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">0~63(3fh)</span>
    <span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> cx,40h
</span><span style="color: rgba(0, 128, 128, 1)">s:</span>    <span style="color: rgba(0, 0, 255, 1)">mov</span> <span style="color: rgba(0, 128, 128, 1)">ds:</span><span style="color: rgba(0, 0, 0, 1)">,dl
    </span><span style="color: rgba(0, 0, 255, 1)">inc</span><span style="color: rgba(0, 0, 0, 1)"> dx
    </span><span style="color: rgba(0, 0, 255, 1)">inc</span><span style="color: rgba(0, 0, 0, 1)"> bx
    loop s   
    </span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,4c00h
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
code ends
end</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域。</p>
<p>t,p,d命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105183434540-1100193261.png"><em id="__mceDel">&nbsp;</em></p>
<p><em id="__mceDel"><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105183440947-1229708746.png"></em></p>
<p>&nbsp;</p>
<p>g命令</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105183843119-1031580095.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5. 实验任务5<br>教材实验4(3)(P121)</p>
<div class="cnblogs_code">
<pre>assume <span style="color: rgba(0, 128, 128, 1)">cs:</span><span style="color: rgba(0, 0, 0, 1)">code
code segment
</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,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)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,0020h
</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> es,ax
</span><span style="color: rgba(0, 0, 255, 1)">mov</span> bx,<span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(0, 0, 255, 1)">sub</span> cx,<span style="color: rgba(128, 0, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">s:</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)">mov</span> <span style="color: rgba(0, 128, 128, 1)">es:</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 s
</span><span style="color: rgba(0, 0, 255, 1)">mov</span><span style="color: rgba(0, 0, 0, 1)"> ax,4c00h
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
code ends
<br></span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>cx=10时,验证</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105185743423-970475524.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>查得具体位置为17,将数据改成17,重新实验。</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105191239419-1796559548.png"></p>
<p>&nbsp;</p>
<p>&nbsp;复制后代码。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616553/202011/1616553-20201105191404506-1426930049.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>因为将ax送给ds寄存器,表示传送段地址位置,所以第一个空填入cs寄存器的值。</p>
<p>然后我们随便在第二空填一个数,先填个10。然后用u命令来查看mov ax,4c00h的具体位置,查得具体位置为17,将数据改成17所以第二空填17。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/jyxfeiyu/p/13931550.html
頁: [1]
查看完整版本: 汇编语言实验2