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

Posted 030507gz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验1 用机器指令和汇编指令编程相关的知识,希望对你有一定的参考价值。

1. 教材实验1结论 此部分书写内容: 教材实验1中「2. 实验任务」(P45)

实验任务(1) 机器码数据较多,只用前4行实验即可。 用t命令和a命令两种方式,写入内存。用t命令单步调试。

b8 20 4e    mov ax,4E20H
05 16 14    add ax,1416H
bb 00 20    mov bx,2000H
01 d8       add ax,bx

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

技术图片

可以发现内存中已经写入了相应的指令,

     使用-e命令写入内存:

技术图片

 -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从后往前写的。

 

以上是关于实验1 用机器指令和汇编指令编程的主要内容,如果未能解决你的问题,请参考以下文章

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

汇编语言实验1 查看CPU和内存,用机器指令和汇编指令编程

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

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

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

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