南京信息工程大学实验报告
实验日期 11.18
学院 计软院
专业 计科
年级 2017级
班次 6班
姓名 谢宏伟
学号 20171308260
一、实验目的
1. 熟练掌握使用debug工具编写和调试汇编命令的方法 2. 理解并掌握内存中多字节数据的存放 3. 理解并掌握「栈」内存空间的特性和使用 4. 理解并掌握8086汇编指令mov, add, sub, push, pop的用法
二、实验准备
1. 复习第 3 章「栈」的知识:栈的特性、寄存器 SS 和 SP、指令 push 和 pop 2. 完成教材 3.6~3.9 节内的问题 3.6~3.12,检测点 3.1~3.2 3. 结合教材实验1 (P35)及公邮文件中心→实验下的 “实验1辅助文档.pdf”复习debug 工具用法。
三、实验内容
1. 教材实验2(P71)
1)练习「1.预备知识:Debug 的使用」
2)在练习基础上,完成
「2. 实验任务」 补充: 为了便于验证实验结果,对「2. 实验任务」中的(1)做如下两点调整:
① 在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H
② 将 P74 实验任务(1)中第 1行的 mov ax, ffff → 改为 mov ax, 0021 实验前,请理论上分析指令执行后各个填空处的值,并记录下来。 实验时,通过在 debug 中调试,观察实验结果与理论分析是否一致,如不一致,尝试 发现问题所在,并分析原因。
四、实验结论
实验任务(1):
① 截图记录:使用 e 命令修改 0021:0~0021:f 数据,及修改后查看是否正确写入的操 作
② 截图记录:使用 a 命令输入的 p74 指令
③ 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)
④ P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式 复制在文档中。 对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致。 如不一致,分析查找原因。
1.先用d命令查看0021:0 到0021:7 之间的内容,并将其修改成要求的数据。其中我用e命令向内存写数据的方法错误了一下。随后更正,并且查看是否修改成功。
2.使用a命令输入P74页的指令,将第一行修改成mov ax,0021
3 使用t命令单步调试指令。
执行以上指令后,各寄存器内值的情况:
mov ax,0021
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax= 3130
add ax,[2] ;ax= 6462
mov bx,[4] ;bx= 3534
add bx,[6] ;bx= 6C6A
push ax ;sp= 00FE ;修改的内存单元的地址是2200:00FE内容为6462
push bx ;sp= 00FC ;修改的内存单元的地址是2200:00FC内容为6C6A
pop ax ;sp= 00FE ;ax=6C6A
pop bx ;sp= 0100 ;bx=6462
push [4] ;sp= 00FE ;修改的内存单元的地址是2200:00FE内容为3534
push [6] ;sp= 00FC ;修改的内存单元的地址是2200:00FC内容为3736
以上指令可以看出,先把ax,bx先后压入栈,然后把ax先出栈,再将bx出栈,这就使得ax和bx中的数据发生了交换。
这就是栈的特性所带来的,先入后出。
并且该指令中有一行mov sp,0100并没有显示出代码,而是默认执行了。这一点书上提到了,说以后的课程会深入了解。
实验任务二
该段指令原先ss:sp是0b39:ffee
此时显示了2000:0000 的16个数据是我刚刚修改的0.
但是又将ss:sp修改为2000:0010
这就导致指向的栈顶被更改,再查看2000:0000内存单元时,数据则显示了不同。
我的总结体会:
首先对于栈,我有了一个基本的概念,就是最后进入的会先出来。
段寄存器SS和寄存器SP
SS:SP是在任意时刻都指向栈顶元素。即栈顶。
栈的设置格式
mov ax ,1000
mov ss,ax
mov sp ,0010
在这当中,t命令会直接执行mov sp,0010 这一步。
push指令:(1)SP=SP-2;(2)向SS:SP指向的字单元中送入数据。
pop指令:(1)从SS:SP指向的字单元中读取数据;(2)SP=SP+2
对于栈的越界我们要自己考虑8086 cpu并不会限制我们,它只能记录栈顶位置。