回 帖 发 新 帖 刷新版面

主题:求助debug常用命令

我刚学汇编,现在 连一些-a,-t,-u,-d~~也弄的不是很清楚,还有什么MOV,PUSH,等等操作,大家能够帮忙说说不?就是DOS里面帮我写个程序(也许那不叫程序)就好,然后加上注释,我怕我看不懂,谢了!

回复列表 (共7个回复)

沙发

a(Assemble) 逐行汇编 a [address] 
t (Trace) 跟踪执行 t [=address] [value] 就是把你要执行的指令 分步 
d (Dump) 内存16进制显示 d [address]或 d [range] 
u (Unassemble) 反汇编 u [address ]或range 

MOV 传送字或字节 数据传送命令(把XX移动到XX)
PUSH 把字压入堆栈 (把XX压入XXS)

板凳

Debug常用命令集 
    
  名称 解释 格式 
  a (Assemble) 逐行汇编 a [address] 
  c (Compare) 比较两内存块 c range address 
  d (Dump) 内存16进制显示 d [address]或 d [range] 
  e (Enter) 修改内存字节 e address [list] 
  f (fin) 预置一段内存 f range list 
  g (Go) 执行程序 g [=address][address...] 
  h (Hexavithmetic) 制算术运算 h value value 
  i (Input) 从指定端口地址输入 i pataddress 
  l (Load) 读盘 l [address [driver seetor> 
  m (Move) 内存块传送 m range address 
  n (Name) 置文件名  n filespec [filespec...] 
  o (Output) 从指定端口地址输出 o portadress byte 
  q (Quit) 结束  q 
  r (Register) 显示和修改寄存器 r [register name] 
  s (Search) 查找字节串  s range list 
  t (Trace) 跟踪执行  t [=address] [value] 
  u (Unassemble) 反汇编 u [address ]或range 
  w (Write) 存盘  w [address[driver sector secnum> 
  ? 联机帮助 ? 
   

3 楼


   
   
   
  DEBUG主要命令 
   
  DEBUG是为汇编语言设计的一种高度工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。 
  一、DEBUG程序的调用 
  在DOS的提示符下,可键入命令: 
  C:\DEBUG [D:][PATH][FILENAME[.EXT>[PARM1][PARM2] 
  其中,文件名是被调试文件的名字。如用户键入文件,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中的D指定驱动器PATH为路径,PARM1和PARM2则为运行被调试文件时所需要的命令参数。 
  在DEBUG程序调入后,将出现提示符,此时就可用DEBUG命令来调试程序。 
  二、DEBUG的主要命令 
  1、显示存储单元的命令D(DUMP),格式为: 
  _D[address]或_D[range] 
  例如,按指定范围显示存储单元内容的方法为: 
  -d100 120 
  18E4:0100 c7 06 04 02 38 01 c7 06-06 02 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 ..;..h..M PQVW. 
  7 
  18E4:0120 8B 
  其中0100至0120是DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,·表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。 
  2、修改存储单元内容的命令有两种。 
  ·输入命令E(ENTER),有两种格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为: 
  -E address [list] 
  例如,-E DS:100 F3'XYZ'8D 
  其中F3,'X','Y','Z'和各占一个字节,该命令可以用这五个字节来替代存储单元DS:0100到0104的原先的内容。 
  第二种格式则是采用逐个单元相继修改的方法。命令格式为: 
  -E address 
  例如,-E DS:100 
  则可能显示为: 
  18E4:0100 89.- 
  如果需要把该单元的内容修改为78,则用户可以直接键入78,再按"空格"键可接着显示下一个单元的内容,如下: 
  18E4:0100 89.78 1B.- 
  这样,用户可以不断修改相继单元的内容,直到用ENTER键结束该命令为止。 
  ·填写命令F(FILL),其格式为: 
  -F range list 
  例如:-F 4BA:0100 5 F3'XYZ'8D 
  使04BA:0100~0104单元包含指定的五个字节的内容。如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定的范围,则重复使用list填入,直到填满指定的所有单元为止。 
  3)检查和修改寄存器内容的命令R(register),它有三种格式如下: 
  ·显示CPU内所有寄存器内容和标志位状态,其格式为: 
  -R 
  例如,-r 
  AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 
  DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC 
  18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000 
  ·显示和修改某个寄存器内容,其格式为: 
  -R register name 
  例如,键入 
  -R AX 
  系统将响应如下: 
  AX F1F4 
  : 
  即AX寄存器的当前内容为F1F4,如不修改则按ENTER键,否则,可键入欲修改的内容,如: 
   
  -R bx 
  BX 0369 
  :059F 
  则把BX寄存器的内容修改为059F。 
  ·显示和修改标志位状态,命令格式为: 
  -RF系统将响应,如: 
  OV DN EI NG ZR AC PE CY- 
  此时,如不修改其内容可按ENTER键,否则,可键入欲修改的内容,如: 
  OV DN EI NG ZR AC PE CY-PONZDINV 
  即可,可见键入的顺序可以是任意的。 
  4)运行命令G,其格式为: 
  -G[=address1][address2[address3…> 
  其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。 
  5)跟踪命令T(Trace),有两种格式: 
  ·逐条指令跟踪 
  -T [=address] 
  从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的CS:IP开始执行。 
  ·多条指令跟踪 
  -T [=address][value] 
  从指定地址起执行n条指令后停下来,n由value指定。 
  6)汇编命令A(Assemble),其格式为: 
  -A[address] 
  该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。 
  7)反汇编命令U(Unassemble)有两种格式。 
  ·从指定地址开始,反汇编32个字节,其格式为: 
  -U[address] 
  例如: 
  -u100 
  18E4:0100 C70604023801 MOV WORD PTR[0204],0138 
  18E4:0106 C70606020002 MOV WORD PTR[0206],0200 
  18E4:010C C70606020202 MOV WORD PTR[0208],0202 
  18E4:0112 BBO4O2 MOV BX,0204 
  18E4:0115 E80200 CALL 011A 
  18E4:0118 CD20 INT 20 
  18E4:011A 50 PUSH AX 
  18E4:011B 51 PUSH CX 
  18E4:011C 56 PUSH SI 
  18E4:011D 57 PUSH DI 
  18E4:011E 8B37 MOV SI,[BX] 
  如果地址被省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。 
  ·对指定范围内的存储单元进行反汇编,格式为: 
  -U[range] 
  例如: 
  -u100 10c 
  18E4:0100 C70604023801 MOV WORD PTR[0204],0138 
  18E4:0106 C70606020002 MOV WORD PTR[0206],0200 
  18E4:010C C70606020202 MOV WORD PTR[0208],0202 
  或 
  -u100 112 
  18E4:0100 C70604023801 MOV WORD PTR[0204],0138 
  18E4:0106 C70606020002 MOV WORD PTR[0206],0200 
  18E4:010C C70606020202 MOV WORD PTR[0208],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[address[drive sector sector] 
  ·装入指定文件,其格式为: 
  -L[address] 
  此命令装入已在CS:5CH中格式化了文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。 
  10)写命令W(Write),有两种功能。 
  ·把数据写入磁盘的指定扇区。其格式为: 
  -W address drive sector sector 
  ·把数据写入指定的文件中。其格式为: 
  -W[address] 
  此命令把指定的存储区中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS:0100开始。要写入文件的字节数应先放入BX和CX中。 
  11)退出DEBUG命令Q(Quit),其格式为: 
  -Q 
  它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。 
   
  问题:初学者问一个低级问题,执行debug-a后,如果有一行输入错误,如何更改这一行? 
   
  回答: 
  加入进行如下输入: 
  D:\PWIN95\Desktop>debug 
  -a 
  2129:0100movax,200 
  2129:0103movbx,200 
  2129:0106movcx,200 
  2129:0109 
  此时,发现movbx,200一句错误,应为movbx,20,可以敲回车返回"-"状态,然后输入: 
  -a103 
  2129:0103movbx,20 
  如果多或者少若干行,不必重新输入,可以用M命令移动后面的程序来去掉或者增加程序空间。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=148329

4 楼

还是谢谢大家了,这些我到百度也都能找到,我只是想看看你们的具体操作,加上解释!让我理解一下!

5 楼

debug
-a 100   
mov al,03
mov bl,09
sub al,bl
-n 1.com  ;命名
-r cx  ;字节数
6
-w ;存盘
-q  ;退出
debug 1.com  ;调试
r

6 楼


谢谢兄弟这么支持我,一直回答我的问题,我想我还是应该好好看下书,把有些东西记下来!

7 楼

路过,学习,谢谢了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册