实验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 |
1.用e命令写入前两条指令
查看结果:
2.用a命令写入后两条指令
查看结果:
3.使用t命令单步调试
实验任务(2)
将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
1.使用a命令写入上述指令
2.修改CS与IP的值
3.使用t命令单步调试
此处只给出前两步与最后的调试结果
最终结果:AX=0100H=256(10) 即2的8次方
实验任务(3)
PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。
1.使用d命令查看内存FFF00H~FFFFFH内容
可观察到生产日期为1992年1月1日。
2.尝试修改内容
修改失败
失败原因:该地址为ROM地址空间(只读)
实验任务(4)
向内存从B8100H开始的单元中填写数据
写入第一组数据
写入第一组数据
可观察到第二行会出现彩色图标。
原因:8086中A0000~BFFFF为显存地址空间。
教材实验2
实验任务(1)
使用debug将下面的程序段写入内存,逐条执行
为了便于验证实验结果,做如下两点调整:
① 在使用 a 命令输入指令调试之前,先使用 e 命令将内存单元 0022:0 ~0022:7连续 8 个字
节数据修改为 50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H
② 将 P74 实验任务(1)中第1行的 mov ax, ffff → 改为 mov ax, 0022
mov ax,0022
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax = 5150H
add ax,[2] ;ax = A4A2H
mov bx,[4] ;bx = 5554H
add bx,[6] ;bx = ACAAH
push ax ;sp = 00FEH 修改的内存单元的地址是 2200:00FE(220FEH) 内容为 A4A2H
push bx ;sp = 00FCH 修改的内存单元的地址是 2200:00FC(220FCH) 内容为 ACAAH
pop ax ;sp = 00FEH ax = ACAAH
pop bx ;sp = 00FCH bx = A4A2H
push [4] ;sp = 00FEH 修改的内存单元的地址是 2200:00FE(220FEH) 内容为 5554H
push [6] ;sp = 00FCH 修改的内存单元的地址是 2200:00FC(220FCH) 内容为 5756H
调试过程:
书P74各个寄存器填空结果见上文代码块内容,观察得知与实际单步调试结果相符。
实验任务(2)
观察书P75图3.19的实验过程,分析:为什么 2000:0~2000:f 中的内容会发生改变?
1.使用a命令输入7行指令
2.修改并查看2000:0~2000:f的内容
3.单步调试
-
mov ax,2000
将2000H送入寄存器ax -
mov ss,ax
mov sp 10
将寄存器ax内容送入 ss (栈的段寄存器),并将sp设为10Hmov sp,10
不是省略了,而是在执行mov ss,ax
时一起执行。这是为了确保对ss段寄存器和栈指针的修改不被破坏。 -
mov ax,3123
将3123H送入寄存器ax -
push ax
将寄存器ax中内容压入栈 -
mov ax,3366
将3366H送入寄存器ax -
push ax
将寄存器ax中内容压入栈
-
分析2000:0~2000:f内容变化的原因:
-
单步中断时会将CS,IP入栈
-
指令执行将ax寄存器内容入栈
-
-
前3行汇编指令的功能
mov ax,2000 ;将2000H送入寄存器ax mov ss,ax ;将寄存器ax内容送入ss(栈的段寄存器) mov sp,10 ;将sp(偏移地址)设为10H
初始时栈顶和栈底都为2000:0010(20010H)
-
基于单步调试观察到的变化,给出你对此的思考及可能原因分析
- 这次实验d指令观察的是一段栈的内容
- 单步调试会引发单步中断,CPU会将一些寄存器(CS,IP)内容自动入栈
- 使用
push
或pop
指令入栈出栈也会造成栈的数据更改