汇编与接口实验参考文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《汇编与接口第一次实验》
第一次实验
作业题目:
一、实验目的
1.进一步学习汇编语言基本指令使用方法;
2.学习DEBUG调试工具的基本使用方法;掌握debug调试命令a、u、r、d、t、g等
3.逐条观察程序指令的执行过程,理解指令的功能,理解程序自动、顺序地执行的概念,实践其过程(重点)。
二、实验题目
1.编写、输入一个32位二进制数相加程序,逐条执行指令,观察指令执行情况。
2.使用已经过汇编和连接的小程序(t3-2.exe),将其装入内存,逐条执行指令,观察执行过程和结果。在实验过程中,使用D命令修改XXX 和YYY单元中的数据,再重新计算其结果。4、如果在一个程序开始执行之前(CS)=0A7F0H(如果十六进制数的最高位为字母,则应该在其前加1个0),(IP)=2B40H,试问该程序的第1个字的物理地址是多少?
一.实验第一部分
1. 启动计算机的WINDOWS操作系统,在开始菜单中找到“运行”,输入“cmd”后回车,启动ms-dos command程序,再在该程序
内输入“DEBUG”并按回车,即启动DEBUG调试程序。
2. 开始编程
在启动的debug程序里输入a命令进入编程功能
在编程部分逐条输入32位二进制数相加程序的指令,完成无符号数10000100H和1200ffffH的加法操作,程序的代码见图1:
图1,程序编写,r指令(执行前),u指令
对32位数的低16位操作时,存放初始地址是0AE1:0100,
使用U命令对代码进行反汇编我们可以看到对应地址中所存放的指令和他们对应的长度,可以看到MOV和ADD指令的的长度都是3,但ADC的指令长度为4,因为ADC指令中需要考虑进位CF所以比MOV和ADD多了一位长度,如上图。
使用r命令后,可以看到指令执行前各寄存器的内容,CS:IP的内容为0100,下一条执行的指令为MOV AX,0100,操作数寻址为立即数寻址,内存单元的值为0100H。
图2
使用t命令单步执行指令后,所得结果见上图2,执行过程中,CS:IP的内容随指令长度的变化依次增加,标志位寄存器只有PF,CF的值在计算过程中有变化,其中在两次CF的标志位CY时表示有进位发生,OF一直为NV,表明计算结果没有溢出。
图3
对程序使用r命令查看寄存器AX,DX的值,见上图3,可知,AX=00FF,DX=2201,CF=0,说明运算结果低16位为00FF,高16位为2201,无进位,即结果是220100FF,计算正确。
图 4
使用d命令查看程序运行过后的结果如上图4,可以看到,内存单元的存放顺序是低地址放低字节,高地址放高字节,同时数据的存放是按顺序连续存放的,指令的存放与数据是同时的,都存放在连续的内存地址中。
图5
使用e命令对内存单元的内容进行修改,再次运行程序,可见结果也有了相应的改变。如下图。
图6
使用g指令再次运行程序,可以看到运算结果也相应改变。
图7
二.实验第二部分
图8
将写的asm文件转化成exe文件,如上图
图9
运行debug程序,u命令进行反汇编,查看程序内容,运行r命令查看寄存器内容和下一条将要执行的内容,由于这里我们并没有开始运行程序,因此寄存器的内容都为原初始内容,如上图。
图10
t指令运行程序,如上图,可以看到IP的值在对应着我们u命令查看的指令的地址进行递增。
在这几步中标志位发生变化有ZF和PF,其中在XOR DX DX时两个相同的数进行异或操作结果是零因此结果是零,所以ZF=ZR。
其中[0000]是间接寻址。
图11
继续运行指令,在这几步中,我们可以看到,在上一步的结尾的ADD AX AX可以看到AX变为2468(1234+1234),ADD DX DX 的结果仍然是ZR(零)。在上图中的OF标识符发生变化,原因是ADD AX AX 命令后AX寄存器的数值的最高位(符号位发生改变)。
继续运行指令,在这几步的运行过程中,ADD AX AX,后由于符号位改变所以OF = OV,因为产生进位,因此进位标志CF = CY,结果是2348 进1。
将AX中的数据存入0004指向的内存单元中
最后我们将DX中所存数据(进位次数)存入0006指向的内存单元中。
分析整个过程,可以看到我们将AX中的数值增大了16倍之后加上Y并用DX寄存器储存进位,最后分别将高低位储存在相邻的高地字节中。即实现运算为:Z=X*2^4+Y。