中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [求助]哪位大哥能发个<<汇编语言教程>>
作者:
标题: [求助]哪位大哥能发个<<汇编语言教程>> 上一主题 | 下一主题
BAT
初级用户




积分 177
发帖 52
注册 2006-6-4
状态 离线
『楼 主』:  [求助]哪位大哥能发个<<汇编语言教程>>

小弟想学习DEBUG编程,哪个大哥能发个汇编语言教程上来,谢谢大家了

   此帖被 -8 点积分      点击查看详情   


2006-7-14 18:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
buddiyar
初级用户





积分 160
发帖 75
注册 2006-6-28
状态 离线
『第 2 楼』:  

9494
看willsort兄弟对debug似乎是情有独钟而且还很在行啊
我也想学来着啊
哪位好心的大哥哥就发一个吧
也好让我们这群拾破烂的有所得啊
呵呵

2006-7-14 23:42
查看资料  发送邮件  发短消息 网志  OICQ (243589543)  编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 3 楼』:  

没事儿,瞎发几个,偶对DEBUG一无所知...............惭愧,惭愧啊...........

Debug-PC之开山老祖
  Debug 原意是杀虫子。这里是机器调试工具。
  其实,Debug的由来,还有一则趣闻,在早期美国的一计算机房中,科学家正在紧张的工作。同时,许多台大型的计算机也在不停的运行着。大概是由于,机器过热,引来许的小虫子,以至于,计算机无法正常运行。科学们,只好停下来,捉虫子...虫子捉完了,计算机运行也正常了,后来,这个名词就沿用至今了....
虽然,现在好的软件越来越多了,但是有些,我们只需动手,用Debug就可解决,且快而好!接下来,我们就一起学习Debug在各方面的运用吧!(在杀毒、加解密、系统...)下面我和大家一起学习一些,Debug的用法,虽然,现在好的软件越来越多了,但是有些,我们只需动手,用Debug就可解决,且快而好!

Debug常用命令集
 
名称 解释 格式
a (Assemble) 逐行汇编 a [address]
c (Compare) 比较两内存块 c range address
d (Dump) 内存16进制显示 d [address]或 d [range]
e (Enter) 修改内存字节 e address

    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]]
    ? 联机帮助 ?

    debug小汇编a命令

    debug小汇编a命令是一个很有用的功能,许多的小程序都要他来做。

    编一些小程序比汇编要来得方便,快洁。
    在Debug中,中断是非常有用的,首先,让我们先了解一下中断。
      所谓中断,其实,就是,当你做某事时,有人过来找你有其他事,你先放下手中的事(计算机中,称为保护现场)







    ,再去与叫你的那个人办事去,等完了,你又回,接着做刚才的事。这是个很通俗的讲法。
      计算机在运行时,也会出现这种情况,我们叫之中断。
      下面是他的一些常用中断向量的入口值详解:(记住哦,很用的...呵呵)




    IBM PC 中断 int10
    ooH 屏幕方式设置

    入口:AH=0,AL=显示方式代码(0--6)
       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 色彩设置
    入口:AH=0B,BL=0 设背景色,BH=0--15  BL=1 设调色码,BH=0--1
    0CH 写图形点
    入口:AH=0C,CX:DX=列号:行号,AL=颜色
    ODH 读图形点
    入口:AH=0D,CX:DX=列号:行号
    返回:AL=颜色
    0EH 在当前页、当前光标处写字符
    入口:AH=0E,AL=字符的ASCII码,BL=前景色
    OFH 显示器状态
    入口:AH=0F
    返回:AL=当前显示器方式,AH=屏幕列数,BH=当前页号

    01H 光标设置
    入口:AH=1,CH=光标起始行号(00--0C),CL=光标结束行号(00--0C)
    注:CH > CL
    02H 光标定位
    入口:AH=2,BH=页号,DH:DL=起始行:列
    03H 读光标位置
    入口:AH=3,BH=页号。
    返回:DH:DL=起始行:列
    06H 窗口上卷
    入品:AH=6,AL=窗口上卷行数,CH:CL-DH:DL 窗口坐标
    注:AL=0 卷动整个窗口
    07H 窗口下卷
    入口:AH=7,AL=窗口下卷行数,CH:CL-DH:DL 窗口坐标
    08H 读当前光标处字符和属性
    入口:AH=8,BH=页号。
    返回:AH:AL=字符的颜色:字符的ASCII码
    注:颜色代码见下对照表
    09H:在当前光标处写字符和属性
    注:光标不下移
    入口:AH=9,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 保留 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 ROM-BASIC入口


    指令名详解
    call 指令(过程调用)(控制指令-长转移)

    详解:

    段内直接调用

    段内间接调用(寄存器)

    段内间接调用(存储器)

    段间直接调用

    段间间接调用

    指令名
    jmp 指令(无条件转移指令)(控制指令-长转移)

    详解:
    段内直接跳转

    短段内直接跳转

    段内间接跳转(寄存器)

    段内间接跳转(存储器)

    段间直接跳转

    段间间接跳转

    指令名
    ret 指令(过程返回)(控制指令-长转移)

    详解:

    段内返回

    段内返回立即数加于sp

    段间返回

    段间返回立即数加于sp

    na/jnbe 指令(控制指令-短转移)   不小于或不等于时转移

    jae/jnb 指令 (控制指令-短转移)   大于或等于时转移

    jb/jnae 指令 (控制指令-短转移)   小于转移

    jbe/jna 指令 (控制指令-短转移)   小于或等 于转移

    jg/jnle 指令(控制指令-短转移)   大于转移

    jge/jnl 指令 (控制指令-短转移)   大于或等于转移

    jl/jnge 指令 (控制指令-短转移)   小于转移

    jle/jng 指令 (控制指令-短转移)   小于或等 于转移

    je/jz 指令 (控制指令-短转移)   等于转移

    jne/jnz 指令 (控制指令-短转移)   不等于转移

    jc 指令 (控制指令-短转移)   有进位时转移

    jnc 指令 (控制指令-短转移)   列进位时转移  
    jno 指令 (控制指令-短转移)   不溢出时转移
    jnp/jpo 指令 (控制指令-短转移)   奇偶性为奇数时转移

    jns 指令 (控制指令-短转移)   符号位为"0"转移

    jo 指令 (控制指令-短转移)   溢出转移

    jp/jpe 指令 (控制指令-短转移)   奇偶性为偶数时转移

    js 指令 (控制指令-短转移)   符号位为"1"时转移

    loop 指令 (循环控制指令-短转移)   cx 不为0时循环

    loope/loopz 指令 (循环控制指令-短转移)   cx 不为0且标志 z=1 时循环
     
    loopne/loopnz 指令 (循环控制指令-短转移)   cx 不为0且标志 z=0 时循环

    jcxz 指令 (循环控制指令-短转移)   cx 为0时转移

    ★int 指令 (中断指令)   中断指令(后详解)

    into 指令 (中断指令)   溢出中断

    iret 指令 (中断指令)   中断返回


    指令名
    shl 指令(逻辑左移)
    sal 指令(算术左移)
    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'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命令移动后面的程序来去掉或者增加程序空间。

      Debug命令详解

      发信人: liuxf (飞天御剑流), 信区: DOS
      标  题: Debug命令详解
      发信站: BBS 水木清华站 (Mon Apr 23 16:16:59 2001)

      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                    0
           DI           0                    0
           BP           0                    0
           SP     0FFFFH或可利用的     不定
                  内存空间上限减2
           IP     100H                 目标程序的的代码
                                       入口偏移量
           CS           PSP            目标程序代码段址
           DS           PSP                  PSP
           CS           PSP                  PSP
           SS           PSP            目标程序堆栈段底

      命令:
      A:  编写汇编代码(Assemble)
          格式:A[地址]
          用途:程序允许在指定位置(若无缺省为IP指针位置)进行汇编
                程序书写。
          细节:
              *所有数值皆为十六进制整数,数值后不带“H”
              *不支持文件管理用的目录表、宏标记、条件汇编
              *跳转指令后要直接书写十六进制地址不支持标号
              *数据类型若非默认类型,要以PTR加以指定
              *字符串操作要指定类型为B或W(如lodsb和lodsw等)及长度
              *用DB和DW接受数据定义,直按进行汇编
              *对内存地址加[]以与立即数区分

      C: 内存内容比较(Compare)
         格式:C 地址范围  地址
               地址范围:做比较的第一个内存域始未地址或始地址和长度
               地址:    做比较的第二个内存域的始地址
         用途:*对内存中两个域的内容加以比较,以字节为单位。对发现有
               差别的内容及其地址用如下形式显示出:
                   地址1  始位置  未位置  地址2
               *若地址范围或地址不含段地址,默认为DS的值。

      D: 显示内存内容(Dump)
         格式:D[地址范围]
               地址范围:给定显示区的始未范围或始地址和长度。
         用途:*内存内容显示指令,以十六进制和ASCII码形式显示指定范
               围内的内存内容。
               *若不指定范围,第一次按目标程序的CS:IP的位址开始显示。
               以后使用上次显示的未地址的下一地址为开始进行显示。
               *若不指定长度,则显示128byte的内容。计8行。

      E: 数据的输入
         格式:E 地址 数值列表
               地址:    数据输入的内存始地址
               数值列表:从始地址输入的连续数据
         用途:*向内存区域输入数据。数据以十六进制形式,或以ASCII码形式
               均可。覆盖掉原有数据。
               *十六进制时要用空格、逗号或制表符加以分隔。字符串则要用单
               引号或双引号括起且区分大小写。
               *若不指写段址,则默认为DS中值。每写完一数据地址自动增加。
               *如省略数值列表,对应每一字节请求输入。点号前为该字节原
               始值,点号后请求输入。这时若按空格,跳过这一字节;按回车,
               结束输入;按减号或连字符,显示前一字节内容。
           *出错时内存内容有可能已被改变。提示后终止。
               *字符串只能以数值列表的形式输入,不能按地址提式输入。

      F: 内存填充(Fill)
         格式:F 地址范围 数值列表
          地址范围:数据输入的内存始本地址或首地址和长度
               数值列表:从始地址输入的连续数据
        用途:*将列表中数据写入内存。输入数据以十六进制或ASCII码形式。
           覆盖原有信息;若出错,显示出错信息,原有信息保留。
           *若未指写段址,默认为DS寄存器值。
           *列表中可有十六进制或字符串两种形式,各内容用空格、逗号、
           制表符隔开。字符串必须以单引号或双引号括起,区分大小写。
           *若要填充区域大于数据数目,列表可重复使用;相反,若列表
           比要填充区域大时,则自动截断后面的数据。

      G: 程序执行(Go)
         格式:G[=地址][断点0][……断点]
               地址:          Debug开始执行的地址。
               断点0……断点9:指定的0—10个临时中断点。
         用途:*将CPU控制权由Debug转移给被调试中的程序。不设断点时,则程
               序的执行或是中途失败或是正常结束。结束时,提示有“Program
               termminated nomally”,即程序结束正常,控制权再返回到
               Debug。
               *此时因数据有可能重写,若需再次执行,因重新装入。
               *地址中,如未指定段址,则使用目标程序的CS寄存器中的值。当
               地址省略时,则Debug使用目标程序的CS:IP寄存器的值开始执行。
               且为与断点区分,地址参数前必须加等号,否则将其认为是第零
               个断点。
               *断点参数可指定10个临时断点。当程序执行到指定的断点地址时
               则发生中止。与断点表内的次序无关,断点可按任意次序输入。
               *中止时,将会显示寄存器的内容、标志位状态及CS:IP指出的指
               令(也就是下一条将要执行的指令),然后是提示符“-”。
               *若没有装入可执行程序或程序内容未知,有可能进入死状态。
               *若目标程序的栈不起作用或太小,则可能引起系统“破碎”。

      H: 执行十六进制算术运算(Hexadecimal)
         格式:H 值1  值2
               值1、2为0—FFFFH范围内的任意十六进制数。
         用途:*用来求两个十六进制数的和、差,对结果显示为值1+值2及值1-
               值2。如果值2 > 值1则显示其补码。
               *虽然很少用,但事实还是很有用的,熟练掌握。

      I: 端口的输入(Input)
         格式:I 端口地址
               端口地址:0—FFFF范围内的I/O端口地址。
         用途:用来读取指定I/O端口地址,并以2位十六进制数加以显示。
         警告:I指令将直接访问计算机硬件,不是所以错误检查都能进行,所以
               使用是必须小心。对某个外设控制器分配端口的输入操作,可能
               干涉系统固有的操作。对没有分配指定I/O端口的设备,或该端口
               为写入专用端口等情况,I命令都不能保证可显示。

      L: 装入命令(Load)
         格式:L 地址
               或
               L 地址 驱动器 开始扇区 扇区数
               地址:    存放从盘中读出数据的内存地址。
               驱动器:  A=0, B=1, C=2, 以此类推。
               开始扇区:以十六进制数表示要最先装入的逻辑扇区号。
               扇区数:  以十六进制数表示要装入连续扇区个数。
         用途:*若输入了一个不完全的L命令时,则对下述磁盘文件进行装入:
                  1在Debug命令行中指定过的文件;
                  2由命令末尾参数N指定的文件。
               *在地址中若未指定段址,则使用CS中的值。若为可执行文件按重
               定位原则装入为可执行状态。
               *装入后文件长度,或.exe文件程序的实际长度放入目标程序的BX
               和CX两个寄存器中。高十六位放在BX中。
               *若在命令行中给出所有参数,则不必用MS-DOS的文件系统访问磁
               盘。

      M: 数据传送(Move)
         格式:M 地址范围 地址
               地址范围:被复制域的始末地址,或始地址和长度。
               地址:    数据复制目的域的起始地址。
         用途:*对内存中数据进行复制。目的域被覆盖。
               *若地址范围中无段址,则使用DS内容;若地址中无段址,使用地
               址范围中的值。


      N: 文件名或命令末尾的参数(Name)
         格式:N 参数 [参数……]
               参数:插入到仿真的PSP中去一个以上的文件名或者是开关项。
         用途:*对磁盘读写操作L、W指定目标文件。


      O: 端口的输出(Output)
         格式:O 端口  字节
               端口:I/O端口地址。
               字节:写入I/O端口的0—FFFF范围的值。
         用途:向I/O端口地址写入一字节。
         警告:错误的操作将导致系统崩溃。

      P: 循环或子程序处理(Procedure)
         格式:P[=地址] [命令数]
               地址:  执行的起始地址。
               指令数:执行的指令条数。
         用途:*循环或子程序处理。将循环、串指令、软件中断或子程序调用
               视为单语句。执行中了,显示目标程序寄存器内容、标志位状态
               和下一条要执行的指令。
               *若地址参数中无段址,则使用CS中的值。完全忽略地址时,则从
               程序中的CS:IP指定位置开始执行。

      Q: 结束Debug操作(Quit)
         格式:Q
         用途:程序结束返回。对未保存的结果丢失。

      R: 寄存器显示与更改(Register)
         格式:R [寄存器]
               寄存器:AX BX CX DX SP BP SI DI
                       DS ES CS IP PC
                       F
         用途:*若R不带参数,则显示所有寄存器的内容和状态标志、下一指令。
               *若指定新值,在显示内容后,给出冒句提示输入新值。回车结束。
               *对状态字F,在连字符“-”后以空格间隔输入新值,次序不计。
               *若直接回车,则跳过修改,寄存器内容不变。

      S: 内存检索(Search)
         格式:S 地址范围  列表
               地址范围:想来你该明白是什么样了吧:)
               列表:    欲检索的一个以上的字节值或字符串。
         用途:*在指定的内存范围内检索列表的值。对每一个匹配的地址进行
               显示。
               *若起地址中无段址,默认为DS的值。
               *检索范围不得大于FFFFH
               *列表必须以分隔符(空格,逗号,制表符等)分隔;字符串要加
               单引号或双引号括起,区分大小写。

      T: 程序执行跟踪(Trace)
         格式:T[=地址][指令数]
               地址:  执行的第一条指令的地址。
               指定数:执行的机器指令的条数。
         用途:*执行单条指令,显示寄存器及下一条指令。
               *在地址参数中若无段址,则默认为CS寄存器的值。
               *若全部省略,则由CS:IP寄存器指出的地址开始执行。
               *以后则顺序执行。
               *对ROM内的跟踪应使用T命令。
         警告:对Intel 8259 中断屏幕的内容(IBM PC及兼容机端口20H和21H)
               的更改,或者系统功能调用(INT 21H),不能使用T指令,对上述
               情况要使用P指令。

      U: 反汇编(Unassemble)
         格式:U [地址范围]
         用途:*将机器指定解码为汇编语言的助记符。
               *地址范围中无段址时,默认使用CS值。
               *当始地址与实际边界不一致时,结果将不可信。
               *若不含末地址或长度,则自给定始地址起反汇编32个字节。
               *以后由前次U最后一指令的下一指令做32字节的反汇编。
               *若从没用过U,则于CS:IP开始进行反汇编。
               *只能对8086指令解码,对其它以DB来显示。

      W: 写入文件或扇区(Write)
         格式:W [地址]
             或
               W 地址 驱动器 开始扇区 扇区数
               地址:  待写入盘的数据在内存中的起始位置。
               驱动器:写入数据的盘的驱动器号(A=0,B=1,C=2,以下类推)。
               始扇区:写入数据的最前的逻辑扇区号(0—FFFFH)。
               扇区数:写入数据的连续扇区个数(0—FFFFH)。
         用途:*将内存中的文件或一个个扇区传送到磁盘上。
               *W若不带参数,或只有地址参数,则按BX:CX寄存器指出的字节,从内
               存向磁盘写入数据。此时的文件名是此命令前最后一个使用过的文件名
               ,或者是N命令中指定的文件,如果没有使用过N命令,则使用Debug命
              令行中指定的文件。
               *Debug的W命令,不能向扩展名为.EXE或.HEX的文件中写入数据。
               *这可用改扩展名的方法得到应用,让其能对.exe文件写入。
               *若无地址项,则认为是目标程序的CS:0100H。
               *该命令可不通过MS-DOS的文件系统直接访问磁盘的逻辑扇区。但必须
               以十六进制形式给在命令行中给定各参数。
               *W命令不能对用于网络上的驱动器进行逻辑扇区写入处理。
         警告:若参数有误,则可能破坏盘文件结构。
               请务必先搞清再作试践,特别是对硬盘的操作。








      Debug操作硬盘实例

      To All:

          原文来自http://netroom.hbu.edu.cn/personal/hellopc/yjdebug.htm

      首页§硬件时空§汇编语言


      1. 非物理0磁道坏软盘的修复

      此种损坏从软盘盘面上来看并没有明显的划伤和霉变。一般可以恢复其数据,也可是软盘重新在利用。
      处理方法如下:
      Ⅰ. 进入debug
      Ⅱ. 取一张引导区没有损坏的好磁盘,插入软驱
      -L 100 0 0 1
      Ⅲ. 插入损坏的磁盘到软驱
      -W 100 0 0 1
      -Q
      注意:好盘与坏盘容量必须相同


      2. 物理0磁道坏软盘中的数据读取

        对于0磁道损坏的磁盘,一般来说是应该抛弃了,当你也不妨试一试已下方法:
      磁化处理:用较强的磁铁在靠近坏磁盘的表面处反复移动,切不可碰到磁盘介质,以免划伤表面,然后在试试格式化。
      软盘换面:小心的将磁盘打开,坚磁片与金属芯片分开,方面后再按原来的方法粘在一起即可,在重新格式化。
      Diskfix:对于diskfix想必大家都用的比较多了,里面的磁盘修复功能很好用的。能修复大多数磁盘表面错误。


      3. 硬盘启动失败处理

        在正常机上格式化一张软盘,无其它数据
      进入debug
      -L 0 2 0 1
      -W 0 0 0 1
      -Q
      用系统盘启动故障机后
      在进入debug
      -L 0 0 0 1
      -w 0 2 0 1
      -Q


      4. 软盘不能正确读取解决方法

        如果使用软盘时出现如下提示
      General failure error reading drive A
      可以用以下方法解决:
      将一张好盘插入软驱
      进入debug
      -A 100
      ****:*100 MOV AL,0
      ****:**** MOV CX,1
      ****:**** MOV DX,0
      ****:**** MOV BX,1000
      ****:**** INT 25
      ****:**** INT 20
      回车
      -G=0100

      插入坏盘并进入Debug
      -A 200
      ****:*100 MOV AL,1
      ****:**** MOV CX,1
      ****:**** MOV DX,0
      ****:**** MOV BX,1000
      ****:**** INT 26
      ****:**** INT 20
      回车
      -G=200


      5. CMOS 数据的保存,恢复

      CMOSRAM的'地址口'的口地址为 70H '数据口'的口地址为 71H 读取时只需将读的CMOSRAM的地址送到70H,随后就可以从71 H中得到所需数据。

      (1)读取CMOS数据 进入Debug
      -A 100
      ****:*100 MOV BX,1000
      ****:**** MOV CX,0040
      ****:**** MOV AX,0000
      ****:0109 MOV DX,CX
      ****:**** MOV CX,0005
      ****:010E LOOP 010E
      ****:**** OUT 70,AL
      ****:**** MOV CX,0005
      ****:0115 LOOP 0115
      ****:**** IN AL,71
      ****:**** MOV [BX],AL
      ****:**** CMP AH,0E
      ****:**** JB 0123
      ****:**** ADD AH,80
      ****:0123 INC AH
      ****:**** INC BX
      ****:**** MOV CX,DX
      ****:**** MOV AL,AH
      ****:**** LOOP 0109
      ****:**** MOV AH,3C
      ****:**** MOV DX,0150
      ****:**** MOV CX,0020
      ****:**** INT 21
      ****:**** MOV BX,AX
      ****:**** MOV DX,1000
      ****:**** MOV CX,0040
      ****:**** MOV AH,40
      ****:**** INT 21
      ****:**** MOV AH,4C
      ****:**** INT 21
      -A 150
      ****:0150 DB "CMOS.DAT",0
      ****:0159
      -R CX
      CX 0000
      :60
      -N SAVE CMOS.COM
      -W
      -Q
      -W 100 2 0 1
      -Q

      (2)恢复CMOS数据 进入Debug
      -A 100
      ****:*100 MOV CX,0150
      ****:**** MOV AH,3D
      ****:**** MOV AL,00
      ****:**** INT 21
      ****:**** MOV DX,1000
      ****:**** MOV BX,AX
      ****:**** MOV CX,0040
      ****:**** MOV AH,3F
      ****:**** INT 21
      ****:**** MOV AX,0000
      ****:**** MOV BX,DX
      ****:**** MOV DX,CX
      ****:**** MOV CX,0005
      ****:**** LOOP 011F
      ****:**** MOV AL,AH
      ****:**** OUT 70,AL
      ****:**** MOV CX,0005
      ****:**** LOOP 0128
      ****:**** MOV AL,[BX]
      ****:**** OUT 71,AL
      ****:**** JB 0136
      ****:**** ADD AH,80
      ****:**** INC AH
      ****:**** INC BX
      ****:**** MOV CX,DX
      ****:**** LOOP 011A
      ****:**** MOV AX,0040
      ****:**** MOV DS,AX
      ****:**** MOV AX,1234
      ****:**** MOV [0072],AX
      ****:**** JMP FFFF:0000
      -A 150
      ****:0150 DB "CMOS.DAT",0
      ****:0159
      -R CX
      CX 0000
      :60
      -N WRITE CMOS.COM
      -W
      -Q


      6. DOS 引导扇区数据的保存与恢复 

      DOS引导程序是被读到内存0000:7C00初开始执行的
      获得正常的引导程序
      进入Debug
      -L 100 2 0 1
      -N AOSBOOT.COM
      -R CX
      :200
      -W
      -Q

      装入引导程序
      进入Debug
      -N AOSBOOT.COM
      -L
      -R CX
      :200
      -W 100 2 0 1
      -Q


      7. 硬盘主引导扇区数据的保存与恢复

      硬盘工作正常时读取主引导扇区信息
      注意:当分区改变时不能用此数据恢复
      保存主引导扇区数据进入Debug
      -A 100
      MOV AX,0201
      MOV BX,0110
      MOV CX,0001
      MOV DX,0080
      INT 13
      INT 3
      -G=100
      -E 102 3
      -E 10E C3
      -R BX
      BX 0110
      :0
      -R CX
      CX 0001
      :210
      -N A:RBOOT.COM
      -W
      -Q

      恢复主引导扇区数据:只需运行A盘的RBOOT.COM


      8. 硬盘非分配表备份与恢复

      计算机运行正常时分配表备份
      进入Debug
      -L 100 2 0 1
      -N ABRUP.DAT
      -R CX
      :200
      -W

      恢复
      进入Debug
      -N ABRUP.DAT
      -L
      -W 100 2 0 1
      -Q


      9. 硬盘保护卡内幕

      对于经常在外边上机的人来说,计算机维护人员一旦设置硬盘保护卡,自己作一些事来特别麻烦,想不想屏蔽掉硬盘保护卡,用以下方法或许可以借鉴:
      进入Debug
      -A 100
      MOV AH,0
      MOV DL,0
      INT 13
      -T
      一直按T知道找到 CS=F000 记下此时 DS 的值 如:1234
      -E E0:4C
      34 12 00 F0
      -Q


      10. 用Debuf作硬盘低级格式化

      硬盘低级格式化一般用DM,但Debug也可以低级格式化硬盘
      进入Debug
      -A 100
      MOV AX,500
      MOV BX,180
      MOV CX,0
      MOV DX,80
      INT 13
      INT 3
      -E 180 0 0 0 2
      -Q


      11. 冷启动与热启动

      用Debug实现系统冷启动与热启动程序

      冷启动:
      -A 100
      JMP FFFF:0
      INT 20
      -N A:RESET.COM
      -R CX
      :0007
      -w
      -Q

      热启动:
      -A 100
      MOV AX,0040
      MOV DS,AX
      MOV AX,1234
      MOV SI,0072
      MOV (SI),AX
      JMP FFFF:0
      -N A:RSET.COM
      -R CX
      :0014
      -W
      -Q


      12. DOS内部命令加密

      如加密 dir
      用pctools或diskedit找 C:下的COMMAND.COM文件
      编辑该文件
      PCTOOLS中:F-----F1 然后找所有03 44 49 52 找到后按F5修改成你所要的值 如: foo 以后只有输入foo 才能列出文件或文件目录。
      diskfix 有良好的界面,操作起来和pctools差不多。
      注意:如果不能修改,则解开文件的锁定 luck
      其它命令代码
      type 04 54 59 50 45
      cd 02 43 44
      del 03 44 45 44
      copy 04 43 49 50 59



      All Rights Reserved. Web Supported By TattooRose.
      OICQ:49391848 Mobile Phone:13045059500
      Copyright&copy;1999-2002. Hello? Computer Technology Co.,Ltd.

      10.  用Debuf作硬盘低级格式化

         硬盘低级格式化一般用DM,但Debug也可以低级格式化硬盘
         进入Debug
           -A 100
           MOV AX,500
           MOV BX,180
           MOV CX,0
           MOV DX,80
           INT 13
           INT 3
           -E 180 0 0 0 2
           -Q


      11.  冷启动与热启动

         用Debug实现系统冷启动与热启动程序

         冷启动:
               -A 100
              JMP FFFF:0
              INT 20
              -N A:RESET.COM
              -R CX
              :0007
              -w
              -Q

         热启动:
             -A 100
               MOV AX,0040
               MOV DS,AX
               MOV AX,1234
               MOV SI,0072
               MOV (SI),AX
               JMP FFFF:0
               -N A:RSET.COM
               -R CX
               :0014
               -W
               -Q


      12. DOS内部命令加密

           如加密 dir
           用pctools或diskedit找 C:下的COMMAND.COM文件
           编辑该文件
           PCTOOLS中:F-----F1    然后找所有03 44 49 52 找到后按F5修改成你所要的值   如: foo 以后只有输入foo 才能列出文件或文件目录。
         diskfix 有良好的界面,操作起来和pctools差不多。
           注意:如果不能修改,则解开文件的锁定 luck
           其它命令代码
           type   04 54 59 50 45
           cd    02 43 44
           del   03 44 45 44
           copy 04 43 49 50 59

2006-7-15 11:28
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
BAT
初级用户




积分 177
发帖 52
注册 2006-6-4
状态 离线
『第 4 楼』:  

非常谢谢 bagpipe 的帖子,
真的很不错,很多很多的内容尚在学习中,
是现代版超浓缩的汇编教程,
小弟可不可以贪心的再发个问号:
是否有哪个大哥有汇编语言的完整的教程,
小弟我一心想学习完整的汇编。
或者是否能提供连接下载,THANKS。。。。。。

2006-7-17 01:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
win8u8
新手上路





积分 2
发帖 1
注册 2006-4-12
状态 离线
『第 5 楼』:  

http://cndos.l009.com/filedown/files/汇编语言教程.rar

2006-7-19 15:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 6 楼』:  

我的U盘也有两个汇编教程
http://bagpipe.ys168.com
http://cn-dos.ys168.com
欢迎来访....................

2006-7-19 16:08
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 7 楼』:  


───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:移动主题:自 DOS批處理 & 腳本技術(批處理室)
说明:依照主题内容分类,更适合于发表在此版区
处罚:扣除因发表该主题而奖励的6点积分,版区违规惩罚性扣除2点积分
───────────────── 版务记录 ─────────────────




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-7-20 01:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
profree
中级用户




积分 478
发帖 132
注册 2003-7-2
状态 离线
『第 8 楼』:  

一直很想学汇编,但总是学不会

2006-7-20 23:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
echoair
新手上路





积分 8
发帖 33
注册 2009-11-10
状态 离线
『第 9 楼』:  

我以前也找了很久,最后还是买了本王爽老师的汇编语言…

2010-6-2 11:44
查看资料  发送邮件  发短消息 网志  OICQ (39820396)  编辑帖子  回复  引用回复
echoair
新手上路





积分 8
发帖 33
注册 2009-11-10
状态 离线
『第 10 楼』:  

推荐你个网站http://www.asmedu.net/index.jsp

2010-6-2 11:46
查看资料  发送邮件  发短消息 网志  OICQ (39820396)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: