为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

汇编语言调试工具DEBUG的使用

2019-08-27 11页 doc 26KB 35阅读

用户头像

is_769014

暂无简介

举报
汇编语言调试工具DEBUG的使用齐齐哈尔大学 论文 题目: 汇编语言调试工具DEBUG的使用 学    院     机电工程学院        专业班级     机械 088            姓    名     陈  军              学    号     2008800171          指导教师     吕洪柱              日    期   2010/11/21          汇编语言程序调试工具DEBUG的使用 摘要 DEBUG是汇编语言程序的重要调试工具,也是汇编语言的难点之一。本文探讨了DE...
汇编语言调试工具DEBUG的使用
齐齐哈尔大学 论文 题目: 汇编语言调试工具DEBUG的使用 学    院     机电工程学院        专业班级     机械 088            姓    名     陈  军              学    号     2008800171          指导教师     吕洪柱              日    期   2010/11/21          汇编语言程序调试工具DEBUG的使用 摘要 DEBUG是汇编语言程序的重要调试工具,也是汇编语言的难点之一。本文探讨了DEBUG在寄存器、内存、堆栈以及指令等在学习中的重要作用,阐述了利用DEBUG调试程序的方法,以帮助我们利用这一工具和用好汇编语言。 关键词:DEBUG;汇编语言;寄存器;堆栈 A Preliminary Analysis on the Tool Software DEBUG for Assembly Language program Abstract DEBUG is the important tool for assembly language program and is also the difficulty in the course of studying assembly language.This paper discussed the important role of some teaching parts。such as register,memory,stack and instruction.A method for applying DEBUG is presented to help students to study and use assembly language: Key words:DEBUG;assembly language;register;stack 目录 1 概述    1 2 利用DEBUG观察寄存器、内存和堆栈    1 2.1 观察寄存器    1 2.2 观察内存状况    1 2.3 观察堆栈状况    2 3 利用DEBUG进行汇编指令练习    2 4 利用DEBUG调试程序    3 5 结束语    5 参考文献:    6 汇编语言程序调试工具DEBUG的使用 1 概述 汇编语言是计算机提供给用户的最快最有效的语言。也是能够利用硬件特性并能直接控制硬件的唯一语言。在对于存储空间有限和时间要求很高的场合,汇编语言是必不可少的。汇编语言的调试工具DEBUG不容易使用,观察结果不直观且容易出现误读误判。但是如果利用好这个工具,我们就能比较容易进入汇编语言程序的大门。DEBUG是DOS中的一个外部命令,从DOS1.0起就带有此命令,因此可见此命令的重要性了。此命令的功能非常强大,可以解决许多问题。它既可以帮助我们看见汇编语言里很多抽象的东西.也可以帮助我们练习汇编指令,还可以帮助我们调试编写的汇编程序等。一下是一些DEBUG的使用方法。 2 利用DEBUG观察寄存器、内存和堆栈 认识和使用寄存器、内存和堆栈是学好汇编语言的重要一环。汇编语言教材一般是先介绍一些寄存器、内存、堆栈等等。这些东西在计算机中很抽象,也看不见,对于不是很了解计算机的同学来说,它们既是相当的枯燥,又是十分的难懂。怎么办呢?可以借助DEBUG来r解它们确实是一种比较有效的途径。开机后,我们进入DOS.直接在DOS下输入DEBUG,就会出现光标提示符.这个时候我们就可以利用DEBUG的一些基本命令进行观察了。 2.1 观察寄存器 寄存器是CPU内部用于存放数据的器件。寄存器在CPU内部,看不见,因此对于寄存器还是很模糊。但我们可以在DEBUG下输入R命令,就会出现下列执行结果; .—R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 Dl=0000 DS=09D5 ES=09D5 SS=09D5  CS=09D2  1P=0300 NV UP El PL NZ NA P0 NC 09D2:0300 4D DEC BP 当看见以上的数据以后,就会明白8086有14个寄存器,每个都是16位.里面放置了些初始值。如累加器AX里面放了4个十六进制数据0000,为16位。同时标志寄存器里面的每个数值位都可以看见,比如NZ则表示标志位的零标志是O(计算结果不为0)。用这种方式看见了寄存器名称以及里面的内容,比较直观也比较具体.因此很容易被接受。 2.2 观察内存状况 内存是计算机中用于临时存放数据的存储单元,里面存放的数据也不容易看见。那就更不用说内存地址了。在DEBUG中输入以下命令就可以观察内存的情况。 —D 0000 09D5:0000 CD  20 FF 9F 00 9A EE FE—1D F0 4F 03 4C  05 8A 03 09D5:0010  4C 05 17 03 4C 05 1A 04—01 01 01 00  02 FF FF FF 09D5:0020  FF FF FF FF FF FF FF FF—FF FF FF FF 06 05 4E 01 看到以上显示结果,对于内存的逻辑地址以及地址里面存放的内容就豁然开朗了。如09D5:0000,前面的09D5就表示这个地址的段基址;而后面的0000表示偏移量,两者结合起来就可以表示一个完整的逻辑地址,供CPU寻址使用。这个地址单元存放了CD这个十六进制字节数据,若是字数据即为20CD(高地址放高位)。这样一讲,就可以把复杂的问题简单化。 2.3 观察堆栈状况 堆栈是一个比较复杂的问题。堆栈的定义为:它是主存中开辟的一片数据区域.采用“先进后出”的存储方式。在操作方式上,用堆栈段寄存器SS存放段基址,用堆栈指针SP存放栈顶。有两个基本操作:一是压栈的PUSH操作。SP先自动减2后,在指向的地址处存放一个字的内容;另一个是出栈POP操作,SP先自动加2后,在指向的地址处存放一个字的内容。在DEBUG下是这样观察到这些现象的; 首先,用R命令观察寄存器内容 一R AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE 其次,执行压栈操作push之后,可以看到寄存器内容: AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEC 对比发现,SP寄存器确实减少了2,问题是原来的数据放在哪里了呢?由于堆栈是内存中的一段区域,因此就可以利用观察内存的DEBUG命令来观察堆栈内容,如下: 一D SS:FFE0 09D7:FFE0 00 00 A4 1C 00 00 01 01一E2 0A  46 05 34 12 00 00 09D7:FFF0 FF 00 0A 00 00 0B 00  00一00 00 00 00 00 00 00 00 可以看见,AX的内容1234确实被压进了堆栈,而且前面低地址放的是34,后面高地址放的是12,正好说明字类型数据存放规则:高地址放高位。通过这些操作,可以解决比较复杂的堆栈问题。 3 利用DEBUG进行汇编指令练习 8086汇编语言里面的有较强的指令系统,要全部记忆有很大的难度,而且很多指令都有自己的潜在规则. 可以通过用DEBUG来帮助记忆、练习指令。本章主要以最简单的MOV指令为例讲解如何在DEBUG下进行指令练习。 MOV就是实现数据从一个地方传送到另一个地方,基本语法格式是:MOV目的操作数,源操作数。要练习此指令,可以从以下几个方面进行。 1)错误指令的练习。MOV指令规定有很多种情况的不能传送的,如两者都是内存操作数则不能传送等等,类似的规则很多,也很难记忆,可以利用DEBUG帮助区别。 观察下列现象: 一A 0AE2:0103 MOV[0000],[1234] ‘Etrot 我们输入了MOV [0000],[1234]指令,意思是把地址为1234H的单元内容传送到0000H处,但DEBUG显示了Error错误,说明这条指令不能这么用,原因就是两者都是内存操作数则不能传送,这样就加深对这条规则的理解了。 2)执行结果的分析。假设AX=1234H,我们来看看执行MOV[0000],AX传送数据前后的结果。执行之前,内存如下: 09D5:0000  CD 20 FF 9F 00 9A EE FE一1D F0 4F 03 46 05 8A 03 09D5:0010   BF 05 CC 03 46 EC CB 04一BF 01 01 00 02 FF FF FF 执行之后,内存如下: 09D5:0000   34 12 FF  9F 00 9A EE FE一1D F0 4F 03 46 05 8A 03 09D5:0010  46 05 17 CC 4B 05 14 CD—01 01  A3 OO 02 FF FF FF 对比就会发现,执行MOV指令之前,内存0000H单元的字内容为20CDH,而执行指令之后,变成1234H了。说明MOV[0000],AX这条语句确实把AX里的内容1234H传送到0000H单元了。 4 利用DEBUG调试程序 调试程序是程序编写过程中一个必不可少的阶段,程序只有经过调试,才能正常运行,未经调试的程序直接运行可能会出现不可预知的逻辑错误。下面以二进制到十六进制的转换问题为例。 题目:设BX=1010 0011 0101 0100。设计一程序把BX的数值在屏幕上显示出来。 以下代码是该任务源程序对应的可执行文件在DEGUB中反汇编的结果。 1887:0000  lE       push ds 1887:0001  2BCO     sub ax,ax 1887:0003   50        push ax 1887:0004  BBB354   mov bx,0b354h 1887:0007  B504       mov ch,4 1887:0009  B104      mov cl,4 1887:000B  D3C3     rol bx,cl 1887:000D  8AC3      mow al,bl 1887:000F   240F       and al,Ofh 1887:0011   0430       add al,30h 1887:0013  8ADO    mov dl,al 1887:0015   B402       mov ah,2 1887:0017   CD21      int 21h 1887:0019   FECD       dec eh 1887:001B   75EC      jnz 0009 1887:00lD   CB        ret 运行此文件可知,最高位a却显示成了“;”,而后面的453的依次正确显示。这说明这程序有逻辑错误。设置断点为0013,使用命令g0015后得到的结果为 AX=003B BX=354B CX=0404 DX=003B SP=FFFC BP =0000 SI=0000 Dl=0000 DS=1885 ES=18B5 SS=18B7 CS=18B7 IP=0015 NV UP EI PL NZ NA PO NC 1887:0015 B402 MOV AH,02 由此可知,此次送入DL中的数据为3BH。而ASCII码中的3BH对应的图形为“;”,字母B的对应的正确ASCII码为42H。因此,程序的出现问题找到了,这就是字母的ASCII码与数字的ASCII码在与二进制数据的转换过程中相差7。据此,我们可以在源文件中作这样的修改 … Add a1,30h cmp al,3ah j1 print add a1,7h print: mov dl,al 重复以上编译、连接和调试过程,就可得到正确结果。 5 结束语 DEBUG不仅是调试汇编语言程序的一个有力工具,也是学好汇编语言的一个有力工具,使我们在学习过程中的一些抽象内容变得听的懂、看的见,提高了汇编语言的可操作性。除了用于调试程序外,灵活运用DEBUG,还能直观地看到寄存器、内存和堆栈存储单元工作过程,帮助练习和记忆一些常用的指令用法。 参考文献: [1]赵丽,齐兴斌.Windows 2000环境下汇编语言的上机过程[J],电力学报,2007,22(2):220—223; [2]杨红强.用汇编语言实现不同数制的显示问题[J].菏泽学院学报,2007,29(2):41—43; [3]董洁.浅谈DEBUG程序的主要命令用法[J],赤峰学院学报(自然科学版),2007,23(5):61—62; [4]沈美明,温冬婵.IBM—PC汇编语言程序设计[M],北京:清华大学出版衬,2001; [5]郑初华,胡景春.汇编语言,微机原理及接口技术I-M],北京:电子工业出版社,2000; [6]眭仁武,陈列尊.运用建构主义改革《汇编语言》教学[J],衡阳师范学院学报·2003,24(6):97—99;
/
本文档为【汇编语言调试工具DEBUG的使用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索