分类:
2008-01-07 17:06:41
一,在debug环境下建立和汇编程序 (1)进入debug C:\debug 回车 (2)输入程序并汇编 -A 100 回车 0AF0:0100 mov dl,38 回车 0AF0:0102 mov ah,2 回车 0AF0:0104 int 21h 回车 0AF0:0106 int 20h 回车 0AF0:0108 回车 (3)运行程序 -g=100 8 Program terminated normally 如果想分析该程序的指令,可使用反汇编命令U (4)反汇编 -u 100,108 回车 0AF0:0100 B238 MOV DL,3 0AF0:0102 B402 MOV AH,0 0AF0:0104 CD21 INT 21 0AF0:0106 CD20 INT 20 0AF0:0108 56 PUSH SI (5)将机器指令程序送到起始地址为200h的单元 -e 200 b2,38,b4,02,cd,21,cd,20,56 -g=200 8 Program terminated normally - 二,常用debug命令介绍 (1)显示,修改寄存器内容 显示所有寄存器内容 格式:-r 回车 功能:以十六进制形式显示cpu内部个寄存器的值;以符号形式显示标志寄存器的各标志位(除tf外)的值;并将CS:IP所指的内存内容反汇编成一条指令,可视为将要执行的指令。 如: -r 回车 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0AF0 ES=0AF0 SS=0AF0 CS=0AF0 IP=0200 NV UP EI PL NZ NA PO NC 0AF0:0200 B238 MOV DL,38 知:cs=0AF0h,IP=0100h 修改寄存器 格式:-r 寄存器名 回车 -r ds DS 0AF :0AE0 -r ds的内容由原来的0af0h修改为0ae0h 修改标志值 格式:-rf 例:-rf NV UP EI PL NZ NA PO NC -ov ng 回车 将of,sf的值分别修改为1。 (2)汇编,反汇编指令 汇编命令 A 格式:-A 内存地址 回车 例:调用dos中02h号功能显示字符‘a’,将该程序汇编到1270:100h开始的内存中。 -A1270:100 1270:0100 mov,ah,2 1270:0102 mov,dl,61 1270:0104 int 21 1270:0106 int 20 1270:0108 - 反汇编命令 U 格式:-u 内存块 回车 功能:分三列显示反汇编的结果,第一列为指令首地址,第二列为16进制形式的指令机器码,第三列为指令的助记符。 -u 1270:100 1270:0100 B402 MOV AH,02 1270:0102 B261 MOV DL,61 1270:0104 CD21 INT 21 1270:0106 CD20 INT 20 1270:0108 0000 ADD [BX+SI],AL 1270:010A 0000 ADD [BX+SI],AL 1270:010C 0000 ADD [BX+SI],AL 1270:010E 0000 ADD [BX+SI],AL 1270:0110 0000 ADD [BX+SI],AL 1270:0112 0000 ADD [BX+SI],AL 1270:0114 0000 ADD [BX+SI],AL 1270:0116 0000 ADD [BX+SI],AL 1270:0118 0000 ADD [BX+SI],AL 1270:011A 0000 ADD [BX+SI],AL 1270:011C 0000 ADD [BX+SI],AL 1270:011E 0000 ADD [BX+SI],AL - (3)执行程序 1.单步执行 格式:-t=内存地址 回车 格式:-p=内存地址 回车 功能:用命令中的内存地址的段地址和偏移地址修改cs和ip,然后执行由cs:ip指向的内存单元处的一条指令,显示各寄存器的值,并反汇编下一条指令,返回debug状态。 例: -t=1270:100 AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0AE0 ES=0AF0 SS=0AF0 CS=1270 IP=0102 OV UP EI NG NZ NA PO NC 1270:0102 B261 MOV DL,61 - 执行结果:ah=2,cs值不变,ip的值增加2,cs:ip指向第二条指令 2.多步执行 格式:-t=内存地址 执行指令的条数 格式:-p=内存地址 执行指令的条数 命令t和p的不同: one:带重复前缀rep/repnz/repz的串操作指令和loop/loopz/loopn等循环指令是与cs相关的指令。用t命令执行这类指令时,每执行一次,cx值减一,就停下来返回debug;而p命令执行时,一直执行到cx=0,执行其后的下一条指令,才返回debug two:调用指令call及中断调用指令int,由于这类指令修改了cs和ip,使程序结构产生转向。用t命令则在cs:ip(子程序)入口处停下来返回debug,可用t命令进行跟踪。而用p命令则显示call和int的下一条指令 如:分别用t和p执行1270:0140h处的指令int 21h。 -t=1270:104 AX=0200 BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=0AE0 ES=0AF0 SS=0AF0 CS=00A7 IP=107C OV UP DI NG NZ NA PO NC 00A7:107C 90 NOP -p=1270:104 AX=0200 BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000 DS=0AE0 ES=0AF0 SS=0AF0 CS=1270 IP=0106 OV UP DI NG NZ NA PO NC 1270:0106 CD20 INT 20 3.连续执行 -g=内存地址 4.断点执行 格式:-g=内存地址 断点地址 |
第1楼
|