汇编语言实验一

时间:2022-04-05 04:50:40

本次实验中需要用到的命令:

  • - 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 

请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。

动图演示如下:

汇编语言实验一

明显观察到图中右上方出现了变化,当输入不同数据时,出现的图形和颜色也不同。

这说明了上面那个内存起始地址是处于显存的范围,向里面写入数据其实是在向显存中写入数据,显卡再将显存中的数据输出到屏幕上。

(完)