汇编语言实验二
<p>一、实验目的<br>1. 理解并掌握汇编源程序组成与结构<br>2. 掌握汇编语言源程序编写→汇编→链接→调试的工具和方法<br>3. 理解汇编源程序中地址表示、段寄存器的用法<br>4. 理解和掌握寄存器间接寻址方式<br>5. 通过汇编指令loop的使用理解编程语言中循环的本质</p><p>二、实验准备<br>1. 学习/复习第5章使用和loop实现循环的编程应用示例(教材5.5节,5.8节)<br>2. 复习第3章「栈」的知识<br>3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法<br>4. 复习8086汇编中内存单元地址的表示,以及段寄存器DS, SS, ES, CS的用途</p>
<p>三、实验内容<br>1. 实验任务1<br>使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">;ex1.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<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, 0, 0, 1)">
mov ah, 4ch
</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>要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行,使<br>用debug工具调试可执行文件。<br>使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101153642914-1826760929.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154859308-224913283.png"></p>
<p>使用debug工具对程序进行调试<br>使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101153752164-37845031.png"></p>
<p>结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编<br>使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101153735293-1218706476.png"></p>
<p>2. 实验任务2<br>使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">; ex2.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov bx, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
mov ax, 101H
mov cx, </span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">
s: mov , ax
add bx, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
add ax, 101H
loop s<br></span>mov ah, 4ch<br>int 21h<br><em id="__mceDel">code ends<br></em><em id="__mceDel"><em id="__mceDel"><em id="__mceDel"><em id="__mceDel">end</em></em></em></em></pre>
</div>
<p>要求:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,使<br>用debug工具调试可执行文件。<br>使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154041378-189006004.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101155329104-1929444239.png"></p>
<p>使用debug工具对程序进行调试。<br>结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编<br>灵活使用t命令、p命令、g命令,对ex2.exe进行调试。(不一定要单步,有些地方可以用g<br>命令,一次执行多行汇编指令)</p>
<p>t命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154238805-1390629547.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154257371-2004772655.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154305921-1510181919.png"></p>
<p>p命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154315794-1715157774.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154326336-2114063214.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154336092-1665710525.png"></p>
<p>g命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154505368-1630271999.png"></p>
<p>把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101154523561-2128085641.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101155137530-576508622.png"></p>
<p>结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在<br>具体实现上有什么不同?</p>
<p>ex2.asm和ex1.asm实现的功能和效果相同,但具体表现不同,ex1是直接寻址,ex2是间接寻址。</p>
<p>3. 实验任务3<br>综合使用loop,,编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据<br>0237H。</p>
<div class="cnblogs_code">
<p>assume cs:code,ds:data<br>data segment<br>dw 0237H<br>data ends<br>code segment<br>start:<br>mov ax,data<br>mov ds,ax<br>mov ax,0b800h<br>mov es,ax<br>mov bx,160*11+60<br>mov di,0<br>mov dx,ds:<br>mov cx,16<br>s:<br>mov es:,dx<br>add bx,2<br>loop s<br> <br>mov ax,4c00h<br>int 21h<br> <br>code ends<br>end start</p>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101155929248-731536781.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101155939643-362503181.png"></p>
<p>把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101155958450-1826632291.png"></p>
<p>把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101160011794-757182840.png"></p>
<p>猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。</p>
<p>高位字节里存放的是颜色信息,低位字节存放的是数字信息。</p>
<p>4. 实验任务4<br>编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。</p>
<div class="cnblogs_code">
<pre><em id="__mceDel"><span style="color: rgba(0, 0, 0, 1)">assume cs:code
code segment
mov ax, 0020h
mov ds, ax
mov cx,</span><span style="color: rgba(128, 0, 128, 1)">64</span><span style="color: rgba(0, 0, 0, 1)">
mov bx,</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
s: mov ,bx
add bx,</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
loop s
mov ah,4ch
</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
code ends
end</span></em></pre>
</div>
<p>灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看<br>0:200~0:23F,确认是否将0~3F传送至此段内存区域。</p>
<p> <img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101212759527-51436897.png"></p>
<p>t命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101213030580-445025805.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101213040633-1660253761.png"></p>
<p>p命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101213053471-1612688342.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101213104032-682296581.png"></p>
<p>g命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101213129026-264777677.png"></p>
<p>d命令</p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101213144836-1624763619.png"></p>
<p>5. 实验任务5<br>教材实验4(3)(P121)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">; ex5.asm
assume cs:code
code segment
mov ax, cs
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
mov cx, 16h
s: mov al, ds:
mov es: , al
inc bx
loop s
mov 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/1616554/202011/1616554-20201101215949604-548558279.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101220000077-668989726.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101220049300-1799153625.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101220008665-364332044.png"></p>
<p><img src="https://img2020.cnblogs.com/blog/1616554/202011/1616554-20201101220102725-1767165106.png"></p>
<p>复制开始先要确定起始地址,由于程序的起始地址由CS:IP指定,所以第一个空填cs</p>
<p>第二个空的填写,我是先随便填写,然后用u命令反汇编得出mov ax,4c00h指令的地址为076A:0017,之后分别填写17h和16h,得出第二个空填写的是16h</p><br><br>
来源:https://www.cnblogs.com/linjiahao1035/p/13909869.html
頁:
[1]