实验一 用机器指令和汇编指令编程——汇编语言实验
<p>1.教材实验一结论</p><p>(1)将下面的程序段分别用e命令和a命令两种方式写入内存</p>
<div class="cnblogs_code">
<pre>b8 <span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)"> 4e mov ax,4E20H
</span><span style="color: rgba(128, 0, 128, 1)">05</span> <span style="color: rgba(128, 0, 128, 1)">16</span> <span style="color: rgba(128, 0, 128, 1)">14</span><span style="color: rgba(0, 0, 0, 1)"> add ax,1416H
bb </span><span style="color: rgba(128, 0, 128, 1)">00</span> <span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)"> mov bx,2000H
</span><span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)"> d8 add ax,bx
</span><span style="color: rgba(128, 0, 128, 1)">89</span><span style="color: rgba(0, 0, 0, 1)"> c3 mov bx,ax
</span><span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)"> d8 add ax,bx
b8 1a </span><span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)"> mov ax,001AH
bb </span><span style="color: rgba(128, 0, 128, 1)">26</span> <span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)"> mov bx,0026H
</span><span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)"> d8 add al,bl
</span><span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)"> dc add ah,bl
</span><span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)"> c7 add bh,al
b4 </span><span style="color: rgba(128, 0, 128, 1)">00</span> mov ah,<span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(128, 0, 128, 1)">00</span><span style="color: rgba(0, 0, 0, 1)"> d8 ad al,bl
</span><span style="color: rgba(128, 0, 128, 1)">04</span> 9c add al,9CH</pre>
</div>
<p>e命令写入0100:0开始的内存单元,并用u命令查看</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009150331928-390105533.png"></p>
<p> 或者使用a命令写入0100:0开始的内存单元</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009152422518-882732768.jpg"></p>
<p> 修改CS寄存器中的内容为0100,IP寄存器中的内容为0000后,使用t命令,逐条执行这个程序段</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009150722658-115548736.jpg"></p>
<p>可以发现AX,BX中的内容随着指令中的执行而改变,IP寄存器中的内容在执行完一个指令后,会自动指向下一条指令的地址</p>
<p>(2)将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方</p>
<div class="cnblogs_code">
<pre>mov ax,<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
add ax,ax
jmp </span><span style="color: rgba(128, 0, 128, 1)">2000</span>:<span style="color: rgba(128, 0, 128, 1)">0003<br></span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009153051784-1943743487.jpg"></p>
<p>接下来用t命令执行这个程序段</p>
<p>调试开始(ax起初是0):</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009153217491-88609503.png"></p>
<p> </p>
<p>调试结束(ax最后为8):</p>
<p> <img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009153316790-1745579398.png"></p>
<p>(3)查看内存中的内容</p>
<p>从FFF00H~FFFFFH中找到生产日期,并试图改变它</p>
<p>找到类似生产日期的位置在FFF0:00F5至FFF0:00FC内存单元中</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009154037400-2003601395.png"></p>
<p> </p>
<p>试将其值修改为09/10/20</p>
<p> <img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009154438301-776321303.png"></p>
<p> </p>
<p> 可见修改值的操作无效,因为向地址C0000~FFFFF的内存单元中写入数据是无效的,因为它是一个只读存储器ROM</p>
<p>(4)向内存从B8100H开始的单元中填写数据</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009154953956-1228889824.png"></p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009155030467-217702318.png"></p>
<p> </p>
<p> 可以看到向B8100开始的内存单元中修改数据,会显示出一些彩色的图标,这是因为A0000~BFFFF在8086PC机内是显存地址空间</p>
<p>2.教材实验二结论</p>
<p>(1)使用debug将下面的程序段写入内存,逐条执行</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mov ax,0022
mov ds,ax
mov ax,</span><span style="color: rgba(128, 0, 128, 1)">2200</span><span style="color: rgba(0, 0, 0, 1)">
mov ss,ax
mov sp,</span><span style="color: rgba(128, 0, 128, 1)">0100</span><span style="color: rgba(0, 0, 0, 1)">
mov ax,[</span><span style="color: rgba(128, 0, 128, 1)">0</span>] ax= 5150<span style="color: rgba(0, 0, 0, 1)">
add ax,[</span><span style="color: rgba(128, 0, 128, 1)">2</span>] ax =<span style="color: rgba(0, 0, 0, 1)"> A4A2
mov bx,[</span><span style="color: rgba(128, 0, 128, 1)">4</span>] bx= 5554<span style="color: rgba(0, 0, 0, 1)">
add bx,[</span><span style="color: rgba(128, 0, 128, 1)">8</span>] bx =<span style="color: rgba(0, 0, 0, 1)"> ACAA
push ax sp </span>=<span style="color: rgba(0, 0, 0, 1)">00FE 修改的内存单元的地址是: 2200:00FE内容为:A4A2
push bx </span>sp =00FC 修改的内存单元的地址是: 2200:00FC内容为:ACAA</pre>
<pre><span style="color: rgba(0, 0, 0, 1)">pop ax </span>sp =00FE AX=ACAA</pre>
<pre><span style="color: rgba(0, 0, 0, 1)">pop bx </span>sp =00FC BX = A4A2</pre>
<pre><span style="color: rgba(0, 0, 0, 1)">push [</span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">] </span>sp = 00FE修改的内存单元的地址是:2200:00FE 内容为:5554</pre>
<pre><span style="color: rgba(0, 0, 0, 1)">push [</span><span style="color: rgba(128, 0, 128, 1)">6</span>] sp = 00FC 修改的内存单元的地址是: 2200:00FC内容为:5756</pre>
</div>
<p>a指令书写程序:</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009190531462-345707374.png"></p>
<p>内存单元改写:</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009191406469-29539346.png"></p>
<p> 调试开始:</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009191334545-1075585697.png"></p>
<p>调试过程:</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009191623649-54622511.png"></p>
<p> </p>
<p>调试结束:</p>
<p> <img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009192021850-597619255.png"></p>
<p>(2)运行以下程序,并分析为什么2000:0~2000:f中的内容会发生改变</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009183704871-1208498904.png"></p>
<p>修改2000中的内容</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009183903502-1590643716.png"></p>
<p> </p>
<p>mov ax,2000:将2000送入寄存器ax中</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009185050830-2050487717.png"></p>
<p> </p>
<p> mov ss,ax mov sp,10:将ax中的值作为栈的段地址,并将sp中的值设置为10,内存单元中值的变化可能是为了标识这个空间是一个栈</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009185151892-111264023.png"></p>
<p> </p>
<p>mov ax,3123:将3123送入寄存器中</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009185408894-533378372.png"></p>
<p> </p>
<p> push ax:将ax中的内容压入栈</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009185852364-469998164.png"></p>
<p> </p>
<p>mov ax,3366:将3366送入ax中</p>
<p><img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009185943707-793661723.png"></p>
<p> </p>
<p> push ax:将ax中的值压入栈</p>
<p> <img src="https://img2020.cnblogs.com/blog/2139700/202010/2139700-20201009190043290-36125796.png"></p>
<p> </p>
<p> 前三行汇编语言指令的意思是:设置栈的起始地址为2200:0,并设置栈的大小为10</p>
<p>五、实验总结</p>
<p>学会了dosbox中的debug工具的几个常用指令</p>
<p>实践的知识:8086机的内存空间的划分,内存单元地址的编写,栈的使用</p>
<p>仍未解决的知识:申明栈空间时的存储空间中的一串乱码究竟是何含义?为什么执行mov ss,ax操作时,顺便执行了mov sp,10</p><br><br>
来源:https://www.cnblogs.com/haozhenglong/p/13785877.html
頁:
[1]