




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DEBUG的使用方法二 原作者: (John Gianni) 译者:(marcal) 新闻组:comp.lang.asm.x86 我有两个理由发表这些文章: 1)给别人带来帮助: 用去我的一点时间就可以使到很多的朋友节省时间。译者注:我翻译的水平不高。但翻译的目的是问了我们中国人也可以有多一点电脑高手,这样我们就可以早一点成为一个真正的强国。 2)同时我也将获得收益 一些关于FAT/directory/data-sector-lookup的知识我也需要帮助。译者注:我也一样希望高手指正我翻译有误的地方。 以下就是正文了,你可以尝试一下(如果你发现问题,那么写信告诉我) 如何除错和汇编你的第一个PC x86汇编语言程序呢? 以下这些简单的解释可以让一个汇编语言新手使用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:WindowsC - 0)在使用时,如何快速获得debug的使用帮助呢 以下PROMPT 表示目录提示符:一般为:C:WINDOWSCOMMANDPROMPT DEBUG /? 怎样?出错了吧。显示如下 C:WINDOWS DEBUG/? Runs Debug, a program testing and editing tool. DEBUG drive:pathfilename testfile-parameters drive:pathfilename Specifies the file you want to test. testfile-parameters Specifies command-line information required by the file you want to test. After Debug starts, type ? to display a list of debugging commands. 因为错了所以它给你显示一些提示。留意到最后一句了吗? 现在我们再来试一试: PROMPT DEBUG (注意, DEBUG程序的命令是在一条横线“-”后出现的。) -? (下面的内容是按字母顺序排列的) (注意:Note: Don t type the dash or comments - just the ?) 显示如下,但是没有中文的哦,中文是我加上去的。 汇编assemble A address 比较compare C range address 倾倒dump D range 进入enter E address list 填充fill F range list 进行go G =address addresses 十六进制hex H value1 value2 输入input I port 装载load L address drive firstsector number 移动move M range address 命名name N pathname arglist 输出output O port byte 进行proceed P =address number 离开quit Q 纪录register R register 搜寻search S range list 描述trace T =address value 反汇编unassemble U range 写write W address drive firstsector number 分配扩展内存allocate expanded memory XA #pages 释放扩展内存deallocate expanded memory XD handle map expanded memory pages XM Lpage Ppage handle display expanded memory status XS -q (这是退出DEBUG回到DOS状态)This quits out of debug, returning to the DOS prompt) Tested examples below walk the user thru the following debug examples: 在下面的例子里读者必须明白以下几条DEBUG命令。 -D 显示一定范围内存的内容Display the contents of an area of memory -Q 退出DEBUG程序Quit the debug program -S 搜寻Search for whatever -H 十六进制的运算Hex arithmatic -R 显示或者改变一个或者多个寄存器的内容Display or change the contents of one or more registers -E 输入数据进入内存,在一个详细的地址里Enter data into memory, beginning at a specific location -G 运行现在在内存里的程序。Go run the executable program in memory -U 反汇编,把我们不认识的机械代码变为我们可以认识汇编语言符号Unassemble machine code into symbolic code -T 描述一条指令的用法。Trace the contents of one instruction -P 进行或者执行一个相关的指令Proceed, or execute a set of related instructions -A 编译,把汇编命令变为机械代码Assemble symbolic instructions into machine code -N 命名一个程序Name a program -W 把一个已经命名的程序写进磁盘Write the named program onto disk -L 把程序装载进内存Load the named program back into memory 返回目录 - 1)让我们开始工作吧,例如:显示BIOS的日期 (以下PROMPT 表示目录提示符:一般为:C:WINDOWSCOMMAND) PROMPT DEBUG -D FFFF:0006 L 8 (显示 FFFFh, 偏移地址 6h, 长度 8 bytes) 在作者的电脑上这里显示为 1/10/96. 译者的电脑显示“ FFFF:0000 37 2F-30 36 2F 30 30 00 7/06/00.”相信作者的电脑里也是用这种格式显示的。这里显示出来的是使用者BIOS的日期,有兴趣的话可以重新开机看看,注意开机时的显示。 -Q (退出DEBUG) 思考:当只按DEBUG的时候,编辑的是什么?为什么可以找到BIOS的日期?(译者这里也不是很清楚所以请大家知道的也留言给斑竹,改正。译者认为可能是内存的真实物理地址。) 返回目录 - 2)在你的电脑的COMMANG.COM文件里搜寻“IBM”这几个字符 下面的“C:Win95”是根据每不电脑不同的。像译者的电脑里就是“C:WINDOWS” PROMPT DEBUG C:Win95C -S 0 L FFFF IBM (从0开始搜寻 IBM ,搜寻FFFFh多个单元格) -Q (退出DEBUG) 以下是译者做的: C:WINDOWS DEBUG C:WINDOWSCOMMAND.COM -S 0 L FFFF IBM -S 0 L FFFF COMMAND 12A7:008D 12A7:04F7 12A7:3870 12A7:38BE 12A7:38DD -S 0 L FFFF PATH 12A7:38AD 12A7:CCB7 12A7:CF55 -S 0 L FFFF COMSPEC 12A7:38D4 12A7:3A4D 12A7:CCC4 -Q C:WINDOWS (注意:搜寻是要区分大小写的) (你可以看到上面是没有找到“IBM”的, 可以试一试 PATH , COMSPEC , COMMAND ) (注意: 这种方法用在查找加密资料和已被删除的资料等方面时是十分有用的) 返回目录 - 3) 一位十六进制数的运算: PROMPT DEBUG -H 9 1 (加减两个十六进制的数, 9h+1h=Ah & 9h-1h=8h) 结果是显示: 000A 0008 -Q (退出DEBUG) C:WINDOWS debug -h 9 1 000A 0008 -q C:WINDOWS 返回目录 - 4) 检查x86寄存器内容 PROMPT DEBUG -R (显示x86寄存器内容) -Q (退出DEBUG) C:WINDOWS debug -R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC 127C:0100 043C ADD AL,3C -Q 下面是对寄存器的简单介绍: 数据存储器 在本类中,一般讲的AH就是AX的前八位,AL就是AX的后八位,后面的以此类推。 AX Accumulator;作为累加器,所以它是算术运算的主要寄存器。另外所有的I/O指令都使用这一寄存器与外部设备传送信息。 BX Base register;可以作为通用寄存器使用,此外在计算存储器地址时,它经常用作基地址寄存器。 CX Counting register;可以作为通用寄存器使用,此外在循环(LOOP)和串处理指令中作隐含的计数器。 DX Data register;可以作为通用寄存器使用,一般在作双字长运算时,把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。此外,对某些I/O操作,DX可用来存放I/O的端口地址。 指针及变址寄存器 BP Base pointers register ;机制指针寄存器 SI Source index register ;堆栈指针寄存器 DI Destiny index register ;目的变址寄存器 SP Battery pointer register ;堆栈指针寄存器 段寄存器 CS Code segment register ;代码段寄存器,存放正在运行的程序指令 DS Data segment register ;数据段寄存器,存放当前运行程序所用的数据 SS Battery segment register ;堆栈段寄存器,定义了堆栈所在区域 ES Extra segment register ;附加段寄存器,存放附加的数据,是一个辅助性的数据区, 控制寄存器 IP Next instruction pointer register;指令指针寄存器,它用来存放代码段中的偏移地址,在程序运行的过程中,它始终指向下一条指令的首地址,它与CS寄存器联用确定下一条指令的物理地址 F Flag register;标志寄存器 “NV UP EI PL NZ NA PO NC”就是了,也有人称之为PSW Program Status Wold程序状态寄存器 (这里有一点必须讲明白的现在在,其实从奔腾开始这些寄存器(除了所有段寄存器,标志寄存器 )都是32位的。并且加多了两个16位段寄存器FS,GS。dos下面看到这些寄存器是16位的。要看32位寄存器可以使用soft-ice。对于FS,GS的作用我也不是很清楚,希望有高手指点,谢谢。) 返回目录 - 5)我们来编写我们的第一个用机械语言编写的程序-打印一个字符 (这里用机械语言的主要原因是考虑到有一些用户不懂汇编命令,现在就要让他有一个认识计算机程序实质是一些数字) PROMPT DEBUG -E 100 (在偏移地址为100的地方输入机械指令程序) B4 02 (在AX寄存器的前八位存入02) B2 41 (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码,身边有ASCII表的朋友可以对着表改改数字试一试) CD 21 (当AH=02时这是DOS显示输出的中断号) CD 20 (退出DOS) -G (程序运行,并在屏幕上显示出“A”) 程序运行完以后你将看到 Program terminated normally (程序正常结束了). -U 100 (我们把它反汇编,就是把机械命令变为汇编语言指令) 107F:0100 B402 MOV AH,02 :0102 B2 MOV DL,41 :0104 CD21 INT 21 :0106 CD20 INT 20 (下面会有一堆无用的东西) (对了,你的段地址可能与我的段地址CS=107F不同哦) -R (让我们来看看寄存器的值; IP=100h, AX=0000h, DX=0000h) 好极了,我们看到电脑又做好了准备下一次运行程序了。 -T (执行第一步操作. IP= 102h, AX= 0200h,指令指针寄存器指向下一条命令,AX的值被改变。 -T (执行第二步操作. IP= 104h, , DX= 0041h,指令指针寄存器指向下一条命令,DX的值被改变。 -P (继续执行 INT 21,IP= 106h, AX= 02h,) -P (继续执行INT 20) -Q (退出DEBUG) (注意:你必须小心使用 T .因为如果你在程序完结以后继续执行这条命令,因为我们无法预知下面的指令是什么,所以我们也无法预知它可能带来的后果) C:WINDOWS DEBUG -E 100 127C:0100 B4.B4 02.02 B2.B2 41.41 CD.CD 21.21 CD.CD 20.20 -G A Program terminated normally -U 100 127C:0100 B402 MOV AH,02 127C:0102 B241 MOV DL,41 127C:0104 CD21 INT 21 127C:0106 CD20 INT 20 127C:0108 C706F1E30900 MOV WORD PTR E3F1,0009 127C:010E EB59 JMP 0169 127C:0110 57 PUSH DI 127C:0111 BFF1E3 MOV DI,E3F1 127C:0114 8BDF MOV BX,DI 127C:0116 06 PUSH ES 127C:0117 0E PUSH CS 127C:0118 07 POP ES 127C:0119 32D2 XOR DL,DL 127C:011B EB34 JMP 0151 127C:011D 006B12 ADD BP+DI+12,CH -R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC 127C:0100 B402 MOV AH,02 -T AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=127C ES=127C SS=127C CS=127C IP=0102 NV UP EI PL NZ NA PO NC 127C:0102 B241 MOV DL,41 -T AX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000 DS=127C ES=127C SS=127C CS=127C IP=0104 NV UP EI PL NZ NA PO NC 127C:0104 CD21 INT 21 -P A AX=0241 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000 DS=127C ES=127C SS=127C CS=127C IP=0106 NV UP EI PL NZ NA PO NC 127C:0106 CD20 INT 20 -P Program terminated normally -Q C:WINDOWS 返回目录 - 6) 我们现在用汇编语言指令来做和例5一样的事情 PROMPT DEBUG -A 100 (在偏移地址为100的地方输入汇编语言程序) MOV AH,02 (选用DOS的02号功能调用,显示输出) MOV DL, (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码,身边有ASCII表的朋友可以对着表改改数字试一试) INT 21 (当AH=02时这是DOS显示输出的中断号,显示 A ) INT 20 (退出DOS) (结束汇编语言编程状态,回到DEBUG命令状态) -G =100 (运行程序,其实可以不要“=100”因为一般默认启始位置是100) -Q (退出DEBUG) C:WINDOWS DEBUG -A 100 127C:0100 MOV AH,02 127C:0102 MOV DL,41 127C:0104 INT 21 127C:0106 INT 20 127C:0108 -G A Program terminated normally -Q 返回目录 - 7) 现在,我们不但要编写一个汇编程序,而且我们还要把它存盘 (下面这个程序就要比原来的程序复杂一点了-显示输出: ABC ) PROMPT DEBUG (运行DEBUG程序;系统默认启始IP寄存器值为100h) -A 100 (用汇编语言编写一个程序,启始地址是100h) MOV AH,02 (选择DOS的02号功能调用, 显示输出) MOV DL, (在DX寄存器的后八位存入41h,41h就是大写A的ASCII码) INT 21 (当AH=02时这是DOS显示输出的中断号,显示 A ) MOV DL,42 (在DX寄存器的后八位存入41h,41h就是大写B的ASCII码) INT 21 (当AH=02时这是DOS显示输出的中断号,显示 B ) MOV DL,43 (在DX寄存器的后八位存入41h,41h就是大写C的ASCII码) INT 21 (当AH=02时这是DOS显示输出的中断号,显示 C ) INT 20 (程序结束,退出DEBUG) (结束汇编命令输入,回到DEBUG命令输入) -R BX (查看寄存器BX的值) :0000 (设置BX为0000h,这是程序的结尾地址是BX:CX) (注意,只要BX = 0000, 文件的大小就小于 64 Kb.) -R CX (设置CX为Fh,这是程序的长度:16位) :0010 (现在我们可以把这个16字节的程序写入硬盘了) -N (将要存盘的程序命名) -W (把这十六字节写到文件里面) -Q (退出DEBUG) PROMPT DIR 这里将会报告这个文件的大小是16字节 (10h 字节). PROMPT 会马上在屏幕上打印出 ABC C:WINDOWS DEBUG -A 100 127C:0100 MOV AH,02 127C:0102 MOV DL,41 127C:0104 INT 21 127C:0106 MOV DL,42 127C:0108 INT 21 127C:010A MOV DL,43 127C:010C INT 21 127C:010E INT 20 127C:0110 -R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC 127C:0100 B402 MOV AH,02 -R BX BX 0000 : -R CX CX 0000 :0010 -N PRINTABC.COM -W Writing 00010 bytes -Q C:WINDOWS DIR PRINTABC.COM Volume in drive C has no label Volume Serial Number is 28FB-70BA Directory of C:WINDOWS PRINTABC COM 16 03-21-01 11:02 PRINTABC.COM 1 file(s) 16 bytes 0 dir(s) 557,711,360 bytes free C:WINDOWS PRINTABC ABC C:WINDOWS 这里可以有人告诉我,为什么要存入是BX:CX代表程序长度吗?(写信给译者,谢谢) 返回目录 - 8) 现在,我们试一试查看一个已经编好的程序: PROMPT DEBUG (运行DEBUG程序在CS:IP = CS:0100h) -N (告诉电脑你想装载的程序名) -L (装载那个名字的程序进入内存) -U 100 L 10 (从偏移地址100开始反汇编16位字节) -R (现在看看寄存器里面的内容) 注意:DEBUG本身是没有自动纪录文件大小的。 -G (运行被命名的程序,打印 ABC ) 你将看到 ABC ,然后是 Program terminated normally ) C:WINDOWS DEBUG -N PRINTABC.COM -L -U 100 L 10 12A4:0100 B402 MOV AH,02 12A4:0102 B241 MOV DL,41 12A4:0104 CD21 INT 21 12A4:0106 B242 MOV DL,42 12A4:0108 CD21 INT 21 12A4:010A B243 MOV DL,43 12A4:010C CD21 INT 21 12A4:010E CD20 INT 20 -R AX=0000 BX=0000 CX=0010 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=12A4 ES=12A4 SS=12A4 CS=12A4 IP=0100 NV UP EI PL NZ NA PO NC 12A4:0100 B402 MOV AH,02 -G ABC Program terminated normally 返回目录 - 9)你可以用DEBUG的计算功能计算程序的长度。 一开始的时候你的程序初始地址是在0100h: 107F:0100 MOV AH,02 -这就是 100h 你的程序的最后一行在010Eh: 107F:010E INT 20 -最后一行 然后,最后一条命令的下一行的地址是0110h: 107F:0110 DEBUG -H 110 100 (这条命令将运算110h+100h和110h-100h) 0210 0010 (汇报 110h-100h=0010h; 16-byte 程序长度16位) -Q (退出DEBUG) C:WINDOWS debug -H 110 100 0210 0010 -Q 返回目录 - 10)另一种显示在屏幕上字符串的方法 注意:在你输入数据的时候,按 - 键将会可以让你回退一格。 PROMPT DEBUG -E 200 (从偏移地址200开始。输入 Hello,World ) 48 65 (输入48h (H)和65h (e) 6C 6C (输入6Ch (l)和6Ch (l) 6F 2C (输入6Fh (o)和2Ch (,) 57 6F (输入57h (W)和6Fh (o) 72 6C (输入72h (r)和6Ch (l) 64 24 (输入64h (d)和24h ($) ( Hello,World 已经输入完毕) -D 200 (显示你刚刚输入的内容: 48 65 6C 6C 6F 2C 57 6F-72 6C 64 24 . HELLO,WORLD$.) -A 100 (用汇编语言写一个新程序在IP-100h处开始) MOV AH,09 (选择DOS的09号功能调用,显示字符串) MOV DX,0200 (把输出地址(200h),放进寄存器) INT 21 (执行DOS功能调用,显示 Hello,World ) INT 20 (退出程序回到DOS状态) (结束汇编语言输入,回到DEBUG输入状态) -G (从 CS:IP开始运行程序, 就是从107F:0100h开始执行程序) 现在,我们可以把这个程序保存进一硬盘 -D 100 (纪录:程序的起始点在100h) -D 200 (纪录:程序数据单元的结束点是在020Bh) -H 20B 100 (运算 20Bh-100h=10Bh;程序长度267字节) -R BX (检查BX寄存器的值) :0000 (设置BX为0000h,程序的长度是BX:CX,实际上你可以把和CX写到一起,即实际长度为:0000010Bh,这样些的目的是使你可以计算更大的程序的长度) -R CX (设置CX 为010Bh, 这就是这个程序的长度了) :010B (现在你可以把这个108字节的程序写入硬盘了) -N (将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年乡镇退役军人服务站工作人员招聘考试知识点
- 工业园区提质增效的策略及实施路径
- 2025年中国平安保险公司招聘面试攻略与预测题解析
- 国防安全风险分级管控制度流程
- 2025年古代建筑灯饰设计专家认证考试模拟题集
- 2025年中石油片区经理竞聘考试热点题型及答题技巧
- 农产品即食食品系列创新创业项目商业计划书
- 2025年中式烹调师初级实操模拟考试与面试技巧
- 冶金行业职业健康安全管理体系和措施
- 2025年人社部公开遴选公务员考试全程指导手册
- 衢州龙游县龙新高速公路投资有限公司招聘笔试题库2025
- 《应用语文(第3版)》技工院校语文课程全套教学课件
- 《石油钻采设备》课件
- 老人居家治疗指南解读
- 瓦斯超限撤人流程及应急处置培训
- 创新园管理制度
- 小学一年级第一学期数学兴趣小组计划
- 第五届绵阳市职业技能大赛赛项技术文件-健康和社会照护
- 肾切除患者护理疑难病例
- 人力管理咨询合同范本
- 2025译林版高中英语高考复习必背全七册单词表(精校打印)
评论
0/150
提交评论