汇编实验二 用机器指令和汇编指令编程

 

南京信息工程大学实验报告

实验名称   实验2 用机器指令和汇编指令编程   

实验日期    11.12              

得分          

学院    计软院  

专业    计科

年级    2017级   

班次    6班

姓名    江轲禹      

学号    20171308227       

一、实验目的

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 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式 复制在文档中。 对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致。 如不一致,分析查找原因。

 

 

修改前先用-d命令查看 0021:0~0021:f 的数据,再用e命令修改数据,修改后再用d命令查看是否正确写入

 

 

使用-a命令输入指令

 

 

用-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:FE内容为6462          

push bx         ;sp= 00FC  ;修改的内存单元的地址是2200:FC内容为6A6C       

pop ax           ;sp= 00FE  ;ax=6C6A              

pop bx           ;sp= 0100   ;bx=6462            

push [4]         ;sp= 00FE  ;修改的内存单元的地址是2200:FE内容为3435

push [6]         ;sp= 00FC  ;修改的内存单元的地址是2200:FC内容为3736   

 

以上命令将内存单元2200:FE和内存单元2200:FC的值进行了交换

通过观察不难发现,指令mov sp 0100似乎没有执行, 实际上,在T命令执行mov ss,ax时,下一条指令mov sp,0100 也紧接着被执行。

关于这点,书上是这么解释的:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行。

 

实验任务(2): 

① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改后查看的部分 

② 单步调试每一行汇编指令的截图。且每一条指令单步调试后,都使用 d 命令查看 2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单 元值的变化,并思考原因。

 

 

前三段指令的通过修改段寄存器SS和寄存器SP的值来修改栈顶的段地址和偏移地址 。

命令mov sp,0010修改了偏移地址,使得任意时刻SS:SP都指向栈顶元素,so~初始的栈顶元素为0010?

五、总结与体会

通过本次实验

1)对栈的概念以及栈元素的存放和修改有了进一步的了解

2)了解到”Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行”

3)关于中断机制(以下内容摘自百度百科):

众所周知,处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的办法,显然降低内核效率。

既然硬件的响应这么慢,那么内核就应该在此期间处理其他事务,等到硬件真正完成了请求的操作之后,再回过头来对它进行处理。想要实现这种功能,轮询(polling)可能会是一种解决办法。可以让内核定期对设备的状态进行查询,然后做出相应的处理。不过这种方法很可能会让那个内核做不少无用功,因为无论硬件设备是正在忙碌着完成任务还是已经大功告成,轮询总会周期性的重复执行。更好的办法是由我们来提供一种机制,让硬件在需要的时候再向内核发出信号(变内核主动为硬件主动),这就是中断机制。
 
中断使得硬件得以与处理器进行通信。举个例子,在你敲打键盘的时候,键盘控制器(控制键盘的硬件设备)会发送一个中断,通知操作系统有键按下。中断本质是一种特殊的电信号,由硬件设备发向处理器。处理器接受到中断后,会马上向操作系统反映此信号的到来,然后就由os负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步——换句话说就是中断随时可以产生。因此,内核随时可能因为新到来的中断而被打断。
 
不同的设备对应的中断不同,而每个中断都通过一个惟一的数字标识。因此,来自键盘的中断就有别于来自硬盘的中断,从而使得操作系统能够对中断进行区分,并知道哪个硬件设备产生了哪个中断。这样,操作系统才能给不同的中断提供不同的中断处理程序。
 
在它执行程序的时候,如果有另外的事件发生(比如用户又打开了一个程序)那么这时候就需要由计算机系统的中断机制来处理了。
 
中断机制包括硬件的中断装置和操作系统的中断处理服务程序。
 
让硬件在需要的时候再向内核发出信号。
 

转载于:https://www.cnblogs.com/jiangkeyu/p/9977934.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值