实验1 用机器指令和汇编指令编程
一、实验结论
1. 教材实验1结论
实验任务(1)
使用Debug,将下面的程序写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。
机器b码 汇编指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,2020H
01 d8 add ax,bx
①用E命令写入内存,并用T命令执行

通过d命令查看是否修改成功,用u命令反汇编查看对应的汇编语言

由于e命令写入内存时指定了地址,所以要将cs:ip修改为该地址

②用A命令写入内存,并用T命令执行

由于a命令写入内存时指定了地址,所以要将cs:ip修改为该地址

实验任务(2)
将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003


2的8次方为256即0100H=80H+80H=(40H+40H)+(40H+40H)=......=(1H+1H)+......+(1H+1H)
实验任务(3)
查看内存中的内容:在FFF00H~FFFFFH的某几个单元中写有一个生产日期,找到这个生产日期并试图改变它。


实验结果为修改失败
阅读第1章中的1.15节的内容后可知原因为:8086PC机中C0000到FFFFF为各类ROM地址空间,向地址
C0000~FFFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容。
实验任务(4)
向内存从B8100H开始的单元中填写数据:
只改变数据,不改变填写地址:

改变填写地址:

阅读第1章中的1.15节的内容后可知原因为:A0000到BFFFF为显存地址空间,向地址A0000~BFFFF的内存
中写数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上。
但是实验中b000:0处并未显示数据,故多次尝试如图:

可知显示数据的地址范围为:b800:0~b8f9:f,此处仍未明白为什么与书上范围不符,还望评分同学解答
2. 教材实验2结论
实验任务(1)
① 使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确
写入的操作

② 使用 a 命令输入 p74 指令

③ 每一行指令单步调试



push ax后:

push bx后:

push [4]:

push [6]

④ P74 中指令执行后各个寄存器填空结果

对于③单步调试的观察,与理论上分析的结果进行比较:
push ax,push bx修改的内存单元内容与实验结果不同,结果为A4A2 AAAC,理论分析结果为A2A4 AAAC
分析后找到原因:理论上分析时未注意小端法的运用
实验任务(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
mov ss,ax 设置栈的段地址,SS=2000H,不能直接向段寄存器SS中送入数据,所以用ax中转
mov sp,10 设置栈顶的偏移地址,因栈为空,所以设SP=0010H
初始时栈顶和栈底都是2000:0010
② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。
在用t命令执行mov ss,ax的时候,它的下一条指令也紧接着执行了,引发中断机制,CPU会将一些中断
例程使用的寄存器变量自动压栈到栈中
如图中标注的08 01 3F 07对应CS:IP的状态
二、实验总结
1.尚存的问题:
①具体见实验1的实验任务(4)
显示数据的地址范围为:b800:0~b8f9:f,与书上所写的8086PC机内显存地址空间A0000~BFFFF不符
②实验2的实验任务(2)仔细比对2000:0~2000:f 的值发现,当数据入栈时并未覆盖该地址原来的值,而是数据整体前移,不明白这是否与栈顶超界问题有关,或是其他处理机制。

浙公网安备 33010602011771号