本次实验中需要用到的命令:
- - R:查看和修改 CPU 中寄存器的内容
- - D:查看内存中的内容
- - E:修改内存中的内容(可以写入数据或者指令,在内存中,它们实际上没有区别)
- - U:将内存单元中的内容翻译为机器指令和汇编指令
- - T:执行 CS:IP 指向的内存单元处的指令
- - A:以汇编指令的形式向内存中写入指令
实验任务:
(一)使用 Debug,将下面的程序段写入内存,逐条执行,并观察每条指令执行后 CPU 相关寄存器的内容变化
- B8 20 4E ----------------------- mov ax,4E20H
- 05 16 14 ----------------------- add ax,1416H
- BB 00 20 ----------------------- mov bx,2000H
- 01 D8 ----------------------- add ax,bx
- 89 C3 ----------------------- mov bx,ax
- 01 D8 ----------------------- add ax,bx
- B8 1A 00 ----------------------- mov ax,001AH
- BB 26 00 ----------------------- mov bx,0026H
- 00 D8 ----------------------- add al,bl
- 00 DC ----------------------- add ah,bl
- 00 C7 ----------------------- add bh,al
- B4 00 ----------------------- mov ah,0
- 00 D8 ----------------------- add al,bl
- 04 9C ----------------------- add al,9CH
可以使用 E 命令或者 A 命令向内存中写入指令。注意用 T 命令执行的时候, CS:IP 的指向。
其中 E 命令是写入机器码,A 命令写入汇编指令。
上面总共有 14 条指令,其中前 7 条指令我使用 E 命令写入内存,后 7 条指令使用 A 命令写入内存。
下面是动图演示向内存中输入指令的过程:
可以看到我在使用汇编指令的方式输入的时候,第一条指令输入 mov bx,0026H 报错了,是因为向 8086PC 机内存输入指令的时候,默认使用的是 16 进制,所以不需要在指令中指明。
下面动图演示使用 T 命令执行上述写入的各条指令,注意内存中寄存器的内容变化,特别是 CS 和 IP 的内容是如何变化的。
可是看到为了执行我们输入内存中的指令,首先我将 CS 的值置为 1000H,然后将 IP 的值置为 0000H,这下 CPU 接下来执行的第一条指令就是从内存单元的 1000:0 开始。
然后我使用了 14 个 T 命令,完成了指令的执行,在执行过程中可以仔细注意各个相关寄存器内容的变化。
(二)将下面 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指令计算 2 的 8 次方
- mov ax,1
- add ax,ax
- jmp 2000:0003
将指令写入内存后,执行 T 命令,直到 AX 中的值为 0100H。
动图演示如下:
首先写入指令后,照样是将 CS:IP 的值设置为 2000:0,即第一条需要执行的指令地址。
然后输入 T 指令执行,这道题使用了 jmp 这条汇编指令,例如 jmp 2000:0003 即是将 CS 中的值置为 2000H ,IP 中的值置为 0003H。
这样我们在指令执行的过程中没有去主动的修改过 CS:IP 的值,而是通过内存单元中的一条指令来完成的。
(三)查看内存的内容
PC机主板上的ROM写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
使用 D 命令去内存中的相关区域查看,动图演示如下:
首先用 D 命令查看了这段生产日期为 06 / 23 / 99 且内存地址单元为 ffff:5 ~ ffff:c
然后我使用 E 命令向该段内存中写入 8 个字节,试图修改这段内存的内容。
点击确认后再次查看该段内存的内容还是没变,说明了ROM 中的内容是不可改变的。
下面是 8086PC 机内存地址空间分配情况:
(四)向内存从 B8100H 开始的单元中填写数据
如:B810:0000 01 01 02 02 03 03 04 04
请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。
动图演示如下:
明显观察到图中右上方出现了变化,当输入不同数据时,出现的图形和颜色也不同。
这说明了上面那个内存起始地址是处于显存的范围,向里面写入数据其实是在向显存中写入数据,显卡再将显存中的数据输出到屏幕上。
(完)