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

实验结论spa

1.教材实验一结论3d

  实验任务(1)指针

    首先使用-a方式将汇编指令写入内存中:调试

    

 

 

     能够发现内存中已经写入了相应的指令,blog

     使用-e命令写入内存:ip

 

     

     -e表示使用十六进制形式写入内存,此时反编译能够发现内容与以a写入相同:
内存

    

 

 

     使用-t单步运行此汇编代码。编译

    CS(Code segment)代码段寄存器   IP(Instructor  point)指令指针寄存器变量

     1.此时CS寄存器的值为073FH,IP寄存器的值为0100H,cpu到地址073f:0100H物理地址的内存中寻址,程序

     获得命令mov, AX, 4E20H,因而将AX寄存器的内容修改成4E20H,并将IP寄存器的值修改成0100H+3(指令长度) = 0103H

     此时,AX寄存器的值改变为4E20H,IP寄存器的值改变为0103H,实验发现实验结果与预期符合的很好。

     

 

     2.CPU访问物理地址为CS:IP,即地址073F:0103H,获得下一条指令为ADD AX,1416,

    此时,AX <-  AX + 1416H,IP寄存器的值修改成0103H+3(指令长度) = 0106H。

    AX的理论值为6236H,IP的理论值为0106H,实验发现实验值与预期值符合的很好。

    

 

     3.CPU访问物理地址为073F:0106H的内存空间,获得下一条指令为MOV BX, 2000H

     BX  <-  2000H, IP  <-  IP+3(指令长度)

     BX的理论值为2000H,IP的理论值为0109H

     实验发现实验值与理论值符合的很好。

     

     4.CPU访问物理地址为073F:0109H的内存空间,获得下一条指令为ADD AX, BX

     AX  <-  AX+BX ,  IP  <-  IP+2(指令长度)

     AX的理论值为8236H, IP的理论值为010BH,实验发现实验值与理论值符合的很好。

          

 

  实验任务(2)

    首先使用A命令将指令写入2000:0000H开始的内存空间:

     

 

 

     此时使用u命令反编译能够发现内存中已经有指令了

      

    使用-t命令进行调试:

      

     CPU从CS:IP中获得命令并运行,将AX赋值为1,IP变为0003H

     接下来,ADD AX,AX  

     将AX <-  AX+AX,至关于AX  <-  AX x 2

     下一步, JMP 2000:0003H,

     至关于CS  <-  2000H,  IP  <-  0003H,

     接下来至关于屡次运行AX = AX *2,运行屡次能够获得2的8次方为256,十六进制形式为0100H

     

  实验任务(3)

    分析:物理地址为FFF00H-FFFFFH,能够解释为FFF0*16+00 - FFF0*16+FF

   总共FF个内存单元。

    即-e FFF0:00 LFF

    获得内存中内容以下:

    

 

 

     能够发现FFF0:00F5H - FFF0:00FDH为生产日期01/01/92,尝试修改其中内容:

     

 

     发现内存中的数据并无改变:

    

 

     查询8086CPU的内存分配图能够发现,该段区域属于ROM只读区域,不可修改。

     8086CPU的内存分配图以下:

    

 

     仔细想一想,若是一块主板的生产日期能够随意改变的话,记录这个生产日期的意义不足,一块2000年生产的主板能够被随意改变为2020年生产的,对维修业务很不友好。

 

  实验任务(4)

   从内存B8100H开始的内存单元写入数据:01 02 03 01 03 02 01 02

   使用-e 命令改变内存单元:

   

 

 

   能够发现出现了图案:

    

 

     改变写入的数据,发现图案也跟着变化:

     

 

   解释:查阅8086CPU内存分配能够发现:

   A0000H - BFFFFH属于显存地址空间,而B8100H开始的一小块地址空间正好属于这个区域,

   修改B8100H开始的一小块内存区域修改的为显存空间,所以会出现图案,而随着内存的改变,图案也会变化。

 2.教材实验二结论

实验任务一

1.先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字 节数据修改成 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H 

同时使用d命令查看内存内容,发现写入正确:

 2.使用a命令写入汇编代码:

 

 

 

 

 

 接下来开始单步执行:

1.mov ax,0022

将ax寄存器的值改变为0022。

 

 

 2.mov ds,ax

将ds的值修改成ax内的值,即将ds修改成0022H

 

 3.mov ax,2200

将寄存器ax的值改成2200H

 

 4.mov ss,ax

将ss寄存器的内容改成ax的内容2200H

 

 5.mov sp,0100

将sp内存器的值修改成0100,此时栈顶的物理地址为ss:sp即为22100H

 

6.mov ax,[0]

将ax寄存器的值修改成ds:0内存单元中的值

因为8086采用的是大端法,0022:0中的值为50,0022:1中的值为51,因此ax=5150H

 

 7.add ax,[2]

由上述分析可知,ax = ax + 5352H = A4A2H

 

 8.mov bx,[4]

将ax寄存器的值修改成ds:4内存单元中的值

因为8086采用的是大端法,0022:4中的值为54,0022:4中的值为55,因此bx=5554H

 

 

 9.add bx,[6]

由上述分析可知,bx = bx + 5756H = ACAAH

 

 

 

 10.push ax

表示ax进栈。

进栈后,sp = sp - 2 = 00FEH

被修改的内存单元为:

22100被修改成A4H

220FF被修改成A2H

 

 

 

 下为内存单元查看:

 

 

 实验值与理论值符合的很是好。

11.push bx

表示bx进栈。

进栈后,sp = sp - 2 = 00FCH

被修改的内存单元为:

220FE被修改成ACH

220FD被修改成AAH

 

 下为内存修改显示:

 

 12. pop ax

表示出栈,并将元素存在ax中。

出栈时,sp = sp + 2 = 00FEH

ax = ACAAH

 

 

 13. pop bx

表示出栈,并将元素存放在BX中,

出栈时,sp = sp  + 2 = 0100H

BX = A4A2H

 

14. push [4]

表示进栈,进栈元素为ds:4中的元素

sp = sp - 2 = 00FEH

被修改的内存单元为:

220FF被修改成55H

220FE被修改成54H

 

 

 

 

15.push [5]

表示进栈,进栈元素为ds:6中的元素

sp = sp - 2 = 00FCH

被修改的内存单元为:

220FD被修改成57H

220FC被修改成56H

实验任务二

 1.首先,使用e命令写入数据

 

 2.用a命令写入程序

 

 (1)mov ax,2000

 

 能够发现,ax寄存器变为2000,2000:0 - 2000:F的区域没有发生变化。

2.mov ss,ax

 

 将ss寄存器的值修改成ax中的值,此时ss为2000H,sp变为0010H

联想:0000H-0010H正好为16B的存储空间

观察几个改变了的内存的内容,为 00 20 00 00 08 01 3f 07 a3 01

由大端法的存储特色,能够猜测,其中内容分别为:

2000H 0000H 0108H 073FH 01A3H

2000H与 AX寄存器内容相同

0000H与BX CX DX内容相同

0108H与IP寄存器内容相同

073F与CS寄存器内容相同

01A3H没有找到。

通过查阅资料,我发现

设置栈顶位置后

会触发一次中断,栈会存储cs,ip和ax等的内容。

mov ss,ax执行后,mov sp,10当即执行,而后靠近栈顶的16个字节发生变化,对部分环境变量,如ss,ip,cs进行暂存,以保护现场。  

前三条命令执行事后,初始时的栈顶和栈底为:2000:0010

 

 

 

  

 

 个人思考:在mov ss,ax后,mov sp,0010被马上执行了。

数据是从2000:0010从后往前写的。

相关文章
相关标签/搜索