实验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 的值发现,当数据入栈时并未覆盖该地址原来的值,而是数据整体前移,不明白这是否与栈顶超界问题有关,或是其他处理机制。

posted @ 2020-10-10 22:46  wyyhhh  阅读(312)  评论(2)    收藏  举报