一、实验结论

1.教材实验1结论

实验任务(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

①使用e命令将指令写入内存:

用e命令向从1000:0开始的内存单元写入机器码,用R命令查看CPU中寄存器状态,此时CS:IP指向073F:0100。

在使用t命令执行之前,必须先用r命令修改CS、IP中的内容,从而使CS:IP指向1000:0。

使用t命令单步调试写入的指令,CPU执行CS:IP指向的指令。

②使用a命令将指令写入内存:

用a命令,从一个预设的地址开始输入指令,在给出的起始地址后按Enter键表示结束。

用t命令单步调试。

实验任务(2)

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

mov ax,1
add ax,ax
jmp 2000:0003

使用a命令,以汇编语言向从2000:0开始的内存单元中写入指令,再使用r命令修改CS、IP中的内容。

对于单步调试较多的部分,只截取调试开始和调试出正确结果的部分。

调试开始部分:

调试出正确结果部分:

实验任务(3)

查看内存中的内容。

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

使用d命令查看,找到生产日期位于FFF0:00F5~FFF0:00FC,得知生产日期为1992年1月1日。

尝试使用e命令修改生产日期。

修改后再使用d命令查看日期并没有发生改变,所以修改失败。C0000~FFFFF是各类ROM地址空间,写入数据是无效的,相当于改写只读存储器中的内容。

实验任务(4)

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

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

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

向内存从B8100H开始的单元中填写数据,右上角出现了四个不同的图案:

只改变填写的数据,图案所在位置不变,但是图案的样式发生变化:

只改变填写的地址,屏幕中没有出现图案:

本以为结果应该是屏幕中出现位置不同但是与第一次结果相同样式的图案。通过阅读1.15节,得知从A0000~BFFFF的内存单元是显存地址空间,向显存中写入数据,这些数据才会被显示卡输出到显示器中。

教材实验2结论

为了便于验证实验结果,做如下两点调整:
① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H
② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022 
实验任务(1)
①使用e命令将内存单元0022:0~0022:f中的数据修改为50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H,修改后再用d命令查看是否正确写入的操作。
②使用a命令输入p74的指令。
③每一行指令单步调试。
 
 
 
④P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式复制在文档中。 对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致。如不一致,分析原因。
对于③单步调试的观察,与理论分析的结果一致。
实验任务(2)
① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改后查看的部分。
② 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化,并思考原因。
 
 
以文字方式陈述:
① 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?
汇编指令 功能
mov ax,2000 将数字2000H存入寄存器ax中
mov ss,ax 将存在寄存器ax中的数字2000H存入栈段寄存器ss中
mov sp,10 将数字10H存入栈地址寄存器sp中

mov sp, 10意味着安排2000:0000~2000:000F为栈空间,初始化栈顶。

初始栈顶为2000:0010,初始栈底为2000:0010。

② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。
在用t命令单步执行mov ss,ax后,显示出当前CPU各个寄存器的状态和下一步要执行的指令,应该是mov sp,10却变成了mov ax,3123。又发现在用t命令单步执行mov ss,ax前,ss=0b39,sp=ffee,而执行后ss=2000,sp=0010,说明mov sp,10得到了执行。显然,在用t命令执行mov ss,ax的时候,它的下一条指令mov sp,10也紧接着执行了。
这是因为中断机制。Debug的t命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

 

posted on 2020-10-15 17:38  夏梦陆离  阅读(389)  评论(4编辑  收藏  举报