debug常用命令解析
debug常用命令解析1.!address eax查看对应内存页的属性2.vertarget 显示当前进程的大致信息3.!peb 显示process Environment Block4.lmvm 可以查看任意一个dll的详细信息例如:0:026 lmvm msvcrt (deferred)表示察看msvcrt.dll的信息,但是没有加载 symbol可以通过.reload命令来加载5.reload /!sym 加载符号文件6.lmf 列出当前进程中加载的所有dll文件和对应的路径0:018> lmf7.r 命令显示和修改寄存器上的值r命令显示和修改寄存器上的值0:018> r 显示寄存器的值0:018> r eax=0 修改了寄存器,把eax的值修改为0x08.d命令显示esp寄存器指向的内存如下0:018>d esp用dd命令直接指定054efc14地址0:018>dd 054efc14注意:第二个d表示DWORD格式,此外还有db(byte),du(Unicode),dc(char)等等。
数据查看指令 d{a|b|c|d|D|f|p|q|u|w|W}d{b|c|d|D|f|p|q}分别是显示:byte&ASCII,double-word&ASCII,double-word,double-precision,float,pointer-sized,quad-word 数据;DA用于显示ASCII,DU用于显示UNICODE;BYB,BYD,显示binary和Byte及binary和DWORD补充一个DV,用于查看本地变量用的9.e命令可以用来修改内存地址跟d命令一样,e命令后面也可以跟类型后缀,比如ed命令表示用DWORD的方式修改。
下面的命令把054efc14地址上的值修改为11112222。
0:018>ed 054efc14 11112222修改后可以用dd命令来查看内存。
0:018>dd 0543fc14 L4 L4参数指定内存区间的长度为4个DWORD,这样输出只有1行,而不是8行了。
10.s 命令用来搜索内存具体见help文档11.!runaway 可以显示每一个线程的cpu消耗0:018> !runaway 结果如下:0:83c 0 days 0:00:00.40613:bd4 0 days 0:00:00.04610:ac8 0 days 0:00:00.04624:4f4 0 days 0:00:00.031上面输出的第一列是线程的编号和线程ID,后一列对应的是该线程在用户态模式中的总的繁忙时间。
在该命令加上f参数,还可以看到内核态的繁忙时间,当进程内存占用率比较高的时候 ,通过该命令可以方便的找到对应的繁忙线程。
12.~ 命令是用来切换目标线程0:018> ~ 可以显示线程的信息0:018> ~0s把当前的线程切换到0号线程,也就是主线程,切换后提示符会变为0:000.13.~* 命令列出当前进程中的所有线程的详细信息14.~*kb命令列出所有线程的堆栈15.k 命令用来显示当前线程的堆栈,如下0:018> k跟d命令一样,k后面也可以跟很多后缀,比如kb kp,kn,kv,kl等,这些后缀控制了 显示的格式和信息。
栈指令k[b|p|P|v]这四条指令显示的内容类似,但是每个指令都有特色,KB显示三个参数,Kp显示所有的参数,但需要Full Symbols或Private PDBSymbols支持。
KP与Kp相似,只是KP将参数换行显示了。
Kv用于显示FPO和调用约定,KD,用于显示Stack的Dump,在跟踪栈时比较有用。
这些指令区分大小。
16.u命令把指定地址上的代码翻译成汇编输出0:018> u 7739d023USER32!NtUserWaitMessage:7739d023 b84a120000 mov eax,0x124a7739d028 ba0003fe7f mov edx,0x7ffe03007739d02d ff12 call dword ptr [edx]7739d02f c3 ret如果符号文件加载正确,可以用uf命令直接反汇编整个函数,比如uf USER32! NtUserWaitMessage17.x 查找符号的二进制地址如下0:018> x msvcr!printf77bd27c2 msvcrt!printf = <no type information>上面的命令找到了printf函数的入口地址在77bd27c20:001> x ntdll!GlobalCounter7c99f72c ntdll!GlobalCounter = <no type information>上面的命令表示ntdll!GlobalCounter这个变量保存的地址是7c99f72c。
注意:符号对应的是变量和变量所在的地址,不是变量的值,上面只是找到GlobalCounter 这个变量的值是7c99f72,要找到变量的值,需要用d命令读取内存地址来获取。
X命令还支持通配符,比如x ntdll !*命令列出ntdll模块中的所有的符号,以及对应的二进制地址。
18.dds 打印内存地址上的二进制值同时自动搜索二进制值对应的符号。
比如要看看当前**中保存了那些函数地址,就可以检查ebp指向的内存0:018>dds ebp0013ed98 0013ee240013ed9c 75ecb30f BROWSEUI!BrowserProtectedThreadProc+0x440013eda0 001638200013eda4 0013ee500013eda8 001638200013edac 000000000013edb0 0013ee100013edb4 75ece83a BROWSEUI!__delayLoadHelper2+0x23a0013edb8 000000050013edbc 0013edcc0013edc0 0013ee500013edc4 001638200013edc8 000000000013edcc 000000240013edd0 75f36d2c BROWSEUI!_DELAY_IMPORT_DESCRIPTOR_SHELL320013edd4 75f3a184 BROWSEUI!_imp__SHGetInstanceExplorer0013edd8 75f36e80 BROWSEUI!_sz_SHELL320013eddc 000000010013ede0 75f3726a BROWSEUI! urlmon_NULL_THUNK_DATA_DLN+0x1160013ede4 7c8d0000 SHELL32!_imp__RegCloseKey <PERF> (SHELL32+0x0)0013ede8 7c925b34 SHELL32!SHGetInstanceExplorer这里dds命令从ebp指向的内存地址0013ed98开始打印,第一列是内存地址的值,第二列是地址上对应的二进制数据,第三列是二进制对应的符号。
上面的命令自动找到了75ecb390f对应的符号是BROWSEUI!BrowserProtectedThreadProc +0x44.Com interface 和c++ vtable里面的成员函数都是顺序排列的。
所以,dds命令可以方便的找到虚函数表中的具体的函数地址,比如用下面的命令可以找到OpaqueDatinfo类型中虚函数的实际函数地址。
首先通过x命令找到OpaqueDataInfo虚函数地址0:000> x ole32!OpaqueDataInfo::vftable’7768265c ole32!OpaqueDataInfo::`vftable'' = <no type information>77682680 ole32!OpaqueDataInfo::`vftable'' = <no type information>接下来dds命令可以打印出虚函数表中的函数名字0:000> dds 7768265c19.frame 命令在栈中切换以便检查局部变量要查看局部变量的需要如下:1查看线程的callstack0:018>knl00 0012f7a0 7c821c94 ntdll!KiFastSystemCallRet01 0012f7a4 7c836066 ntdll!NtRequestWaitReplyPort+0xc02 0012f7c4 77eaaba3 ntdll!CsrClientCallServer+0x8c03 0012f8bc 77eaacb8 kernel32!ReadConsoleInternal+0x1b804 0012f944 77e41990 kernel32!ReadConsoleA+0x3b第一列的号称为Frame num,通过.frame命令就可以切换到对应的函数中检查局部变量,比如我们检查kernel32!ReadConsoleA,这个函数的frame num是4,于是,我们如下2 iframe切换到指定行号的函数中0:018> .frame 43然后调用x显示当前frame的局部变量,比如这个函数中有两个局部变量pcls和rawptr 0:018> x0012fced pcls = 0x0039ba800012fcd8 rawptr = 0x0039ba8020.dt 格式化显示资料Dt命令格式化显示变量的资料和结构0:000> dt pclsLocal var @ 0x12fce4 Type MyCls*0x0039ba80+0x000 str : 0x00416648 "abcd"+0x004 inobj : inner上面的命令打印出pcls的类型是MyCls指针,指向的地址是0x0039ba80,其中的两个class 成员的偏移分别在+0和+4,对应的值在第2列显示。
加上-b -r参数可以显示inner class 和数组的信息:0:000> dt pcls -b -rLocal var @ 0x12fce4 Type MyCls*0x0039ba80+0x000 str : 0x00416648 "abcd"+0x004 inobj : innner+0x000 arr : "abcd"[00] 97 ''a''[01] 98 ''b''[02] 99 ''c''[03] 100 ''d''[04] 0 ''''[05] 0 ''''[06] 0 ''''[07] 0 ''''[08] 0 ''''[09] 0 ''''对于任意的地址,也可以手动指定符号类型来格式化显示。
DEBUG的详细用法(自己测试)
将机器指令程序送到起始地址为200H单元
-E 200 B2, 65, B4, 02, CD, 21, CD, 20
执行机器指令程序
-G=200
e
Program terminated normally
示例二:显示修改寄存器内容
5.读写磁盘
-N [d:][PATH]文件名.扩展名 指定想要读写的磁盘文件
-W 内存地址 将指定内存块写入文件
-L [内存地址] 将文件调如内存
修改寄存器
-R AX
AX 0000
:1234
-R
AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B76 ES=0B76 SS=0B76 CS=0B76 IP=0100 NV UP EI PL NZ NA PO NC
0B76:1006 CD20 INT 20
示例四:执行程序
单步执行
-T=0B76:1000
AX=0234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000
符号标志SF(Sign flag) NG(1) PL(0)
零标志ZF(Zero flag) ZR(1) NZ(0)
2010-02-24 20:01 DEBUG详细用法DEBUG详细用法
DEBUG命令一览
1.读写寄存器
-R 显示所有寄存器内容
-R 寄存器名 显示和修改指定寄存器内容
示例一:DEBUG环境下建立和汇编程序
输入并汇编程序
-A 100
debug常见命令使用说明
五、DEBUG调试程序DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。
它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。
1)DEBUG程序使用在DOS提示符下键入命令:C>DEBUG [盘符:][路径][文件名.EXE][参数1][参数2]这时屏幕上出现DEBUG的提示符“-”,表示系统在DEBUG管理之下,此时可以用DEBUG 进行程序调试。
若所有选项省略,仅把DEBUG装入内存,可对当前内存中的内容进行调试,或者再用N和L命令,从指定盘上装入要调试的程序;若命令行中有文件名,则DOS把DEBUG 程序调入内存后,再由DEBUG将指定的文件名装入内存。
2)DEBUG的常用命令(1)汇编命令A格式:A[起始地址]功能:将输入源程序的指令汇编成目标代码并从指定地址单元开始存放。
若缺省起始地址,则从当前CS:100地址开始存放。
A命令按行汇编,主要是用于小段程序的汇编或对目标程序的修改。
(2)反汇编命令U格式1:U[起始地址]格式2:U[起始地址][结束地址|字节数]功能:格式1从指定起始地址处开始将32个字节的目标代码转换成汇编指令形式,缺省起始地址,则从当前地址CS:IP开始。
格式2将指定范围的内存单元中的目标代码转换成汇编指令。
(3)显示、修改寄存器命令R格式:R[寄存器名]功能:若给出寄存器名,则显示该寄存器的内容并可进行修改。
缺省寄存器名,则按以下格式显示所有寄存器的内容及当前值(不能修改)。
AX=0000 BX=0004 CX=0020 DX=0000 SP=0080 BP=0000 SI=0000DI=0000 DS=3000 ES=23A0 CS=138E IP=0000NV UP DI PL NZ NA PO NC138E:0000 MOV AX,1234-R AX ;输入命令AX 0014 ;显示AX的内容:;供修改,不修改按回车。
调试程序Debug常用命令
20122012-4-27
7
2)D命令(显示内存单元内容) ) 命令 显示内存单元内容) 命令(
格式3:_D DS: 长度↙ 格式3:_D DS:开始偏移地址 L 长度↙ 作用: 作用:显示指定段中从开始偏移地址起由长度指定的 字节单元的内容。 字节单元的内容。 :_D DS: 例:_D DS:4 L 5↙
20122012-4-27
2
1)R命令(查看和修改寄存器内容) ) 命令 查看和修改寄存器内容) 命令(
格式1:_R (_r 格式1:_R↙(_r↙) 作用:显示所有寄存器的内容。 作用:显示所有寄存器的内容。
20122012-4-27
3
1)R命令(查看和修改寄存器内容) ) 命令 查看和修改寄存器内容) 命令(
20122012-4-27
17
6)T命令(单步运行或跟踪) 命令(单步运行或跟踪)
格式2:_T 偏移地址↙ 格式2:_T =偏移地址↙ 作用:执行指定的偏移地址处的一条指令, 作用:执行指定的偏移地址处的一条指令,执行完后 停下来, 停下来,并显示所有寄存器内容及状态标志位的值和 下一条要执行的指令。 下一条要执行的指令。 :_T 0105↙ 例:_T =0105↙
20122012-4-27
9
3)E命令(修改内存单元内容) 命令(修改内存单元内容)
格式1:_E DS: 内容表↙ 格式1:_E DS:偏移地址 内容表↙ 作用: 作用:用内容表中内容去替换从偏移地址开始的内存 单元的内容。 单元的内容。 :_E DS: dsx’ AA↙ 例:_E DS:4 ‘dsx FF 00 AA↙
调试程序Debug 调试程序Debug 常用命令简介) (常用命令简介)
Debug的启动 Debug的启动
DEBUG命令使用解析及范例大全
DEBUG命令使用解析及范例大全启动Debug,它是可用于测试和调试MS-DOS 可执行文件的程序。
Debug [[drive:][path] filename [parameters]]参数[drive:][path] filename指定要测试的可执行文件的位置和名称。
parameters指定要测试的可执行文件所需要的任何命令行信息。
说明使用Debug 命令但不指定要测试的文件如果使用没有位置和文件名的Debug 命令,然后键入所有的Debug 命令以响应Debug 提示符,连字符(-)。
Debug 命令以下是Debug 命令列表:? 显示Debug 命令列表。
a 汇编8086/8087/8088 记忆码。
c 比较内存的两个部分。
d 显示部分内存的内容。
e 从指定地址开始,将数据输入到内存。
f 使用指定值填充一段内存。
g 运行在内存中的可执行文件。
h 执行十六进制运算。
i 显示来自特定端口的 1 字节值。
l 将文件或磁盘扇区内容加载到内存。
m 复制内存块中的内容/n 为l 或w 命令指定文件,或者指定正在测试的文件的参数。
o 向输出端口发送 1 个字节的值。
p 执行循环、重复的字符串指令、软件中断或子例程。
q 停止Debug 会话。
r 显示或改变一个或多个寄存器。
s 在部分内存中搜索一个或多个字节值的模式。
t 执行一条指令,然后显示所有寄存器的内容、所有标志的状态和Debug 下一步要执行的指令的解码形式。
u 反汇编字节并显示相应的原语句。
w 将被测试文件写入磁盘。
xa 分配扩展内存。
xd 释放扩展内存。
xm 映射扩展内存页。
xs 显示扩展内存的状态。
分隔命令参数所有Debug 命令都接受参数,除了q 命令之外。
可以用逗号或空格分隔参数,但是只有在两个十六进制值之间才需要这些分隔符。
因此,以下命令等价:dcs:100 110d cs:100 110d,cs:100,110指定有效地址项Debug 命令中的address 参数指定内存位置。
DEBUG命令详解
命令行参数形式:格式:DEBUG [[驱动器号:][路径]文件名[调试参数]]用途:debug将所指定文件装入内存,显示提示符“-”等待进一步命令。
若装入文件为.exe文件,按照重定位原则装入为可执行状态。
.com文件类似。
若为其它类型文件则直接进行内存映射,由偏移量100H原封不动读入内存。
debug将在缓冲区为被调试程序建立适当的PSP(程序段前缀,Program Segment Prefix)。
在PSP中的偏移量80H为命令行的末尾。
而且在偏移量5CH和6CH由包含参数后面的可选参数构成缺省的FCB(文件控制块,File Control Block)。
进入时各寄存器初使情况:寄存器.com程序.exe程序AX 指定驱动器错误码指定驱动器错误码BX 程序空间的高地址程序空间的高地址CX 程序空间的低地址程序空间的低地址DX 0 0 SI 0 0DI 0 0BP 0 0SP 0FFFFH或可利用的不定内存空间上限减2IP 100H 目标程序的的代码入口偏移量CS PSP 目标程序代码段址DS PSP PSPCS PSP PSPSS PSP 目标程序堆栈段底命令:A: 编写汇编代码(Assemble)格式:A[地址]用途:程序允许在指定位置(若无缺省为IP指针位置)进行汇编程序书写。
细节:*所有数值皆为十六进制整数,数值后不带“H”*不支持文件管理用的目录表、宏标记、条件汇编*跳转指令后要直接书写十六进制地址不支持标号*数据类型若非默认类型,要以PTR加以指定*字符串操作要指定类型为B或W(如lodsb和lodsw等)及长度*用DB和DW接受数据定义,直按进行汇编*对内存地址加[]以与立即数区分C: 内存内容比较(Compare)格式:C 地址范围地址地址范围:做比较的第一个内存域始未地址或始地址和长度地址:做比较的第二个内存域的始地址用途:*对内存中两个域的内容加以比较,以字节为单位。
对发现有差别的内容及其地址用如下形式显示出:地址1 始位置未位置地址2*若地址范围或地址不含段地址,默认为DS的值。
DEBUG常用命令
(0103:查询的起始位置) (0100:查询起始,0107:查询终止)
二:修改存储单元命令E(Enter) e 地址 数据表 --------用数据表的数据修改指定单元的内容 e 地址 --------查询指定内容后再修改
—e 0100 "a" (将a输入0100中) —e 0100 "ABCD" (将ABCD存放到0100H开始的连续4个单元中)
调试时的几个注意点
1、进入DEBUG后,直接用-R命令看到的段地址是系 进入DEBUG后 直接用统自动装载的,以此察看不对, 统自动装载的,以此察看不对,需以程序中的赋 值为准。 值为准。 2、为便于察看结果,需进入MS-DOS方式调试 为便于察看结果,需进入MS-DOS方式调试 3、调试程序,可对代码进行简化,有助于快速查错 调试程序,可对代码进行简化, 4、为使结果直观,可在程序中加入输出语句 为使结果直观, 5、必须掌握源程序-可执行程序的完成过程,可以简 必须掌握源程序-可执行程序的完成过程, 单程序作为练习
显示存储单元命令D(Dump) 一:显示存储单元命令 显示存储单元命令 d[地址 地址]--------显示当前或指定开始地址的主存内容 地址 显示当前或指定开始地址的主存内容 d[范围 范围]---------显示指定范围的主存内容 显示指定范围的主存内容 范围
—d 0b1a:0103 —d 0b1a:0100 0107
DEBUG常用命令 常用命令
DEBUG是汇编语言的调试工具. 使用DEBUG命令时应该注意: 1.用于命令的字母不区分大小写; 2.只使用十六进制数,没有后缀字母; 3.分隔符(空格或逗号)只在两个数值之间是必需的,命令 和参数间可以没有分隔符; 4.每个命令符只有按了回车键才有效,可以用Ctrl+Break 中止命令的执行; 5.如果命令不符合DEBUG的规则,则将以"error"提示, 并用"^"指示错误所在的位置.
DEBUG使用总结
一、DEBUG的主要命令A命令功能: 将助记符指令转换为机器指令码存储在指定的内存单元,即汇编过程格式1: Axxxx:0100 助记符指令1(ENTER)xxxx:xxxx 助记符指令2(ENTER)……xxxx:xxxx ENTER结束功能: 逐次将助记符指令对应的指令码存入从CS: 0100h起的连续的内存单元格式2:A 起始地址start-addrxxxx:0100 助记符指令1(ENTER)xxxx:xxxx 助记符指令2(ENTER)……xxxx:xxxx ENTER结束功能: 逐次将助记符指令对应的指令码存入从CS: star-addr起的连续的内存单元注: 指令中可以包含数据定义伪指令DB/DW等语句D命令功能: 查看指定内存单元的内容格式1: D [起始地址start-addr [L长度length]]功能: 显示从起始地址start-addr开始的length个字节,省略start-addr时从DS:0100h开始,省略长度length时默认值为80H(128)注: start-addr可以为偏移地址, 此时其默认的段基址为DS;也可以显式地按段地址:偏移地址格式指明完整的逻辑地址, 段地址不一定是段寄存器, 还可以是任意16位地址格式2: D[起始地址start-addr 终结地址end-addr]功能: 显示从起始地址start-addr开始到结束地址end-addr之间的字节注: start-addr和end-addr同时为偏移地址时默认的段基址为DS;start-addr采用段地址:偏移地址格式指明时, end-addr可以不必再指明段地址, 直接以偏移地址形式给出(start-addr和end-addr的段地址始终相同);当start-addr和end-addr的偏移地址相同时只显示该存储单元的字节.E命令功能: 修改指定内存单元的内容格式1: E 起始地址start-addr 字节数据1 字节数据2 … 字节数据n功能: 逐次用后面的字节数据修改从起始地址起的连续内存单元的内容格式2: E 起始地址start-addr(按ENTER)起始地址该内存单元的原值.待输入新值/空格键功能:在提示情况下逐个修改从起始地址start-addr开始的字节数据的值, 输入空格表示不做修改, 直至输入ENTER键结束G命令功能: 执行正在调试的汇编程序至指定的断点格式: G [start-addr] break-addr1[, break-addr2, …]功能:star-addr是指令码的起始偏移地址, break-addr是断点处的偏移地址, 段地址均为CS, 可以指定多个断点位置P命令功能: 执行INT, CALL, LOOP及重复串指令(REP等)直至下一条指令格式: P [start-addr] [n]功能:star-addr是待执行指令码的起始偏移地址, n是往下执行指令的条数Q命令功能: 退出debug格式: QR命令功能:显示和修改寄存器的内容格式1:R;显示所有寄存器的内容格式2: R 寄存器名;显示指定寄存器的值, 再按ENTER后键入数值可修改该寄存器的值格式3:R F;显示标志寄存器中各标志位的值标志位符号的意义如下:标志位符号意义标志位1标志位0OF 溢出(是/否) OV NVDF 方向(减/增) DN UPIF 中断(允许/关闭)EI DISF 符号(负/正) NG PLZF 零(是/否) ZR NZAF 辅助进位(是/否)AC NAPF 奇偶(偶/奇) PE POCF 进位(是/否) CY NCT命令功能: 以单步方式执行指定的指令代码格式1: T功能: 以单步方式执行从CS:IP开始的1条指令格式2: T 指令条数n功能: 以单步方式执行从CS:IP开始开始的n条指令U命令功能: 将内存单元的机器指令码转换为助记符指令,即反汇编过程格式1: U 起始地址start-addr功能: 将从start-addr开始的32个字节的指令码转换为助记符格式2: U 起始地址start-addr终结地址end-addr功能: 将从start-addr开始至终结地址end-addr之间的指令码转换为助记符二、DEBUG的相关说明1.debug默认所有的数值都是16进制的,且无需在最后添加后缀h;2.debug不区分字母的大小写;3.快捷键: F1键--逐个重复前一条命令的字符,F3键--重复前面整条命令;4.在dos系统中文件名的最大长度为8个字符,扩展名的最大长度为3个字符.在给asm文件命名时若超过8个字符,虽然可以编译生成obj文件但在连接时却生成不了exe文件,从而引发一些错误.注意文件名不要超过8个字符;5.对于32位指令,debug并不显示其助记符,而是会以DB开头显示,这与数据定义伪指令不同;6.在[EA](EA为常数)作操作数时(如MOV 寄存器,[EA]和MOV [EA],寄存器),若不在[EA]前加段前缀, 则debug会将其视为常数EA而非偏移地址,此时必须显式指明段前缀.三、用DEBUG调试程序1.顺序指令的调试调试程序的指令格式路径>debug filename.exe接着可用R指令查看各寄存器的值, 说明如下:1)CX的值为整个程序的指令码的字节总数;2)CS:IP指向第一条指令, (CS)=(DS)+10h, (IP)=0000h, 这是因为程序在内存中的起始地址是DS:0000h,但前256个字节单元用于PSP,所以从(CS+10h): 0000h才是程序的指令码.用U命令可以查看程序的助记符指令下面以程序test.asm为例说明, 其源代码如下:.model small.databuff db 2 dup(?).codestart:mov ax,@datamov ds,axmov ax,100mov bl,3div blmov buff,almov buff+1,ahmov ah,4chint 21hend start可知数据段的段基址为1450h, 而buff内存的偏移地址为0008h, 从144F:00~144F:16都是源程序的机器码, 共计17个字节再接着可用T命令单步调试每单步执行一条指令, 都会显示执行指令后的寄存器的内容注意IP的变化代表了上一条指令的机器码长度下面执行3条指令, 如下所示:可以看到进行除法运算后AL=21h=33(商), AH=1h(余数), 同时提示下一条指令为: MOV [0008H], AL这里偏移量0008h就是buff的偏移量, 同时右下角显示了该内存单元的当前内容为14h上面在执行完商和余数的MOV指令后, 用D指令查看buff及其后一个单元的内容, 分别是商21h及余数1h, 程序执行完全正确.最后在单步执行INT 21H指令时要用P指令, 此时会显示程序正常结束字样!2.循环结构的调试以testloop.asm为例:.model small.databuff dw ?.codestart:mov ax,@datamov ds,axmov cx,9mov ax,2again:add ax,axloop againmov buff,axmov ah,4chint 21hend start对循环结构的调试方法是:只需调试2~3次循环即可确定循环逻辑是否正确,接着可让程序直接执行到循环结束,然后再单步调试.让程序执行到某个断点位置: G命令断点偏移地址让程序执行到循环结束: 在调试LOOP指令时使用P命令。
DEBUG的命令及功能
DEBUG的命令及功能1. A(assemble):将指令转换成机器码并存储到内存中。
-A100:在内存地址100处开始输入指令。
2. D(dump):显示内存中的内容。
-D100200:显示内存地址从100到200的内容。
3. E(enter):修改内存中的数据。
-E1004000:在内存地址100处将数据修改为40。
4. G(go):执行程序。
-G100:从内存地址100处开始执行程序。
6. Q(quit):退出DEBUG。
-Q:退出DEBUG程序。
7. R(registers):显示和修改CPU寄存器的值。
-R:显示所有寄存器及其值。
-RAX1234:将AX寄存器的值修改为12348. T(trace):单步跟踪程序的执行。
-T:执行下一条指令并停止。
9. P(proceed):继续执行程序直至下一个断点或程序结束。
-P:继续执行程序。
10. U(unassemble):将机器码转换成指令。
-U100120:从内存地址100处开始将机器码转换成指令。
11. B(breakpoint):设置断点。
-B100:在内存地址100处设置断点。
12. S (search):在内存中指定的内容。
- S 100 200 "Hello": 在内存地址100到200之间字符串"Hello"。
13. L(load):加载程序到内存中。
-L100:从内存地址100处加载程序。
14. W(write):将内存中的数据写入文件。
- W 100 200 file.txt: 将内存地址100到200的数据写入到文件file.txt。
15. M(move):将内存中的数据移动到指定的地址。
-M100200300:将内存地址100到200的数据移动到地址300处。
16. X (execute):执行子程序。
-X100:从内存地址100处执行子程序。
17. H(help):显示DEBUG命令的帮助信息。
DEBUG命令详解
DEBUG调试程序的使用一、DEBUG的启动在DOS系统提示符下,运行DEBUG命令即可启动。
命令格式:DEBUG [文件名全称]功能:启动DEBUG调试程序,并把指定名字的文件装载入内存,以供调试。
说明:启动DEBUG,实际就是让计算机执行DEBUG.EXE这个调试程序。
若该程序不在当前目录下,需要在命令中指定该程序所在的位置路径(包括其所在磁盘和文件夹)。
文件名全称指定要调试的文件名及其所在的位置路径。
若指定该选项,则在启动DEBUG时把该文件装载入内存,以供调试,该文件一般是EXE文件或COM文件。
若不指定该选项,则只启动DEBUG,不装载文件。
二、DEBUG常用命令1、D——显示内存单元内容的命令格式:D[开始地址[结束地址]]说明:①若“开始地址”和“结束地址”都指定,则显示指定地址范围内的内存单元的内容;若只指定“开始地址”,省略“结束地址”,则显示从“开始地址”开始的80H个字节的内容;若“开始地址”和“结束地址”都省略,则显示从上次显示的末字节单元的下一个字节开始的80H个字节的内容。
②“开始地址”可包含段地址,若省略段地址,则默认使用DS的值作段地址。
2、E——输入内容(修改内存单元内容)命令格式:E开始地址[数据表列]说明:①若指定数据表列,则用数据表列中的数据存入从指定地址开始的内存单元中;若省略数据表列,则先显示指定开始地址的内存单元的内容,等待你修改。
若需要修改,输入其内容,按空格键显示、修改下一个内存单元内容;若不需要修改,直接按空格键显示、修改下一个内存单元内容,修改完成后按回车键。
②“开始地址”可包含段地址,若省略段地址,则默认使用DS的值作段地址。
3、F——填充内容(修改内存单元内容)命令格式:F开始地址结束地址数据表列说明:①用数据表列中的数据存入由开始地址和结束地址指定范围内的内存单元。
若数据表列中的数据少于指定地址范围的内存单元数,则循环使用表列中的数据存入内存单元,若数据表列中的数据多于指定地址范围的内存单元数,则多余的数据被忽略。
DEBUG各命令详细说明(很详细)
DEBUG各命令详细说明(很详细)2.启动DEBUG在命令窗口中启动DEBUG,启动命令一般为:DEBUG [文件名] [参数表]。
其中:文件名指定被调试的文件,其包括名和后缀,参数表是被调试文件运行时所需要的参数。
被调试的文件可以是系统中的任何文件,但通常它们的后缀为.EXE或.COM。
当DEBUG启动成功后,将显示连接符“-”,这时,可输入各种DEBUG命令。
DEBUG中所有命令及其含义如DEBUG各命令功能说明表所示。
关于使用命令的几点说明:在提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行命令是单个字母,命令和参数的大小写可混合输入可用F1、 F2、F3、Ins、Del、左移键、右移键等编辑键来编辑本行命令当命令出现语法错误时,将在出错位置显示“^ Error”可用Ctrl+C或Ctrl+Break来终止当前命令的执行,还可用Ctrl+S或Ctrl+Num Lock来暂停屏幕显示(当连续不断地显示信息时)以下通过实现十九个示例来熟悉DEBUG的命令集和基本的汇编指令。
R命令的使用R命令作用:观看和修改寄存器的值。
在提示符“-”下输入以下命令:R。
DEBUG将会显示出当前所有寄存器和标志位的状态。
接下来再输入命令RCX。
在提示符“:”后输入100。
该命令的作用是将寄存器CX的值设置为100(注意:DEBUG使用的是十六进制,这里的100相当于十进制的256。
)最后再执行R命令,观看修改后的寄存器值。
H命令的使用H命令作用:计算两个十六进制数的和与差。
在提示符“–”下输入以下命令:H 10 1。
观看命令执行结果。
运行结果的前一个数是计算出来的和,后一个数是计算出来的差。
计算结果均用十六进制形式表示。
D命令的使用D命令作用:显示内存区域的内容。
在提示符“–”下连续执行命令R、D、D。
观看命令执行结果。
前面已经介绍过了,命令R的作用是显示当前寄存器的值。
而命令D的作用是显示内存区域的内容,最左边是内存的起始地址,中间以十六进制的形式显示内存值,最右边是以ASCII码的形式显示内存值。
