《微机实验及课程设计》实验报告-实验一_二_实验报告_自动化学院.doc_第1页
《微机实验及课程设计》实验报告-实验一_二_实验报告_自动化学院.doc_第2页
《微机实验及课程设计》实验报告-实验一_二_实验报告_自动化学院.doc_第3页
《微机实验及课程设计》实验报告-实验一_二_实验报告_自动化学院.doc_第4页
《微机实验及课程设计》实验报告-实验一_二_实验报告_自动化学院.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机实验及课程设计实验报告 学号 08011 东南大学微机实验及课程设计实验报告实验一 汇编语言与程序调试基础实验二 汇编语言程序设计姓 名: 学 号: 08011 专 业: 自动化 实 验 室: 金智楼 实验时间: 2013年04月02日 报告时间: 2013年04月12日评定成绩: 审阅教师: 一. 实验目的与内容1.实验目的:(1)了解命令行操作基本方式和基本命令,掌握PC环境下命令行方式的特点; (2)掌握汇编语言程序指令编辑、宏汇编、连接、运行基本概念; (3)熟练掌握动态调试程序TD的常用命令和窗口功能,学会用TD调试程,修改环境; (4)学会利用DEBUG或TD检查认识指令功能的正确方法。 (5)进一步熟悉汇编语言程序的编辑、宏汇编、链接、运行基本概念; (6)熟练掌握动态调试程序TD/DEBUG 的常用命令或窗口功能,学会用TD/DEBUG 调试程序,修改数据和寄存器等环境; (7)熟悉掌握汇编语言程序的典型数据结构设计、典型程序流控制方法,了解DOS/BIOS 功能调用的基本方法。2.实验内容:(1)内容一:1) 掌握进入全屏命令行方式、修改环境的两种方法;2) 确定源程序的存放目录,构建个人实验环境; 3) 建立、编辑汇编源程序,选择程序样本,构建典型的汇编程序框架;4) 用汇编工具(MASM/TASM.EXE)汇编源程序产生OBJ目标文件;5) 用链接程序(LINK/TLINK.EXE)产生EXE可执行文件;6) 用调试工具软件(D/ TD.EXE)调试执行程序; 观察CPU寄存器、存储器环境; 单步、断点运行,观察中间结果; 完成正常执行; 修改中间运行环境(寄存器,存储器); 直接编写程序片断,验证指令功能;(2)内容二:1)C盘目录下点击执行TD.EXE,理解典型寻址方式与指令; 进入debug,并执行以下内容,理解指令的含义及其执行后的结果:MOV AX,1234HMOV BX,789AHADD AX,BXMOV CX,BX+2JMP BXJMP NEAR PTRBX+2JMP FAR PTRBX 执行下列指令,观察堆栈段数据和SP的变化,跟踪进入.RET.RETF返回PUSH BXPOP AXCALL CXCALL NEAR PTRBX+2CALL FAR PTRBX2) 指令的理解与调试PUSH BXJMP DWORD PTRBX+2CALL DWARD PTRBX 中断指令,设置中断向量并编译简单中断服务程序INT 80HIRET DOS系统的功能调用(AH=01,AH=02,AH=09),实现键盘输入、读取、屏幕输出INT 21H(3)内容三:1)编写程序实现如下功能: 从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母 (其他字符不变)并按原顺序将这些字符在屏幕上显示出来。 从键盘输入在065535 之间的十进制数,将其转换为16 进制数并在屏幕中显示出来,要求判断输 入字符串是否为在065535 之间的十进制数。 2)复习TD 各种操作,并用DEBUG 调试程序,学会基本命令操作,并通过单步、设置断点等方法观 察中间结果,完成正常运行。 命令行方式下直接键入debug myfile.exe 回车(myfile 为待调试可执行程序),进入调试方式(显示 -),键入H 回车显示全部命令、格式和功能。常用命令有:U(反汇编)、A(汇编输入指令程序)、R(寄 存器显示/修改)、I(端口输入)、O(端口输出)、D(显示数据)、E(修改数据)。 除资源修改管理功能外,重点应用T(单步)、Tn(执行n 步)、P(过程/指令)、G(从当前CS:IP 执行到断点)或G=1 2(从1 执行到2 断点)调试实验程序。 2. 基本实验原理(1)编程者使用文本编辑程序通过键盘键入源程序,检查无误,可将源程序存到硬盘或软盘上。源程序扩展名为“源程序名.ASM”1)常用MS-DOS命令: DIR F:目录名 (显示指定盘目录存储文件列表) CD F:mydir (指定A盘上mydir为当前工作目录)2)基础操作命令: R-显示CPU内部寄存器的内容和全部标志位状态。 -R16位寄存器名(AX, BX,CX,DX,SI,DI,IP,SP,CS,DS,ES,SS)-显示和修改一个指定寄定器的内容和标志位的状态。D-显示内存命令-D地址范围-显示指定内存范围的内容。-D-从上一个D命令所显示的最后一个单元的下一个单元开始(首次CS:IP)E地址内容表-用命令所给定的内容表去代替指定地址范围的内存单元内容。其中:内容表为一个十六进制数,也可以是用单引号括起的一串字符。-E 地址-逐个单元连续修改单元内容。(空格跳到下一单元,回车修改结束)U地址范围-将指定范围内的代码以汇编语言形式显示,同时显示该代码位于内存的地址和机器。A段寄存器名:偏移地址-将汇编语言程序指令逐行直接输入内存单元。(默认段寄存器CS,偏移地址为上次汇编尾地址(初值CS:IP)T地址-单步执行当前指定地址处的指令(默认为CS:IP处),显示CPU所有寄存器内容和全部标志位的状态,以及下一条指令的地址和内容(同执行命令)P-越过(挂停)命令(2)1)小写字母的ASCII 码比其所对应的大写字母的ASCII 码值大20H,如字符“a”的ASCII 码为61H,而字符“A”的ASCII 码为41H,因此字符变换时将小写字母的ASCII 码减去20H 即为大写字母的ASCII 码。同样将数字转换为ASCII 码的方法为:将其值加上30H。2)键盘输入字符串:采用DOS 系统功能调用(INT 21H),功能号为AH=0AH,DS:DX 为存放键入字符串的缓冲区首地址,其中第一个字节需要初始化,为用户定义的缓冲区长度。当完成字符串输入并存储后,第二个字节为键入的字符串的个数,从第三个字节开始存放键入的字符串,并在最后有一个字节为0DH 作为字符串的结束。3)显示字符:采用DOS 系统功能调用(INT 21H),功能号为AH=02H,DL 中存放要显示字符的ASCII码;显示字符串:采用DOS 系统功能调用(INT 21H),功能号为AH=09H,DS:DX 存放要显示字符串的首地址,串尾字符为“$”但不显示出来。4)将10 进制数转换为16 进制数可采用按位取值再相加的方法,即(个位*1)+(十位*10)+(百位*100)+,可用数值位数来判断位值。5)输入的十进制数,要求介于065535,因此缓冲区长度可定为6 字节(第二字节要存放实际键入的字符数),数据段定义时可采用如下方式:input db 6,7 dup(0)。6)判断输入的是否为介于065535 之间的十进制数可分为两步: 按位比较,如果某个字符不是09 则不符合条件; 将数值计算累加后若溢出,表示输入数值大于FFFFH,则也不符合要求。3. 方案实现与测试(1) 内容一:1) 编写代码完成功能要求,文件格式为.asm 文件(如文件名为add.asm),将文件放入带汇编工具的文件夹中,即含有汇编工具(MASM/TASM.EXE)和链接工具(LINK/TLINK.EXE)的文件夹。2) 全屏启动命令行模式,进入上述文件夹输入:tasm add.asm 或(MASM ADD;)回车后编译产生add.obj文件再输入:tlink add.obj 或(LINK ADD;)回车后链接产生add.exe文件如果程序有错误,编译时会产生错误提示,指出错误的位置和错误类型及错误码,改正错误后再重新编译链接,直到没有错误和编译链接成功。3) 启动TD并载入add.exe,可以查看各寄存器和存储器的数值,如图 3.1-4。选择数据区的菜单中的Goto,在其输入框内输入要查看的数据区地址,如ds:0000,如图3.1-5,回车确认后即可查看数据区从段地址为DS、偏移地址为0000h开始的存储情况,如图3.1-6。图3.1-4 图3.1-5 输入数据区地址图3.1-6 查看数据区存储数据情况4) 先设置断点再直接运行:载入程序后,将光标放置在要设置断点的指令上,使用TD功能键F2即可设置断点,再按F9直接运行程序,当执行到该指令时将停止执行,这时可观察各个寄存器及存储器的值,可以验证程序运行是否正常。运行结果如下图所示。红色的一行为设置断点处,程序会运行到此处停止,此时AX变为53F6,DS变为53F6,AX变为53F7,SS变为53F7。5) 单步运行:使用TD功能键F7,每按一次程序向下运行一句,同时观察数据区、寄存器区、标志区的相应变化,验证程序是否运行正常。此时执行完AL,SI,则DS:0000中存储的数据12传给了AL。6) 直接添加指令:选择代码区局部菜单中的assemble选项,在其编辑框中直接输入指令确认后即可完成添加,单步运行可查看该指令的功能和执行结果。运行完结果如上所示,AX变成了0000.(1)(2) 内容二:1) 执行以下命令,BX变为789A,AX先变为1234再加上789A等于8ACE。此时bx+2出存储的值我们将其修改为2301。则执行mov cx,bx+2以后,cx变成了2301。执行完jmp bx,ip由原来的010B变成了789A。执行完jmp near ptrbx+2,ip变为bx+2存储的数值2301。执行完jmp far ptr bx,ip变为bx存储的数值0000,CS变成2301,就是bx+2。 执行以下语句的结果如下所示:PUSH BX ;BX是20CD存入堆栈,SP减2POP AX;20CD出栈至AX,SP加2CALL CX;ip变为CX,即0108,SP减2,将下一行指令的IP存入堆栈CALL NEAR PTRBX+2;ip变为BX+2,即010D,SP2,将下一行指令的IP存入堆栈,为010BCALL FAR PTRBX ;ip变为BX,也就是20CD,SP减2,将下一行指令的IP存入堆栈,CS变为BX+2即010D 2) 执行push bx前后对比如下:sp比原来减小了2,ip增加了2,bx 即ds:0000处存储的值20CD存入了堆栈。执行JMP DWORD PTRBX+2,ip变为bx+2中存储的数字9FFF,cs变为bx+2后两个字节的内容。执行完CALL DWORD PTRBX,把当前程序执行的ip存入堆栈,ip跳转到bx存储的值20CD,cs变为bx+2存储的值9FFF 中断指令,设置中断向量并编译简单中断服务程序,此处中断int 80H执行MOV AX,1234的指令。结果如下所示: DOS系统的功能调用(AH=01,AH=02,AH=09),实现键盘输入5,读取到AL,再把5存到DL在屏幕输出。(3) 内容三:1) 实现将字符串中小写字母转换为大写字母 编译链接: 运行 在一开始,在用debug一步一步调试的过程中,在输入字符串hjhj后,查看每个字符的ASCII码的变化。输入DDS:0 后,看到该地址存储的是64 04 68 6A 68 6A 0D,这与原理中所说的相符。DS:DX为存放键入字符串的缓冲区首地址,其中第一个字节需要初始化,为用户定义的缓冲区长度。当完成字符串输入并存储后,第二个字节为键入的字符串的个数,图中看到是04,也就是键入的“hjhj”有4个字符,从第三个字节开始存放键入的字符串,并在最后一个字节为0DH作为字符串的结束。2) 实现十进制与十六进制之间的转换 编译时出现了错误,经修改后编译正确:在原汇编程序中发现shr dl,4出现错误,因为移位时,系统要求次数必须放在寄存器cl中。将它修改为:该程序运行没有问题。但是进行单步之后发现,在执行loop2:mul ten loop loop2 pop cx语句时出现如下错误:表明该循环出现错误,经检查发现程序中没有报错的部分: xor ax,axxor bx,bxxor dx,dx该部分因为没有对cx进行清零,导致单步时出现错误(尤其是在输入的十进制数比较大的情况)。 修改后最终运行结果如下图所示四提高与创新研究(1) 什么是单步运行?两种单步运行有什么不同? 单步运行是指根据代码每次执行一步,有Trace into(F7)和Step over(F8)两种,其中Trace into在执行CALL指令时将跟踪进入子程序,即对于CALL指令中的子程序也执行单步运行。而Step over在执行CALL指令时将直接执行完子程序,即对于CALL指令中的子程序并不执行单步运行。(2) 如何合理地利用断点技术? 当编写的程序没有代码上的错误,但有逻辑上的错误时可以通过断点技术来检查程序的编写,监视程序的逻辑错误出现在哪个位置。可以进行分块分区域进行调试,只在断点前执行,而不必利用单步执行检查这样繁琐了,适合于比较长的一小段程序的整体调试。5 分析与总结通过三次实验,我大致了解并掌握了基本的汇编操作,能够熟练地对.ASM文件进行编译、链接、运行及调试。第一次实验:主要了解熟悉TD和DEBUG的调试环境,掌握TD和DEBUG的基本使用。学会运行汇编代码,查看各个寄存器的数值并理解各指令执行后的变化情况,了解程序执行的过程。加深了我对于各个指令功能的理解。第二次实验:主要理解PUSH、JMP、CALL指令。以及对中断指令的理解与执行。试着编写了int 80h的中断服务程序,对于中断的运行是怎么进行的有了很深的印象。了解DOS指令,能够使用01、02、09进行键盘键入的读取和显示。第三次实验:对.asm文件编译的过程中发现错误能够自己查错,有时候是一些拼写错误,还查出来了语法的错误,并且利用DEBUG对生成的.EXE文件进行单步调试。有时候会出现 No directive end of file的错误提示,但是更换编译器以后问题得到了解决。 通过实验,使得我对于课本学到的知识印象更深刻,得到了很好的巩固。附录:重要程序片段:(1) 程序名:string.asm;-;字符串的变换和输入输出;-main proc farstart: mov ax,data ;初始化各段基址mov ds,ax; mov ax,stacks; mov ss,axloop1: mov dx,offset string1 ;显示提示信息mov ah,09hint 21hmov dx,offset input ;输入字符串mov ah,0ahint 21hmov dx,offset string2mov ah,09hint 21hcall disp ;调用处理显示子程序mov dx,offset string3mov ah,09hint 21hmov ah,01hint 21hcmp al,y ;判断是否继续jz loop1mov ah,4chint 21hmain endp;-disp proc near ;显示子程序xor cx,cx ;input 为输入缓冲区,input0=最大允许输入字符数mov cl,input1 ;将输入的字符个数赋给cl,循环次数;input1=实际输入字符数mov si,2 ;input2开始为实际输入字符ASCII 码again: mov dl,inputsicmp dl,61h ;判断是否为小写字母jb nextcmp dl,7ahja nextsub dl,20h ;将小写字母的ASCII 码转换为大写字母的ASCII 码next: mov ah,02h ;显示字符int 21hinc si ;si 指向下一个字符loop againretdisp endpcode endsend start(2)程序名:num.asm;-;10 进制数转化为16 进制数;-main proc farstart: mov ax,data ;初始化各段基址mov ds,axmov ax,stacksmov ss,axloop1: mov output,0000h ;清零mov dx,offset string1 mov ah,09hint 21hmov dx,offset input ;输入数值mov ah,0ahint 21hmov right,1call change ;调用转换子程序cmp right,0 ;判断数值是否满足条件jz errormov dx,offset string2mov ah,09hint 21hmov ax,output ;将转换后的16 进制数赋给axmov dl,ah ;显示最高位mov cl,4shr dl,clcall dispmov dl,ah ;显示第二位and dl,0fhcall dispmov dl,al ;显示第3 位mov cl,4shr dl,clcall dispmov dl,al ;显示最后一位and dl,0fhcall di

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论