无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 7129|回复: 7
打印 上一主题 下一主题

DEBUG命令详解

[复制链接]
跳转到指定楼层
1#
发表于 2005-4-1 10:54:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DEBUG命令详解
shr 指令(逻辑右移)
  sar 指令(算术右移) 寄存器,1
  rol 指令(循环左移) 寄存器,cl
  ror 指令(循环右移) 存储器,1
  rcl 指令(通过进位的循环左移)存储器,cl
  rcr 指令(通过进位的循环右移)(逻辑运算)
  
  
  not 指令(取反运算)寄存器求反
  
  (逻辑运算)存储器求反
  
  and 指令(与运算) (逻辑运算)
   
  寄存器 and 寄存器 寄存器
  寄存器 and 存储器 寄存器
  
  存储器 and 寄存器 存储器
  
  立即数 and 存储器 存储器
  
  立即数 and 累加器 累加器
  
  or 指令(或运算)(逻辑运算)
  
  寄存器 or 寄存器 寄存器
  寄存器 or 存储器 寄存器
  
  存储器 or 寄存器 存储器
  
  立即数 or 存储器 存储器
  
  立即数 or 累加器 累加器
  
  test 指令(测试) (逻辑运算)
   
  寄存器 test 寄存器 
  寄存器 test 存储器
  寄存器 test 立即数
  存储器 test 立即数
  累加器 test 立即数
       
  movs 指令(串传送)(字符串操作指令)
  单个传送
  重复传送
       
  cmps 指令(串比较) (字符串操作指令)
  单个比较
  重复比较
       
  scas 指令(串扫描)(字符串操作指令)
  单个搜索
  重复搜索
       
  lods 指令(装入串)
  (字符串操作指令)
  单个装载
  重复装载
       
  stos 指令(保存串) (字符串操作指令)
  单个存储
  重复存储
  
  mov 指令(传送字或字节)(数据传送命令) 
  寄存器与寄存器间传送
  存储器与寄存器间传送
  立即数传送给存储器
  立即数传送给寄存器
  存储器传送给累加器
  累加器传送存储器
  寄存器传送给段寄存器
  存储器传送给段寄存器
  段寄存器传送给寄存器
  段寄存器传送给存储存器
       
  pop 指令(把字弹出堆栈) (数据传送命令)
  
  push 指令(把字压入堆栈)  
  存储器
  寄存器
  段寄器     
  xchg 指令(交换字或字节) (数据传送命令)  
  寄存器与寄存器交换
  存储器与寄存器交换
  寄存器与累加器交换
     
  in 指令(端口输入) (数据传送命令)
  直接输入
  间接输入
       
  out 指令(端口输出) (数据传送指令)  
  直接输出
  间接输出
       
  add 指令(加法)(算术指令)
  adc 指令(带进位加法)  
  寄存器+寄存器 寄存器
  寄存器+存储器 寄存器
  存储器+寄存器 存储器
  立即数+存储器 存储器
  立即数+累加器 累加器
       
  inc 指令(加1)(算术指令)  
  存储器增量
  寄存器增量
       
  sub 指令(减法) (算术指令)
  sbb 指令(带借位减法)  
  寄存器-寄存器 寄存器
  寄存器-存储器 寄存器
  存储器-寄存器 存储器
  立即数-存储器 存储器
  立即数-累加器 累加器
       
  dec 指令(减1)(算术指令)  
  存储器减量
  寄存器减量
       
  nec 指令(求反,以0减之)  
  寄存器求补
  存储器求补
       
  cmp 指令(比较)(算术指令)  
  寄存器与寄存器比较
  寄存器与存储器比较
  寄存器与立即数比较
  存储器与立即数比较
  累加器与立即数比较
       
  mul 指令(无符号乘法) (算术指令)
  imul 指令(整数乘法)  
  与8位寄存器相乘
  与16位寄存器相乘
  与8位存储单元相乘
  与16位存储单元相乘
       
  div 指令(无符号除法)(算术指令)
  idiv 指令(整数除法)  
  被8位寄存器除
  被16位寄存器除
  被8位存储单元除
  被16位存储单元除
  
  
  Debug实战
  1.查看主板的生产日期,版本
  D ffff:05
  D fe00:0e
  
  2.模拟Rest键功能
  A
  :100 jmp ffff:0000
  :105
  g
  
  3.快速格式化软盘
  L 100 0 0 * ';插入一张己格式化软盘
  W 100 0 0 * ';放入一张欲格式化软盘
  注:* 分别为:720K e |1.2M id |1.44M 21 
  
  4.硬盘格式化两种方法
  (1)G=c800:05
  (2) A 100
  mov ax,0703
  mov cx,0001
  mov dx,0080
  int 13
  int 3
  g 100
  5.加速键盘
  A 
  mov ax,0305
  mov bx,0000
  int 16
  int 20
  rcx
  10
  n fast.com
  w
  q
  
  6.关闭显示器(恢复时,按任意键)
  
  A
  mov ax,1201
  mov bl,36
  int 10
  mov ah,0
  int 16
  mov ax,1200
  int 10
  rcx
  10
  n crt-of.com
  w
  q
  7.硬盘DOS引导记录的修复
  在软驱中放入一张己格式化软盘
  debug
  -l 100 2 0 1
  -w 100 0 50 1
  把软盘放入故障机软驱中
  debug
  -l 100 0 50 1
  -w 100 2 0 1
  -q
  8.清coms中setup口令
  debug
  -a
  mov bx,0038
  mov cx,0000
  mov ax,bx
  out 70,al
  inc cx
  cmp cx,0006
  jnz 0106
  int 20
  -rcx
  :20
  -nclearpassword.com
  -w
  -q
  注:以上适合super与dtk机,对于ast机,因为他的口令放在coms的4ch-51h地址处,只要将:mov bx,0038 改为: mov
  bx,004c即可
  9.取消coms的密码(将coms数据清为初始化)
  -o 70,10
  -o 71,10
  -g
  -q
  10.将硬盘主引导记录保存到文件中
  
  debug
  -a
  mov ax,0201
  mov bx,0200
  mov cx,0001
  mov dx,0080
  mov int 13
  int 3
  -rcx
  :200
  -nboot.dat
  -w
  -q 
  11.调用中断实现重启计算机(可以成文件)
  debug
  -a
  int 19
  int 20
  -rcx
  :2
  -nreset.com
  -w
  -q
  
  
  
  
  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

      例如,-E DS:100 F3';XYZ';
      其中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';
      使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命令移动后面的程序来去掉或者增加程序空间。

2#
 楼主| 发表于 2005-4-1 10:54:58 | 只看该作者

DEBUG命令详解


DEBUG命令详解   
         
  Debug:A(汇编)
直接将 8086/8087/8088 记忆码合并到内存。
该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆搿?
a [address]
参数
address
指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。
有关将数据输入到指定字节中的信息,请参看Debug E(键入)。
有关反汇编字节的信息,请参看Debug U(反汇编)

说明
使用记忆码
段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。

汇编跳转和调用
汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示:
-a0100:0500
0100:0500 jmp 502 ; a 2-byte short jump
0100:0502 jmp near 505 ; a 3-byte near jump
0100:0505 jmp far 50a ; a 5-byte far jump
可以将 near 前缀缩写为 ne。

区分字和字节内存位置
当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式:
dec wo [si]
neg byte ptr [128]

指定操作数
Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式:
mov ax,21 ; load AX with 21h
mov ax,[21] ; load AX with the
; contents of
; memory location 21h
(未完待续)

回复

使用道具 举报

3#
发表于 2005-4-21 21:39:01 | 只看该作者

DEBUG命令详解

顶啦!
要想成为DOS高手,这是一定要学的。
回复

使用道具 举报

4#
发表于 2005-4-23 21:59:25 | 只看该作者

DEBUG命令详解

学习学习
回复

使用道具 举报

5#
发表于 2005-5-22 10:38:48 | 只看该作者

DEBUG命令详解

严重支持,我找这个资料找了N年了,要不我早就是DOS高手了,
回复

使用道具 举报

6#
发表于 2005-5-30 00:35:04 | 只看该作者

DEBUG命令详解

不是说“(未完待续)”吗?怎么不见续?
回复

使用道具 举报

7#
发表于 2005-6-4 13:49:14 | 只看该作者

DEBUG命令详解

真是值得收藏的东东呀。
回复

使用道具 举报

8#
发表于 2024-3-22 13:43:29 | 只看该作者
留名,期待更好的作品
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-22 04:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表