实验具体内容

【上篇】查看CPU和内存,用机器指令和汇编指令编程

(1)使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。(逐条执行,每条指令执行结果截图)

img

提示:可用E命令和A命令以两种方式将指令写入内存。注意用T命令执行时,CS:IP的指向。

(2)将下面3条指令写入2000:0开始的内存单元中,利用这三条指令计算2的8次方。

mov ax,1 (从2000:0开始的内存单元)

add ax,ax

jmp 2000:0003 (观察跳到什么地方了?)

(3)查看内存中的内容

PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图修改它。

【下篇】用机器指令和汇编指令编程

(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

image-20220211164729958

(2)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。(逐条执行,每条指令执行结果截图)

如果有问题请说明原因

汇编指令:

1
2
3
4
5
6
7
mov ax,1000H

mov ds,ax

mov ds,\[0\]

add ds,ax

(3)仔细观察下图中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

img

【上篇】查看CPU和内存,用机器指令和汇编指令编程

(1)

①用E命令从1000:0写入机器指令

img

②用D命令查看写入的机器指令

img

③用U命令将内存中的指令翻译为汇编指令

img

④用R命令查看寄存器情况

img

⑤用R命令修改CS和IP寄存器的值,使其指向需要执行的第一条指令

img

img

⑥用T指令单步执行CS:IP指向的指令

img

img

img

img

执行过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ax=4E20H

ax=ax+1416H

bx=2000H

ax=ax+bx

bx=ax

ax=ax+bx

ax=001AH

bx=0026H

al=al+bl

ah=ah+bl

bh=bh+al

ah=0

al=al+bl

al=al+9CH

注:除了开始用E命令以机器指令向内存写入指令以外,还可以用A命令以汇编指令格式向内存写入机器指令:

用A命令从1000:0写入机器指令

img

(2)

①用A命令以汇编指令格式向以2000:0内存单元开头的代码段写入机器指令

img

②用T命令运行(注意观察寄存器AX的值,直到AX=0100H)

img

img

img

img

经观察发现,每次单步执行jmp 2000:0003后,CS:IP=2000:0003,即下一条指令将变为位于add ax,ax。经过循环使用add ax,ax指令,AX的值呈2倍增长,经过8次改指令后即可得到2的八次方。

(3)用D命令查看FFF00H~FFFFFH的内容

img

发现在FFF0:0050~FFF0:005B和FFF0:00F0~FFF0:00FF内有数据,且生产日期在FFF0:00F5~FFF0:00FC内存单元中(D命令显示的内容右边是每个内存单元中的数据对应的可显示的ASCII码字符,没有对应的ASCII码字符则用“.”代替)。

②尝试利用E命令将日期修改为2021/3/10(利用ASCII码对照表查出2021/3/10对应的十六进制码,将之写入相应的内存覆盖原有日期)

img

③写入后查询FFF0:00F5~FFF0:00FC内存单元中的数据

img

(这里是当时出现困惑从而进行二次写入)

发现FFF0:00F5~FFF0:00FC内存单元中的数据并没有被修改

修改失败

原因:在8086PC机内存地址中,C0000~FFFFF的内存单元为ROM(只读存储器),向其中写入数据的操作是无效的。

【下篇】用机器指令和汇编指令编程

(1)

①用A命令将指令以汇编指令的格式将机器指令写入以1000:0为起始内存单元的代码段中

img

②修改CS:IP,使其指向代码段第一条指令

img

③用T命令开始单步执行写入的指令:

利用AX中转改变DS的值为FFFFH

img

利用AX中转值使SS:SP=2200:0100,即指向22100H内存单元,为栈顶

img

下一条指令将访问数据段,即将DS:0000内存字单元的数据传送给AX,右下角注释着DS:0000内存字单元储存的数据。

完成对数据段的访问:

img

SS:SP=2200:0100指向栈顶单元,下一步SP=SP-2指向栈顶,将AX入栈到2200:00FE内存字单元。

img

查看2200:00FE内存子单元:

img

数据成功入栈

Push bx指令同理,SP=SP-2,将BX入栈到2200:00FC内存字单元:

img

img

执行POP AX和POP BX指令,执行各两条指令在数据出栈后,SP=SP+2(在本实验中结合前两步相当于利用栈段交换了AX和BX的值)

img

因为下一步即将访问数据段,所以右下角显示出将要访问的数据内存字单元的数据。

①SP=SP-2,将内存字单元FFFF:0004内存字单元入栈,栈顶2200:00FE

②SP=SP-2,将内存子单元FFFF:0006内存子单元入栈,栈顶2200:00FC

img

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mov ax,ffff

mov ds,ax

mov ax,2200

mov ss,ax

mov sp,0100

mov ax,\[0\] ;ax= C0EAH

add ax,\[2\] ;ax= C0FCH

mov bx,\[4\] ;bx= 30F0H

add bx,\[6\] ;bx= 6021H

push ax ;sp= 00FEH ;修改的内存单元的地址是 2200:00FF和2200:00FE 内容为 C0H和FCH

push bx ;sp= 00FCH ;修改的内存单元的地址是 2200:00FD和2200:00FC 内容为 60H和21H

pop ax ;sp= 00FEH ;ax= 6021H

pop bx ;sp= 0100H ;bx= C0FCH

push \[4\] ;sp= 00FEH ;修改的内存单元的地址是 2200:00FF和2200:00FE 内容为 30H和F0H

push \[6\] ;sp= 00FCH ;修改的内存单元的地址是 2200:00FD和2200:00FC 内容为 2FH和31H

(2)

①尝试用A命令将指令写入以1000:0000为起始内存单元的代码段

img

看到输入错误

原因:mov指令可以对段寄存器进行操作,但是add和sub指令不可以对段寄存器进行操作。

(3)

img

从指令上看,前三条指令并没有对内存进行任何操作,但为什么内存中的数据发生了变化?

原因:在使用T命令进行单步追踪的时候,产生了中断,为了保护现场,CPU将PSW、CS和IP依次入栈,而实验中查看的内存段刚好是栈段,所以看到这段内容的改变。