微处理器原理与应用实验(汇编部分)——实验1.2 掌握DEBUG基本命令及其功能
实验具体内容
【上篇】查看CPU和内存,用机器指令和汇编指令编程
(1)使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。(逐条执行,每条指令执行结果截图)
提示:可用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,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
(2)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。(逐条执行,每条指令执行结果截图)
如果有问题请说明原因
汇编指令:
1 | mov ax,1000H |
(3)仔细观察下图中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
【上篇】查看CPU和内存,用机器指令和汇编指令编程
(1)
①用E命令从1000:0写入机器指令
②用D命令查看写入的机器指令
③用U命令将内存中的指令翻译为汇编指令
④用R命令查看寄存器情况
⑤用R命令修改CS和IP寄存器的值,使其指向需要执行的第一条指令
⑥用T指令单步执行CS:IP指向的指令
执行过程:
1 | ax=4E20H |
注:除了开始用E命令以机器指令向内存写入指令以外,还可以用A命令以汇编指令格式向内存写入机器指令:
用A命令从1000:0写入机器指令
(2)
①用A命令以汇编指令格式向以2000:0内存单元开头的代码段写入机器指令
②用T命令运行(注意观察寄存器AX的值,直到AX=0100H)
经观察发现,每次单步执行jmp 2000:0003后,CS:IP=2000:0003,即下一条指令将变为位于add ax,ax。经过循环使用add ax,ax指令,AX的值呈2倍增长,经过8次改指令后即可得到2的八次方。
(3)用D命令查看FFF00H~FFFFFH的内容
发现在FFF0:0050~FFF0:005B和FFF0:00F0~FFF0:00FF内有数据,且生产日期在FFF0:00F5~FFF0:00FC内存单元中(D命令显示的内容右边是每个内存单元中的数据对应的可显示的ASCII码字符,没有对应的ASCII码字符则用“.”代替)。
②尝试利用E命令将日期修改为2021/3/10(利用ASCII码对照表查出2021/3/10对应的十六进制码,将之写入相应的内存覆盖原有日期)
③写入后查询FFF0:00F5~FFF0:00FC内存单元中的数据
(这里是当时出现困惑从而进行二次写入)
发现FFF0:00F5~FFF0:00FC内存单元中的数据并没有被修改
修改失败
原因:在8086PC机内存地址中,C0000~FFFFF的内存单元为ROM(只读存储器),向其中写入数据的操作是无效的。
【下篇】用机器指令和汇编指令编程
(1)
①用A命令将指令以汇编指令的格式将机器指令写入以1000:0为起始内存单元的代码段中
②修改CS:IP,使其指向代码段第一条指令
③用T命令开始单步执行写入的指令:
利用AX中转改变DS的值为FFFFH
利用AX中转值使SS:SP=2200:0100,即指向22100H内存单元,为栈顶
下一条指令将访问数据段,即将DS:0000内存字单元的数据传送给AX,右下角注释着DS:0000内存字单元储存的数据。
完成对数据段的访问:
SS:SP=2200:0100指向栈顶单元,下一步SP=SP-2指向栈顶,将AX入栈到2200:00FE内存字单元。
查看2200:00FE内存子单元:
数据成功入栈
Push bx指令同理,SP=SP-2,将BX入栈到2200:00FC内存字单元:
执行POP AX和POP BX指令,执行各两条指令在数据出栈后,SP=SP+2(在本实验中结合前两步相当于利用栈段交换了AX和BX的值)
因为下一步即将访问数据段,所以右下角显示出将要访问的数据内存字单元的数据。
①SP=SP-2,将内存字单元FFFF:0004内存字单元入栈,栈顶2200:00FE
②SP=SP-2,将内存子单元FFFF:0006内存子单元入栈,栈顶2200:00FC
1 | mov ax,ffff |
(2)
①尝试用A命令将指令写入以1000:0000为起始内存单元的代码段
看到输入错误
原因:mov指令可以对段寄存器进行操作,但是add和sub指令不可以对段寄存器进行操作。
(3)
从指令上看,前三条指令并没有对内存进行任何操作,但为什么内存中的数据发生了变化?
原因:在使用T命令进行单步追踪的时候,产生了中断,为了保护现场,CPU将PSW、CS和IP依次入栈,而实验中查看的内存段刚好是栈段,所以看到这段内容的改变。