1、debug常用命令集Debug常用命令集 名称 解释 格式a (Assemble) 逐行汇编 a addressc (Compare) 比较两内存块 c range addressd (Dump) 内存 16进制显示 d address或 d range e (Enter) 修改内存字节 e address listf (fin) 预置一段内存 f range listg (Go) 执行程序 g =addressaddress.h (Hexavithmetic) 制算术运算 h value valuei (Input) 从指定端口地址输入 i pataddressl (Load) 读盘 l a
2、ddress driver seetorm (Move) 内存块传送 m range addressn (Name) 置文件名 n filespec filespec.o (Output) 从指定端口地址输出 o portadress byteq (Quit) 结束 qr (Register) 显示和修改寄存器 r register names (Search) 查找字节串 s range listt (Trace) 跟踪执行 t =address valueu (Unassemble) 反汇编 u address 或 rangew (Write) 存盘 w addressdriver sec
3、tor secnum? 联机帮助 ?debug小汇编 a命令debug小汇编 a命令是一个很有用的功能,许多的小程序都要他来做。编一些小程序比汇编要来得方便,快洁。在 Debug中,中断是非常有用的,首先,让我们先了解一下中断。所谓中断,其实,就是,当你做某事时,有人过来找你有其他事,你先放下手中的事(计算机中,称为保护现场) ,再去与叫你的那个人办事去,等完了,你又回,接着做刚才的事。这是个很通俗的讲法。计算机在运行时,也会出现这种情况,我们叫之中断。下面是他的一些常用中断向量的入口值详解:(记住哦,很用的.呵呵)IBM PC 中断 int10 ooH 屏幕方式设置入口:AH0,AL显示方式
4、代码(06)0:40*25 黑白 1:40*25 彩色2:80*25 黑白3:80*25 彩色文本4:320*200 彩色5:320*200 黑白6:640*200 黑白图形模式7:80*25 单色字符(单色显示器) 0BH 色彩设置入口:AH0B,BL0 设背景色,BH015 BL1 设调色码,BH010CH 写图形点入口:AH0C,CX:DX列号:行号,AL颜色ODH 读图形点入口:AH0D,CX:DX列号:行号返回:AL颜色0EH 在当前页、当前光标处写字符入口:AH0E,AL字符的 ASCII码,BL前景色OFH 显示器状态入口:AH0F返回:AL当前显示器方式,AH屏幕列数,BH当前
5、页号01H 光标设置 入口:AH1,CH光标起始行号(000C) ,CL光标结束行号(000C)注:CH CL02H 光标定位入口:AH2,BH页号,DH:DL起始行:列03H 读光标位置入口:AH3,BH页号。返回:DH:DL起始行:列06H 窗口上卷入品:AH6,AL窗口上卷行数,CH:CLDH:DL 窗口坐标注:AL0 卷动整个窗口07H 窗口下卷入口:AH7,AL窗口下卷行数,CH:CLDH:DL 窗口坐标08H 读当前光标处字符和属性入口:AH8,BH页号。返回:AH:AL字符的颜色:字符的 ASCII码注:颜色代码见下对照表09H:在当前光标处写字符和属性注:光标不下移入口:AH9
6、,BH页号,BL:AL字符的颜色:字符的 ASCII码,CX重复次数1 2 3 4 5 6 7 8 BL R G B I R G B 闪烁 字符底色 加亮 字符颜色中断向量号表中断号 解释 中断号 解释 0 除数为 0错 19 引导装入程序 1 音步中断 1A 日时调用 2 不可屏蔽中断 NMI 1B 键盘阻断时得到控制权 3 断电中断(CCH) 1C 时钟中断时得到控制权 4 溢出中断 1D 指向 CRT初始参数表 5 屏幕打印中断 1E 指向盒带参数表 6-7 保留 1F 1KB 图形模式 8 计时器中断(18.2 秒) 20 结束 DOS程序 9 键盘中断 21 DOS 功能调用 A-D
7、 保留 22 结束地址(建义用 EXEC) E 软盘机中断 23 DOS Crtl-Break 退出地址 F 保留 24 DOS 致命错向量 10 屏幕 I/O调用 25 DOS 绝对磁盘读 11 设备检查调用 26 DOS 绝对磁盘写 12 存储器检查调用 27 结束程序并驻留(建义用 31h) 13 软盘机 I/O调用 28-3F DOS 保留 14 RS-233I/O调用 40-7F 未用 15 盒带机 I/O调用 80-85 BASIC 保留 16 键盘 I/O调用 86-F0 BASIC 解释程序用 17 打印机 I/O调用 F1-FF 未用 18 ROMBASIC 入口 指令名详解
8、call 指令(过程调用) (控制指令长转移)详解:段内直接调用 段内间接调用(寄存器)段内间接调用(存储器)段间直接调用段间间接调用指令名jmp 指令(无条件转移指令) (控制指令长转移)详解:段内直接跳转 短段内直接跳转段内间接跳转(寄存器)段内间接跳转(存储器)段间直接跳转段间间接跳转指令名ret 指令(过程返回) (控制指令长转移) 详解:段内返回 段内返回立即数加于 sp段间返回段间返回立即数加于 spna/jnbe 指令(控制指令短转移) 不小于或不等于时转移 jae/jnb 指令 (控制指令短转移) 大于或等于时转移 jb/jnae 指令 (控制指令短转移) 小于转移 jbe/j
9、na 指令 (控制指令短转移) 小于或等 于转移 jg/jnle 指令(控制指令短转移) 大于转移 jge/jnl 指令 (控制指令短转移) 大于或等于转移 jl/jnge 指令 (控制指令短转移) 小于转移 jle/jng 指令 (控制指令短转移) 小于或等 于转移 je/jz 指令 (控制指令短转移) 等于转移 jne/jnz 指令 (控制指令短转移) 不等于转移 jc 指令 (控制指令短转移) 有进位时转移 jnc 指令 (控制指令短转移) 列进位时转移 jno 指令 (控制指令短转移) 不溢出时转移 jnp/jpo 指令 (控制指令短转移) 奇偶性为奇数时转移jns 指令 (控制指令短
10、转移) 符号位为“0“转移 jo 指令 (控制指令短转移) 溢出转移 jp/jpe 指令 (控制指令短转移) 奇偶性为偶数时转移 js 指令 (控制指令短转移) 符号位为“1“时转移 loop 指令 (循环控制指令短转移) cx 不为 0时循环 loope/loopz 指令 (循环控制指令短转移) cx 不为 0且标志 z1 时循环 loopne/loopnz 指令 (循环控制指令短转移) cx 不为 0且标志 z=0 时循环 jcxz 指令 (循环控制指令短转移) cx 为 0时转移 int 指令 (中断指令) 中断指令(后详解) into 指令 (中断指令) 溢出中断 iret 指令 (中
11、断指令) 中断返回 指令名shl 指令(逻辑左移) sal 指令(算术左移)shr 指令(逻辑右移)sar 指令(算术右移) 寄存器,1 rol 指令(循环左移) 寄存器,clror 指令(循环右移) 存储器,1rcl 指令(通过进位的循环左移)存储器,clrcr 指令(通过进位的循环右移) (逻辑运算)not 指令(取反运算)寄存器求反 (逻辑运算)存储器求反and 指令(与运算) (逻辑运算) 寄存器 and 寄存器 寄存器 寄存器 and 存储器 寄存器存储器 and 寄存器 存储器立即数 and 存储器 存储器立即数 and 累加器 累加器or 指令(或运算) (逻辑运算)寄存器 or
12、 寄存器 寄存器 寄存器 or 存储器 寄存器存储器 or 寄存器 存储器立即数 or 存储器 存储器立即数 or 累加器 累加器test 指令(测试) (逻辑运算) 寄存器 test 寄存器 寄存器 test 存储器寄存器 test 立即数存储器 test 立即数累加器 test 立即数 movs 指令(串传送) (字符串操作指令)单个传送 重复传送 cmps 指令(串比较) (字符串操作指令)单个比较 重复比较 scas 指令(串扫描) (字符串操作指令)单个搜索 重复搜索lods 指令(装入串) (字符串操作指令)单个装载 重复装载stos 指令(保存串) (字符串操作指令)单个存储 重
13、复存储mov 指令(传送字或字节) (数据传送命令) 寄存器与寄存器间传送 存储器与寄存器间传送立即数传送给存储器立即数传送给寄存器存储器传送给累加器累加器传送存储器寄存器传送给段寄存器存储器传送给段寄存器段寄存器传送给寄存器段寄存器传送给存储存器pop 指令(把字弹出堆栈) (数据传送命令)push 指令(把字压入堆栈) 存储器 寄存器段寄器 xchg 指令(交换字或字节) (数据传送命令) 寄存器与寄存器交换 存储器与寄存器交换寄存器与累加器交换in 指令(端口输入) (数据传送命令) 直接输入 间接输入out 指令(端口输出) (数据传送指令) 直接输出 间接输出add 指令(加法) (
14、算术指令)adc 指令(带进位加法) 寄存器寄存器 寄存器 寄存器存储器 寄存器存储器寄存器 存储器立即数存储器 存储器立即数累加器 累加器inc 指令(加 1) (算术指令) 存储器增量 寄存器增量sub 指令(减法) (算术指令)sbb 指令(带借位减法) 寄存器寄存器 寄存器 寄存器存储器 寄存器存储器寄存器 存储器立即数存储器 存储器立即数累加器 累加器dec 指令(减 1) (算术指令) 存储器减量 寄存器减量nec 指令(求反,以 0减之) 寄存器求补 存储器求补cmp 指令(比较) (算术指令) 寄存器与寄存器比较 寄存器与存储器比较寄存器与立即数比较存储器与立即数比较累加器与立
15、即数比较 mul 指令(无符号乘法) (算术指令)imul 指令(整数乘法) 与 8位寄存器相乘 与 16位寄存器相乘与 8位存储单元相乘与 16位存储单元相乘 div 指令(无符号除法) (算术指令)idiv 指令(整数除法) 被 8位寄存器除 被 16位寄存器除被 8位存储单元除被 16位存储单元除Debug实战1.查看主板的生产日期,版本D ffff:05D fe00:0e2.模拟 Rest键功能A :100 jmp ffff:0000:105g3.快速格式化软盘L 100 0 0 * 插入一张己格式化软盘W 100 0 0 * 放入一张欲格式化软盘注:* 分别为:720K e |1.2
16、M id |1.44M 21 4.硬盘格式化两种方法(1)G=c800:05(2) A 100mov ax,0703mov cx,0001mov dx,0080int 13int 3g 1005.加速键盘 A mov ax,0305mov bx,0000int 16int 20rcx10n wq6.关闭显示器(恢复时,按任意键)Amov ax,1201mov bl,36int 10mov ah,0int 16mov ax,1200int 10rcx 10n crt-wq 7.硬盘 DOS引导记录的修复 在软驱中放入一张己格式化软盘debug-l 100 2 0 1 -w 100 0 50 1把
17、软盘放入故障机软驱中debug-l 100 0 50 1-w 100 2 0 1 -q8.清 coms中 setup口令debug-amov bx,0038mov cx,0000mov ax,bxout 70,alinc cxcmp cx,0006jnz 0106int 20-rcx:20--w-q注:以上适合 super与 dtk机,对于 ast机,因为他的口令放在coms的 4ch-51h地址处,只要将:mov bx,0038 改为: mov bx,004c即可9.取消 coms的密码(将 coms数据清为初始化) -o 70,10-o 71,10-g-q10.将硬盘主引导记录保存到文件中
18、debug-amov ax,0201 mov bx,0200mov cx,0001mov dx,0080mov int 13int 3-rcx:200-nboot.dat-w-q 11.调用中断实现重启计算机(可以成文件)debug-aint 19int 20-rcx:2--w-qDEBUG主要命令DEBUG是为汇编语言设计的一种高度工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。一、DEBUG 程序的调用在 DOS的提示符下,可键入命令:C:DEBUG D:PATHFILENAME.EXTPARM1PARM2其中,文件名是被调试文件的名字。如用户键入文件,则 DEB
19、UG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用 DEBUG命令 N和 L把需要的文件装入存储器后再进行调试。命令中的 D指定驱动器 PATH为路径,PARM1 和 PARM2则为运行被调试文件时所需要的命令参数。在 DEBUG程序调入后,将出现提示符,此时就可用 DEBUG命令来调试程序。二、DEBUG 的主要命令1、显示存储单元的命令 D(DUMP),格式为:_Daddress或_Drange例如,按指定范围显示存储单元内容的方法为:-d100 12018E4:0100 c7 06 04 02 38 01 c7 06-06 02
20、00 02 c7 06 08 02 G.8.G.G.18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ;hM PQVW.718E4:0120 8B其中 0100至 0120是 DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用 ASCII字符表示每个字节,表示不可显示的字符。这里没有指定段地址,D 命令自动显示 DS段的内容。如果只指定首地址,则显示从首地址开始的 80个字节的内容。如果完全没有指定地址,则显示上一个 D命令显示的最后一个单元后的内容。2、修改存储单元内容的命令有两种。输入命令 E(ENTER),有两种
21、格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:-E address list例如,-E DS:100 F3XYZ8D其中 F3,X,Y,Z和各占一个字节,该命令可以用这五个字节来替代存储单元 DS:0100 到 0104的原先的内容。第二种格式则是采用逐个单元相继修改的方法。命令格式为:-E address例如,-E DS:100则可能显示为:18E4:0100 89.-如果需要把该单元的内容修改为 78,则用户可以直接键入 78,再按“空格“键可接着显示下一个单元的内容,如下:18E4:0100 89.78 1B.-这样,用户可以不断修改相继单元的内容,直到
22、用 ENTER键结束该命令为止。填写命令 F(FILL),其格式为:-F range list例如:-F 4BA:0100 5 F3XYZ8D使 04BA:01000104 单元包含指定的五个字节的内容。如果 list中的字节数超过指定的范围,则忽略超过的项;如果 list的字节数小于指定的范围,则重复使用 list填入,直到填满指定的所有单元为止。3)检查和修改寄存器内容的命令 R(register),它有三种格式如下:显示 CPU内所有寄存器内容和标志位状态,其格式为:-R例如,-rAX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=000
23、0 DI=0000DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC18E4:0100 C70604023801 MOV WORD PTR 0204,0138 DS:0204=0000显示和修改某个寄存器内容,其格式为:-R register name例如,键入-R AX系统将响应如下:AX F1F4:即 AX寄存器的当前内容为 F1F4,如不修改则按 ENTER键,否则,可键入欲修改的内容,如:-R bxBX 0369:059F则把 BX寄存器的内容修改为 059F。显示和修改标志位状态,命令格式为:-RF系统将响应
24、,如:OV DN EI NG ZR AC PE CY-此时,如不修改其内容可按 ENTER键,否则,可键入欲修改的内容,如:OV DN EI NG ZR AC PE CY-PONZDINV即可,可见键入的顺序可以是任意的。4)运行命令 G,其格式为:-G=address1address2address3其中,地址 1指定了运行的起始地址,如不指定则从当前的CS:IP 开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。5)跟踪命令 T(Trace),有两种格式:逐条指令跟踪-T =address从指定地址起执行一条指令后停
25、下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的 CS:IP 开始执行。多条指令跟踪-T =addressvalue从指定地址起执行 n条指令后停下来,n 由 value指定。6)汇编命令 A(Assemble),其格式为:-Aaddress该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG 把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如 100D。7)反汇编命令 U(Unassemble)有两种格式。从指定地址开始,反汇编 32个字节,其格式为:-Uaddress例如:-u10018E4:01
26、00 C70604023801 MOV WORD PTR0204,013818E4:0106 C70606020002 MOV WORD PTR0206,020018E4:010C C70606020202 MOV WORD PTR0208,020218E4:0112 BBO4O2 MOV BX,020418E4:0115 E80200 CALL 011A18E4:0118 CD20 INT 2018E4:011A 50 PUSH AX18E4:011B 51 PUSH CX18E4:011C 56 PUSH SI18E4:011D 57 PUSH DI18E4:011E 8B37 MOV S
27、I,BX如果地址被省略,则从上一个 U命令的最后一条指令的下一个单元开始显示 32个字节。对指定范围内的存储单元进行反汇编,格式为:-Urange例如:-u100 10c18E4:0100 C70604023801 MOV WORD PTR0204,013818E4:0106 C70606020002 MOV WORD PTR0206,020018E4:010C C70606020202 MOV WORD PTR0208,0202或-u100 112 18E4:0100 C70604023801 MOV WORD PTR0204,013818E4:0106 C70606020002 MOV W
28、ORD PTR0206,020018E4:010C C70606020202 MOV WORD PTR0208,0202可见这两种格式是等效的。8)命名命令 N(Name),其格式为:-N filespecs filespecs命令把两个文件标识符格式化在 CS:5CH 和 CS:6CH 的两个文件控制块中,以便在其后用 L或 W命令把文件装入存盘。filespecs的格式可以是:d:path filename.ext例如,-N myprog-L-可把文件 myprog装入存储器。9)装入命令(Load),有两种功能。把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:-L
29、addressdrive sector sector装入指定文件,其格式为:-Laddress此命令装入已在 CS:5CH 中格式化了文件控制块所指定的文件。如未指定地址,则装入 CS:0100 开始的存储区中。10)写命令 W(Write),有两种功能。把数据写入磁盘的指定扇区。其格式为:-W address drive sector sector把数据写入指定的文件中。其格式为:-Waddress此命令把指定的存储区中的数据写入由 CS:5CH 处的文件控制块所指定的文件中。如未指定地址则数据从 CS:0100 开始。要写入文件的字节数应先放入 BX和 CX中。11)退出 DEBUG命令
30、Q(Quit),其格式为:-Q它退出 DEBUG,返回 DOS。本命令并无存盘功能,如需存盘应先使用 W命令。问题:初学者问一个低级问题,执行 debug-a后,如果有一行输入错误,如何更改这一行?回答:加入进行如下输入:D:PWIN95Desktopdebug-a2129:0100movax,2002129:0103movbx,2002129:0106movcx,2002129:0109此时,发现 movbx,200一句错误,应为 movbx,20,可以敲回车返回“-“状态,然后输入:-a1032129:0103movbx,20如果多或者少若干行,不必重新输入,可以用 M命令移动后面的程序来
31、去掉或者增加程序空间。如何除错和汇编你的第一个 PC x86汇编语言程序呢?以下这些简单的解释可以让一个汇编语言新手使用 DEBUG: 0)在使用时,如何快速获得 debug的使用帮助呢。1)让我们开始工作吧,例如:显示 BIOS的日期。2)在你的电脑的 COMMANG.COM文件里搜寻“IBM“这几个字符。3) 一位十六进制数的运算。4) 检查 x86 寄存器内容。5)我们来编写我们的第一个用机械语言编写的程序-打印一个字符。6) 我们现在用汇编语言指令来做和例 5一样的事情。7)现在,我们不但要编写一个汇编程序,而且我们还要把它存盘。8) 现在,我们试一试查看一个已经编好的程序。9)你可以
32、用 DEBUG的计算功能计算程序的长度。10)另一种显示在屏幕上字符串的方法。11)让我们试一试反复输出。12)我们现在把两个程序连接起来。13) 让我们逐步运行这个刚刚修补的程序。14)如果一开始的命令不是跳转命令,那么可能就要用这种方法了。以下所有的命令都是可以运行在 WIN9x的 MS-DOS方式下的。进入 MS-DOS的方式有:开始程序MS-DOS 方式开始运行打开COMMAND确定或者你可以双击它:C:WindowsC 0)在使用时,如何快速获得 debug的使用帮助呢以下 PROMPT表示目录提示符:一般为:C:WINDOWSCOMMANDPROMPT DEBUG /?怎样?出错了
33、吧。显示如下C:WINDOWSDEBUG/?Runs Debug, a program testing and editing tool.DEBUG drive:pathfilename testfile-parametersdrive:pathfilename Specifies the file you want to test.testfile-parameters Specifies command-line information required bythe file you want to test.After Debug starts, type ? to display a
34、list of debugging commands.因为错了所以它给你显示一些提示。留意到最后一句了吗?现在我们再来试一试:PROMPT DEBUG (注意, DEBUG 程序的命令是在一条横线“-“后出现的。)-? (下面的内容是按字母顺序排列的)(注意:Note: Dont type the dash or comments - just the ?)显示如下,但是没有中文的哦,中文是我加上去的。 汇编 assemble A address比较 compare C range address倾倒 dump D range进入 enter E address list填充 fill F r
35、ange 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反汇编 unas
36、semble U range写 write W address drive firstsector number分配扩展内存 allocate expanded memory XA #pages释放扩展内存 deallocate expanded memory XD handlemap expanded memory pages XM Lpage Ppage handledisplay expanded memory status XS-q (这是退出 DEBUG回到 DOS状态)This quits out of debug, returning to the DOS prompt)Test
37、ed 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 mor
38、e 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 exe
39、cute 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
40、 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)在
41、你的电脑的 COMMANG.COM文件里搜寻“IBM“这几个字符下面的“C:Win95“是根据每不电脑不同的。像译者的电脑里就是“C:WINDOWS“PROMPT DEBUG C:Win95C-S 0 L FFFF “IBM“(从 0开始搜寻“IBM“,搜寻 FFFFh多个单元格)-Q (退出 DEBUG) 以下是译者做的: C:WINDOWSDEBUG C:WINDOWSCOMMAND.COM-S 0 L FFFF “IBM“-S 0 L FFFF “COMMAND“12A7:008D12A7:04F712A7:387012A7:38BE12A7:38DD-S 0 L FFFF “PATH“
42、12A7:38AD12A7:CCB712A7:CF55-S 0 L FFFF “COMSPEC“12A7:38D412A7:3A4D12A7:CCC4-QC:WINDOWS(注意:搜寻是要区分大小写的)(你可以看到上面是没有找到“IBM“的, 可以试一试“PATH“ , “COMSPEC“ , “COMMAND“)(注意: 这种方法用在查找加密资料和已被删除的资料等方面时是十分有用的)返回目录 3) 一位十六进制数的运算:PROMPT DEBUG-H 9 1 (加减两个十六进制的数, 9h+1h=Ah & 9h-1h=8h)结果是显示: 000A 0008-Q (退出 DEBUG) C:WIN
43、DOWSdebug-h 9 1000A 0008-qC:WINDOWS返回目录 4) 检查 x86寄存器内容PROMPT DEBUG-R (显示 x86寄存器内容)-Q (退出 DEBUG) C:WINDOWSdebug-RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC127C:0100 043C ADD AL,3C-Q下面是对寄存器的简单介绍: 数据存储器在本类中,一般讲的 AH就是 AX
44、的前八位,AL 就是 AX的后八位,后面的以此类推。AX Accumulator;作为累加器,所以它是算术运算的主要寄存器。另外所有的 I/O指令都使用这一寄存器与外部设备传送信息。BX Base register;可以作为通用寄存器使用,此外在计算存储器地址时,它经常用作基地址寄存器。CX Counting register;可以作为通用寄存器使用,此外在循环(LOOP)和串处理指令中作隐含的计数器。DX Data register;可以作为通用寄存器使用,一般在作双字长运算时,把 DX和 AX组合在一起存放一个双字长数,DX 用来存放高位字。此外,对某些 I/O操作,DX 可用来存放 I/
45、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
46、 segment register ;附加段寄存器,存放附加的数据,是一个辅助性的数据区,控制寄存器IP Next instruction pointer register;指令指针寄存器,它用来存放代码段中的偏移地址,在程序运行的过程中,它始终指向下一条指令的首地址,它与 CS寄存器联用确定下一条指令的物理地址F Flag register;标志寄存器 “NV UP EI PL NZ NA PO NC“就是了,也有人称之为 PSW Program Status Wold程序状态寄存器 (这里有一点必须讲明白的现在在,其实从奔腾开始这些寄存器(除了所有段寄存器,标志寄存器 )都是 32位的。并
47、且加多了两个16位段寄存器 FS,GS。dos 下面看到这些寄存器是 16位的。要看 32位寄存器可以使用 soft-ice。对于 FS,GS的作用我也不是很清楚,希望有高手指点,谢谢。) 返回目录 5)我们来编写我们的第一个用机械语言编写的程序-打印一个字符(这里用机械语言的主要原因是考虑到有一些用户不懂汇编命令,现在就要让他有一个认识计算机程序实质是一些数字) PROMPT DEBUG-E 100 (在偏移地址为 100的地方输入机械指令程序)B402 (在 AX寄存器的前八位存入 02)B241 (在 DX寄存器的后八位存入 41h,41h 就是大写 A的 ASCII码,身边有 ASCII表的朋友可以对着表改改数字试一试)CD21 (当 AH=02时这是 DOS显示输出的中断号)CD20 (退出 DOS)-G (程序运行,并在屏幕上显示出“A“)程序运行完以后你将看到“Program terminated normally“(程序正常结束了).