冬天的小天使 發表於 2020-10-10 00:59:00

汇编语言实验一

<h1 id="汇编语言程序设计实验一">汇编语言程序设计实验一</h1>
<h2 id="实验目的">实验目的</h2>
<ol>
<li>熟练掌握使用debug工具编写和调试x86汇编命令的方法</li>
<li>掌握8086CPU、寄存器、内存的基础知识</li>
<li>理解并掌握内存中多字节数据的存放:小端法</li>
<li>理解并掌握「栈」内存空间的特性和使用</li>
<li>掌握指令mov, add, sub, jmp, push, pop的基础用法</li>
</ol>
<h2 id="实验准备">实验准备</h2>
<ol>
<li>复习教材第1~2章内容,完成教材内相关检测点</li>
<li>复习教材第3章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop ,完成教材 3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2 3. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。</li>
</ol>
<h2 id="实验内容">实验内容</h2>
<h3 id="教材实验1">教材实验1</h3>
<p>(1).把如下的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。</p>
<table>
<thead>
<tr>
<th style="text-align: center">机器码</th>
<th style="text-align: center">汇编指令</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">b8 20 4e</td>
<td style="text-align: center">mov ax,4E20H</td>
</tr>
<tr>
<td style="text-align: center">05 16 14</td>
<td style="text-align: center">add ax,1416H</td>
</tr>
<tr>
<td style="text-align: center">bb 00 20</td>
<td style="text-align: center">mov bx,200H</td>
</tr>
<tr>
<td style="text-align: center">01 d8</td>
<td style="text-align: center">add ax,bx</td>
</tr>
</tbody>
</table>
<p>使用a命令将指令写入内存;</p>
<p>使用t执行命令,注意观察CS:IP的指向变化:</p>
<p><img src="https://tva4.sinaimg.cn/large/006rkvIPgy1gjjbcx382dj30hw0b9mx9.jpg" alt="1" loading="lazy"></p>
<p>使用e命令以机器码的形式将指令写入内存中:</p>
<p>使用t执行命令,注意观察CS:IP的指向变化:</p>
<p><img src="https://tva2.sinaimg.cn/large/006rkvIPgy1gjjbdfej56j30ht08kt8r.jpg" alt="2" loading="lazy"></p>
<p>使用u进行反汇编,与输入的机器码进行对比:</p>
<p><img src="https://tvax4.sinaimg.cn/large/006rkvIPgy1gjjknjzizej30hy05wglm.jpg" alt="反汇编" loading="lazy"></p>
<p>(2).使用一下 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指令计算 2 的 8 次方</p>
<p>mov ax,1</p>
<p>add ax,ax</p>
<p>jmp 2000:0003</p>
<p>使用a指令将汇编指令写入内存,调整cs和ip寄存器的内容:<br>
<img src="https://img2020.cnblogs.com/blog/2175390/202010/2175390-20201009172347135-1665627377.png" alt="alt" loading="lazy"></p>
<p>t指令单步调试得到结果:ax=0100,即为$2^8$</p>
<p><img src="https://tvax2.sinaimg.cn/large/006rkvIPgy1gjjbxk95hmj30hi0b20sw.jpg" alt="7" loading="lazy"></p>
<p>分析:</p>
<p>指令的第一步是将ax赋初值为1,第二步是ax+=ax,即ax变为原先的二倍,最后执行第三步的跳转指令再次将ax变为原先的2倍,所以执行一轮就相当于乘以2,所以单步调试16次就得到结果AX=0100;</p>
<p>(3).PC机主板上的ROM中写着一个生产日期,在内存 FFF00H~FFFFFH 的某几个单元中,找到这个生产日期并试图改变它;</p>
<p>首先使用d命令进行查看:</p>
<p>从下图可以看出日期存在于FFFF5H-FFFFFH之间:</p>
<p><img src="https://tvax3.sinaimg.cn/large/006rkvIPgy1gjjkoejj1kj30hu080mxd.jpg" alt="原先" loading="lazy"></p>
<p>对该区域使用-e命令进行更改发现无效</p>
<p><img src="https://tvax4.sinaimg.cn/large/006rkvIPgy1gjjbzebtm0j30hg06n3yk.jpg" alt="修改查看" loading="lazy"></p>
<p>原因:ROM是只读存储器,不可能修改内存中的值;</p>
<p>(4).向内存从B8100H开始的单元中填写数据,如:</p>
<p>-e B8100:0000 01 01 02 02 03 03 04 04</p>
<p>通过写入不同的数据,返现屏幕中会出现不同数量的表情符号;</p>
<p><img src="https://tvax1.sinaimg.cn/large/006rkvIPgy1gjjc8e6g6aj30hq09raa4.jpg" alt="填写不同数据1" loading="lazy"></p>
<p><img src="https://tva4.sinaimg.cn/large/006rkvIPgy1gjjc8hoi28j30hu0aidfx.jpg" alt="填写不同数据2" loading="lazy"></p>
<p>这是因为8000H-9FFFH是显存地址空间,在其中写入不同的数据也会相应的显示出不同的图案结果;</p>
<h3 id="教材实验二">教材实验二</h3>
<p>(1).使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。</p>
<blockquote>
<p>mov ax,0022</p>
<p>mov ds,ax</p>
<p>mov ax,2200</p>
<p>mov ss,ax</p>
<p>mov sp,0100</p>
<p>mov ax, </p>
<p>add ax, </p>
<p>mov bx, </p>
<p>add bx, </p>
<p>push ax</p>
<p>push bx</p>
<p>pop ax</p>
<p>pop bx</p>
<p>push </p>
<p>push </p>
</blockquote>
<p>在使用a命令输入指令调试之前,先使用e命令将内存单元0022:0-0022:7连续8个字节数据修改为50H,51H,52H,53H,54H,55H,56H,57H</p>
<p>使用e命令修改数据:</p>
<p><img src="https://tva3.sinaimg.cn/large/006rkvIPgy1gjjj0ekbukj30hs05hweh.jpg" alt="8" loading="lazy"></p>
<p>将程序段写入内存:</p>
<p><img src="https://tvax2.sinaimg.cn/large/006rkvIPgy1gjjjgjdwkrj30hs0b7t8u.jpg" alt="9" loading="lazy"></p>
<p>逐条执行,分析结果:<br>
<img src="https://tvax2.sinaimg.cn/large/006rkvIPgy1gjjjo01f2uj30i709eaa7.jpg" alt="t1" loading="lazy"></p>
<p><img src="https://tvax2.sinaimg.cn/large/006rkvIPgy1gjjjo6o0fcj30hs0b63yr.jpg" alt="t2" loading="lazy"></p>
<p><img src="https://tva2.sinaimg.cn/large/006rkvIPgy1gjjjobdwraj30ht0azaa9.jpg" alt="t3" loading="lazy"></p>
<p>实验结果与预期结果相同,下面是具体的结果和分析:</p>
<table>
<thead>
<tr>
<th style="text-align: center">汇编指令</th>
<th style="text-align: center">结果数据</th>
<th style="text-align: center">分析</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">mov ax,0022</td>
<td style="text-align: center">0022</td>
<td style="text-align: center">ax赋值为0022</td>
</tr>
<tr>
<td style="text-align: center">mov ds,ax</td>
<td style="text-align: center">0022</td>
<td style="text-align: center">内存单元段地址设置为ax</td>
</tr>
<tr>
<td style="text-align: center">mov ax,2200</td>
<td style="text-align: center">2200</td>
<td style="text-align: center">ax赋值为2200</td>
</tr>
<tr>
<td style="text-align: center">mov ss,ax</td>
<td style="text-align: center">2200</td>
<td style="text-align: center">栈顶指针赋值为2200</td>
</tr>
<tr>
<td style="text-align: center">mov sp,0100</td>
<td style="text-align: center">0100</td>
<td style="text-align: center">栈顶的偏移地址为0100</td>
</tr>
<tr>
<td style="text-align: center">mov ax,</td>
<td style="text-align: center">ax=5150</td>
<td style="text-align: center">2200:0处的两个字节</td>
</tr>
<tr>
<td style="text-align: center">add ax,</td>
<td style="text-align: center">ax=5352+5150=A4A2</td>
<td style="text-align: center">ax+5352</td>
</tr>
<tr>
<td style="text-align: center">mov bx,</td>
<td style="text-align: center">bx=5554</td>
<td style="text-align: center">2200:4处的两个字节</td>
</tr>
<tr>
<td style="text-align: center">add bx,</td>
<td style="text-align: center">bx=5554+5756=ACAA</td>
<td style="text-align: center">bx+5756</td>
</tr>
<tr>
<td style="text-align: center">push ax</td>
<td style="text-align: center">sp=0100-2=00FE 存入A4A2</td>
<td style="text-align: center">栈顶上移2字节</td>
</tr>
<tr>
<td style="text-align: center">push bx</td>
<td style="text-align: center">sp=00FE-2=00FC 存入ACAA</td>
<td style="text-align: center">栈顶上移2字节</td>
</tr>
<tr>
<td style="text-align: center">pop ax</td>
<td style="text-align: center">sp=00FE;ax=ACAA</td>
<td style="text-align: center">栈顶下移2字节</td>
</tr>
<tr>
<td style="text-align: center">pop bx</td>
<td style="text-align: center">sp=0100;bx=A4A2</td>
<td style="text-align: center">栈顶下移2字节</td>
</tr>
<tr>
<td style="text-align: center">push</td>
<td style="text-align: center">sp=00FC;存入5756</td>
<td style="text-align: center">栈顶上移2字节</td>
</tr>
</tbody>
</table>
<p>(2).观察3.19中的实验过程,然后分析:为什么2000:0-2000:f中的内容会发生改变;</p>
<p>输入指令单步调试</p>
<p><img src="https://tva1.sinaimg.cn/large/006rkvIPgy1glk8dqzeanj30hl08bt8s.jpg" alt="h1" loading="lazy"></p>
<p><img src="https://tvax3.sinaimg.cn/large/006rkvIPgy1gjjk9zt68pj30hr0b3t8w.jpg" alt="p1" loading="lazy"></p>
<p>通过实验发现mov ss,ax和mov sp,10一同被执行,</p>
<p>(学完中断之后补的)此外我们可以看到当使用t命令执行到mov ss,ax的时候栈中就存在了本不应该存在的数据:01A3,073F,0108,2000,其中01A3不知道是什么但是后面三个分别是cs,ip,ss,因为t是单步中断指令,因此我们推测,就像是多个循环使用栈来保存和恢复cx一样,这里cpu会自动保护现场,将cs,ip,ss存入栈中,以便恢复现场。</p>
<h2 id="实验总结">实验总结</h2>
<ul>
<li>本次实验是我熟悉了debug的各项命令以及应用场景,可以初步使用debug工具来对问题进行分析与实验;</li>
<li>通过本次实验将计算机组成原理的相关知识迁移过来,例如:ROM是只读存储器,不能进行修改;更好的理解了大端、小端存储的相关概念,以及基地址、偏移量的具体使用;</li>
<li>对于栈这一数据结构在汇编使用的场景与形式有了更为直观的理解,了解到了书写程序时爆栈等异常的出现原因</li>
</ul>


</div>
<div id="MySignature" role="contentinfo">
    We Turn Not Older With Years ,But Newer Everyday!<br><br>
来源:https://www.cnblogs.com/lszz/p/13789774.html
頁: [1]
查看完整版本: 汇编语言实验一