实验一

实验结论

  1、使用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

  (1)E命令

    进入debug后,用 r 命令查看各个寄存器的值,此时AX、BX的值均为0,CS:IP指向为 073F:0100。

    

    用 e 命令写入程序的机器码如下,不区分大小写。如果与原来的值相同,则可以直接按空格键编辑下一个内存单元(e 后的 0100 不可省略,表示从段地址为当前段地址,偏移地址为 0100 的内存单元开始写入机器码,即当前CS:IP所指向的内存单元)。

    

    再次使用 r 命令,可以看到各寄存器的值没有改变,但是CPU下一步要执行的指令变成了“MOV AX, 4E20”,也就是机器码“b8 20 4e”对应的汇编指令。

    

    用 t 命令单步执行以上程序,此时 t 后的“=0100”可以省略,表示从当前CS:IP所指向的内存单元开始执行指令,而当前IP的值就是0100,但是若要写则不能忘记加上“=”。AX中的值变为了4E20H,CS未变化,而因为“b8 20 4e”一共占用三个内存单元,IP的值变为0103。下一条指令为“ADD AX, 1416”。

    

    继续使用 t 命令单步执行。AX中的值变为6263H(=4E20H + 1416H),CS的值未变化,IP的值变为0106。

    

    继续使用 t 命令,AX未变,BX的值变为2000H,CS未变,IP变为0109。

    

    以此类推,最终AX的值会变成0002H,BX的值会变成4026H,IP的值变成0121,而由于代码中没有出现“JMP”,所以CS的值没有变化过。

    

  (2)A命令

    退出 debug 环境后用 cls 命令清除屏幕上的内容,重新进入debug,用 r 命令查看各寄存器的值,与 e 命令中一样,AX、BX的值为0,CS:IP指向073F:0100。用 a 命令输入指令如下(a 后可以不写地址;数据后面不可写“H”,否则会报错):

    

    此后的执行步骤和结果和 e 命令中一样,便不再一一赘述。

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

        mov ax, 1

        add ax, ax

        jmp 2000:0003

    进入 debug 环境,先用 r 命令查看各寄存器的值如下:

    

    使用 a 命令,从 200:0 开始的内存单元开始写入指令,此时要写入指令的内存单元与当前的CS:IP不同,所以 a 后要写明地址。

    

    使用 t 命令单步执行,此时 t 后一定要写“=2000:0”。AX中的值变为0001H,CS的值为2000,IP的值为0003。

    

    继续使用 t 命令,AX的值变为0002H,下一条要执行的指令为“JMP 0003”,也就是说跳到上一步继续执行,这就相当于高级语言中的循环结构。

    

    在执行过 8 次“ADD AX, AX”指令后可以求得 2 的 8 次方为 0100H,也就是十进制数的 256。

    

  3、查看内存中的内容。

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

    使用 d 命令查看从FFF00H~FFFFFH的内存单元中的内容,可以发现生产日期在FFFF5H~FFFFCH这 8 个内存单元中,生产日期为01年01月92日。

    

    接着使用 e 命令修改FFFF5开始的 8 个内存单元中的内容。

    

    再次使用 d 命令查看FFF00H~FFFFFH内存单元中的内容,发现生产日期并没有被改变,依旧是 01/01/92。

    

  4、向内存从 B8100H 开始的单元中填写数据,如:

   -e  B810:0000    01 01 02 02 03 03 04 04

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

    第一次:-e  B810:0000    01 01 02 02 03 03 04 04 ,在屏幕右上角出现了四个不同的图案。

    

    第二次:修改前四个数据,-e  B810:0000    12 09 01 13 03 03 04 04 ,前面两个图案有变化,后两个没有变化。

    

    第三次:修改后四个数据,-e  B810:0000    01 01 02 02 18 69 27 00 ,只出现了三个图案,前两个图案没有变化,最后一个图案改变。

    

    第四次:修改填写的地址,-e  2000:0000    01 01 02 02 03 03 04 04 ,屏幕上不再出现任何图案。

    

 

总结与体会

   1、使用 DOSBox 的方法(由于在 64 位 Win7 及以上环境 / Mac OS / Linux 下,不支持直接使用 debug ,所以需要借助虚拟 dos 环境模拟器 DOSBox):

      打开DOSBox后,先创建一个虚拟盘(名字自定),再将本机中真实的包含 debug 文件的文件夹 masm 放入虚拟盘中,接着将工作环境切换到虚拟盘下,最后进入 debug 调试环境,具体操作如下图:

    

  2、实验任务一中,如果使用 “-e 地址 数据表” 这种格式来输入机器码的话,只能输入有限个数据,无法将此任务中给出的所有机器码一次性输入,而要分两次输入,此时就需要计算接下来要输的机器码的地址,相对来说较为麻烦,所以我选择了另一种格式:“-e 地址” ,按下回车键后开始修改内存单元的值,按空格跳到下一个内存单元。

  3、实验任务二,在我操作的过程中,是无法使用 g 命令一次性执行这个程序的,只能用 t 命令单步执行,那么是否存在比 t 命令更简便的运行方法呢?

  4、实验任务三中的生产日期无法修改是因为生产日期是写在主板上的 ROM 中的,而 ROM 是只读存储器,只能读取不能写入。但从实验截图来看,生产日期是01年01月92日,显然这个时间是不存在的。那么,是否是因为DOSBox是虚拟环境,导致它读取的并不是电脑主板上真正的信息,所以生产日期是一个不规范的日期呢?

  5、在实验任务四中发现,只有向从 B810:0000 开始的内存单元中输入的数据才会转换成图案显示在屏幕上。通过阅读书上1.15节的内容,了解到从A0000~BFFFF的内存单元是显存地址空间,所以向 B810:0000 开始的内存单元写数据就是向显存写数据,这些数据转换成ASCLL码后又会被显卡输出到显示器上。

posted @ 2018-10-27 20:01  翎安  阅读(276)  评论(2编辑  收藏  举报