您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > DEBUG的使用方法二
DEBUG的使用方法二原作者:jjg@cadence.com(JohnGianni)译者:fengmarcal@163.net(marcal)新闻组:comp.lang.asm.x86我有两个理由发表这些文章:1)给别人带来帮助:用去我的一点时间就可以使到很多的朋友节省时间。译者注:我翻译的水平不高。但翻译的目的是问了我们中国人也可以有多一点电脑高手,这样我们就可以早一点成为一个真正的强国。2)同时我也将获得收益一些关于FAT/directory/data-sector-lookup的知识我也需要帮助。译者注:我也一样希望高手指正我翻译有误的地方。以下就是正文了,你可以尝试一下(如果你发现问题,那么写信告诉我)如何除错和汇编你的第一个PCx86汇编语言程序呢?以下这些简单的解释可以让一个汇编语言新手使用DEBUG:0)在使用时,如何快速获得debug的使用帮助呢。1)让我们开始工作吧,例如:显示BIOS的日期。2)在你的电脑的COMMANG.COM文件里搜寻“IBM”这几个字符。3)一位十六进制数的运算。4)检查x86寄存器内容。5)我们来编写我们的第一个用机械语言编写的程序-打印一个字符。6)我们现在用汇编语言指令来做和例5一样的事情。7)现在,我们不但要编写一个汇编程序,而且我们还要把它存盘。8)现在,我们试一试查看一个已经编好的程序。9)你可以用DEBUG的计算功能计算程序的长度。10)另一种显示在屏幕上字符串的方法。11)让我们试一试反复输出。12)我们现在把两个程序连接起来。13)让我们逐步运行这个刚刚修补的程序。14)如果一开始的命令不是跳转命令,那么可能就要用这种方法了.。--------------------------------------------------------------------------------以下所有的命令都是可以运行在WIN9x的MS-DOS方式下的。进入MS-DOS的方式有:[开始][程序][MS-DOS方式][开始][运行][打开]COMMAND[确定]或者你可以双击它:C:\Windows\Command.com--------------------------------------------------------------------------------0)在使用时,如何快速获得debug的使用帮助呢以下PROMPT表示目录提示符:一般为:C:\WINDOWS\COMMANDPROMPTDEBUG/?按回车presstheenterkeynow怎样?出错了吧。显示如下C:\WINDOWSDEBUG/?RunsDebug,aprogramtestingandeditingtool.DEBUG[[drive:][path]filename[testfile-parameters]][drive:][path]filenameSpecifiesthefileyouwanttotest.testfile-parametersSpecifiescommand-lineinformationrequiredbythefileyouwanttotest.AfterDebugstarts,type?todisplayalistofdebuggingcommands.因为错了所以它给你显示一些提示。留意到最后一句了吗?现在我们再来试一试:PROMPTDEBUG按回车(注意,DEBUG程序的命令是在一条横线“-”后出现的。)-?在出现的横线后面输入?再回车(下面的内容是按字母顺序排列的)(注意:Note:Don'ttypethedashorcomments--justthe?)显示如下,但是没有中文的哦,中文是我加上去的。汇编assembleA[address]比较compareCrangeaddress倾倒dumpD[range]进入enterEaddress[list]填充fillFrangelist进行goG[=address][addresses]十六进制hexHvalue1value2输入inputIport装载loadL[address][drive][firstsector][number]移动moveMrangeaddress命名nameN[pathname][arglist]输出outputOportbyte进行proceedP[=address][number]离开quitQ纪录registerR[register]搜寻searchSrangelist描述traceT[=address][value]反汇编unassembleU[range]写writeW[address][drive][firstsector][number]分配扩展内存allocateexpandedmemoryXA[#pages]释放扩展内存deallocateexpandedmemoryXD[handle]mapexpandedmemorypagesXM[Lpage][Ppage][handle]displayexpandedmemorystatusXS-q按回车(这是退出DEBUG回到DOS状态)Thisquitsoutofdebug,returningtotheDOSprompt)Testedexamplesbelowwalktheuserthruthefollowingdebugexamples:在下面的例子里读者必须明白以下几条DEBUG命令。-D显示一定范围内存的内容Displaythecontentsofanareaofmemory-Q退出DEBUG程序Quitthedebugprogram-S搜寻Searchforwhatever-H十六进制的运算Hexarithmatic-R显示或者改变一个或者多个寄存器的内容Displayorchangethecontentsofoneormoreregisters-E输入数据进入内存,在一个详细的地址里Enterdataintomemory,beginningataspecificlocation-G运行现在在内存里的程序。Goruntheexecutableprograminmemory-U反汇编,把我们不认识的机械代码变为我们可以认识汇编语言符号Unassemblemachinecodeintosymboliccode-T描述一条指令的用法。Tracethecontentsofoneinstruction-P进行或者执行一个相关的指令Proceed,orexecuteasetofrelatedinstructions-A编译,把汇编命令变为机械代码Assemblesymbolicinstructionsintomachinecode-N命名一个程序Nameaprogram-W把一个已经命名的程序写进磁盘Writethenamedprogramontodisk-L把程序装载进内存Loadthenamedprogrambackintomemory返回目录--------------------------------------------------------------------------------1)让我们开始工作吧,例如:显示BIOS的日期(以下PROMPT表示目录提示符:一般为:C:\WINDOWS\COMMAND\)PROMPTDEBUG按回车-DFFFF:0006L8按回车(显示FFFFh,偏移地址6h,长度8bytes)在作者的电脑上这里显示为1/10/96.译者的电脑显示“FFFF:0000372F-30362F3030007/06/00.”相信作者的电脑里也是用这种格式显示的。这里显示出来的是使用者BIOS的日期,有兴趣的话可以重新开机看看,注意开机时的显示。-Q按回车(退出DEBUG)思考:当只按DEBUG的时候,编辑的是什么?为什么可以找到BIOS的日期?(译者这里也不是很清楚所以请大家知道的也留言给斑竹,改正。译者认为可能是内存的真实物理地址。)返回目录--------------------------------------------------------------------------------2)在你的电脑的COMMANG.COM文件里搜寻“IBM”这几个字符下面的“C:\Win95\”是根据每不电脑不同的。像译者的电脑里就是“C:\WINDOWS”PROMPTDEBUGC:\Win95\Command.com按回车-S0LFFFFIBM按回车(从0开始搜寻IBM,搜寻FFFFh多个单元格)-Q按回车(退出DEBUG)以下是译者做的:C:\WINDOWSDEBUGC:\WINDOWS\COMMAND.COM-S0LFFFFIBM-S0LFFFFCOMMAND12A7:008D12A7:04F712A7:387012A7:38BE12A7:38DD-S0LFFFFPATH12A7:38AD12A7:CCB712A7:CF55-S0LFFFFCOMSPEC12A7:38D412A7:3A4D12A7:CCC4-QC:\WINDOWS(注意:搜寻是要区分大小写的)(你可以看到上面是没有找到“IBM”的,可以试一试PATH,COMSPEC,COMMAND)(注意:这种方法用在查找加密资料和已被删除的资料等方面时是十分有用的)返回目录--------------------------------------------------------------------------------3)一位十六进制数的运算:PROMPTDEBUG按回车-H91按回车(加减两个十六进制的数,9h+1h=Ah&9h-1h=8h)结果是显示:000A0008-Q按回车(退出DEBUG)C:\WINDOWSdebug-h91000A0008-qC:\WINDOWS返回目录--------------------------------------------------------------------------------4)检查x86寄存器内容PROMPTDEBUG按回车-R按回车(显示x86寄存器内容)-Q按回车(退出DEBUG)C:\WINDOWSdebug-RAX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=127CES=127CSS=127CCS=127CIP=0100NVUPEIPLNZNAPONC127C:0100043CADDAL,3C-Q下面是对寄存器的简单介绍:数据存储器在本类中,一般讲的AH就是AX的前八位,AL就是AX的后八位,后面的以此类推。AXAccumulator;作为累加器,所以它是算术运算的主要寄存器。另外所有的I/O指令都使用这一寄存器与外部设备传送信息。BXBaseregister;可以作为通用寄存器使用,此外在计算存储器地址时,它经常用作基地址寄存器。CXCountingregister;可以作为通用寄存器使用,此外在循环(LOOP)和串处理指令中作隐含的计数器。DXDataregister;可以作为通用寄存器使用,一般在作双字长运算时,把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。此外,对某些I/O操作,DX可用来存放I/O的端口地址。指针及变址寄存器BPBasepointersregister;机制指针寄存器SISourceindexregister;堆栈指针寄存器DIDestinyindexregister;目的变址寄存器SPBatterypointerregister;堆栈指针寄存器段寄存器CSCodesegmentregister;代码段寄存器,存放正在运行的程序指令DSDatasegmentregister;数据段寄存器,存放当前运行程序所用的数据SSB
本文标题:DEBUG的使用方法二
链接地址:https://www.777doc.com/doc-5832566 .html