实验1 用汇编指令和机器指令编程

一.实验目的

     1.熟练掌握使用debug工具编写和调试x86汇编命令的方法

     2.掌握8086CPU,寄存器,内存的基础知识

     3.理解并掌握内存中多字节数据的存放:小端法

     4.理解并掌握栈内存空间的特性和使用

     5.掌握指令mov,add,sub,jmp,push,pop的基础用法

二.实验准备

     1.复习教材1-2章内容,完成教材内相关检测点

     2.复习教材第3章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop ,完成教材 3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2

     3. 结合教材实验1(P35)和课程QQ群文件中的文档,学习debug工具用法。

三.实验内容

      1.教材实验1

      练习教材P35-45「预备知识:Debug的使用」,学习debug启动、退出及常用指令用法; 在练习基础上,完成「2. 实验任务」

    2.教材实验2

       练习「1.预备知识:Debug 的使用」 在练习基础上,完成「2. 实验任务」

四.实验结论

   1.教材实验1结论

        #实验任务(1)

        首先使用e命令写入内存,如下所示:

               

 

               使用t命令执行之后的结果如下所示:

               

               然后使用a命令写入内存:

               

               t命令执行结果如下:

               

              # 实验任务(2)

              实验要求计算2的8次方的结果,使用 mov ax,1;add ax,ax;jmp 2000:0003;三条命令完成操作。一二步就是计算出1+1,然后当使用jmp时,那么就跳回到第二条指令add ax,ax;也就是把得到的2再次进行翻倍,然后计算2的8次方则只需要重复七次jmp指令就可以做到了,其具体代码如下所示:

              

 

 

             然后可以看到ax部分已经得到最后的结果是0800(16进制),如下所示:

             

 

             #实验任务(3)

              查看内存内容,题目中已经给出了内存范围是FFF00H~FFFFFH,然后只需要使用 d指令对内存进行检索就可以了,结果如下所示:
              

 

              然后尝试使用e指令去改变生产日期,发现无法更改,考虑到这个日期存在于系统的ROM区,所以不允许修改。

              #实验任务(4)

              向内存中填写数据 -e b810:0010 01 01 02 02 03 03 04 04,然后观察产生的变化:

              

 

              可以看到,在图片的右上角出现了几个小图标,A0000~BFFFF对应的是显存地址,所以在地址段中输入数据时会在显示器上面显示出来。

      2.教材实验任务(2)

              #实验任务(1)

             使用debug,将如下程序写入,并且依据情况填空:
             

mov ax,0022
mov ds,ax

mov ax,2200
mov ss,ax

mov sp,0100

mov ax,[0]           ;ax=5150
add  ax,[2]           ;ax=A4A2
mov bx,[4]           ;bx=5554
add  bx,[6]           ;bx=ACAA

push ax                ;sp=00FE;修改的内存单元的地址是2200FE,内容为A4A2
push bx                ;sp=00FC;修改的内存单元的地址是2200FC,内容为ACAA
pop ax                  ;ax=ACAA
pop bx                  ;bx=A4A2

push [4]               ;sp=00FE;修改的内存单元的地址是2200FE,内容为5554
push [6]               ;sp=00FC;修改的内存单元的地址是2200FC,内容为5756

 

     首先修改内存单元中的数据,-e  0022:0 50 51 52 53 54 55 56 57

          具体代码如下所示:

          

 

          然后输入上述的代码:

          

 

 

          然后使用t命令按部执行,如下所示结果:

                     

          

 

                     

          

 

          

 

 

          可以从执行结果中看到与之前的填空结果一致。

          #实验任务(2)

          输入书中的执行代码,然后使用d命令查看每一步内存单元的数据结果,如下所示:

         

 

          

 

          

          在上图中可以看出,每一步mov指令的执行,内存单元中数据都在前移,类似一个堆栈的过程,所以dos本身就存在了一个栈,当系统没有指定栈内存时,则使用这个默认的栈去存储数据,其中mov sp,10,则是指定了一部分的栈内存,起始位置是2000:0010,可以看到当push ax之后,sp=000E,

          所以,不断使用mov命令对ax内存单元赋值,可以看到也是与之相对应的一个堆栈过程。

     五.实验总结

        1.在本次实验中,我了解了如何使用汇编命令和机器指令去编写一些简单的程序,例如计算2的次方,然后就是在编写好汇编指令后,使用t命令去一步一步的跟踪执行,可以清楚的看到每一步中内存单元中的变化,同时使用d命令可以查看内存单元中的数据变化,都帮助我更加清楚的了解了其中的工作原理。

          2.关于堆栈的部分,可以知道在dos中本身存在了一个栈,每一次mov的赋值都是一个堆栈的过程,当分配了栈空间后,则使用分配好的栈内存,同时内存中数据的栈存储方式是小端法,也就是数据高位存在内存高位,数据低位存在内存低位,需要在取出数据时注意到这一点,理解大端与小端的区别所在。

 

 

 

          

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

               

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-10-11 22:25  月shang  阅读(169)  评论(1)    收藏  举报