手机版

百科游戏 手游攻略

3movscom

百科 2025-10-24 13:55:18 手游攻略 阅读:7606次

最近很多小伙伴在找3movscom的相关内容,以及对应的知识点,劳动晚报小编为大家整理一下《3movscom》的相关资讯,另外还找了一部分有关《》的内容,文章篇幅比较长,希望对大家有帮助!

本文目录一览:

  • 1、急求!!!汇编语言题答案
  • 2、关于特征码识别计算机病毒方法
  • 3、跪求汇编语语言命令详解
  • 4、MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]什么意思?
  • 5、请问这个Debug命令怎么使用?

急求!!!汇编语言题答案

1.D

2.A

3.A

4.B

5.C

6.B

7.C

8.C

9.B

10.DSC没学过物闭和,DEC指令不影响CF

11.C

12.A

13.D

14.B

15.C

16.D

17.A

18.C

19.C

20.A

21.B

22.C

23.D

24.B

25.A

------------------------------

若我有,就态慎给你,罩盯但...

关于特征码识别计算机病毒方法

病毒的产生速度很快,依然有很多病毒没有被识别.但是现在主要还是用特征码来识别病毒,一般的杀毒软件都是用类似特征码来识别并查杀病毒。

第一节 特点

病毒绕过了微软提供的应用程序界面,绕过了ActiveX、C++甚至C,使用汇编,

利用VxD(虚拟设备驱动程序)接口编程,直接杀入Windows内核。它没有改变宿主文件

的大小,而是采用了一种新的文件感染机制即碎洞攻击(fragmented cavity attack),

将病毒化整为零,拆分成若干块,插入宿主文件中去;最引人注目的是它利用目前许多

BIOS芯片开放了可重写的特性,向计算机主板的BIOS端口写入乱码,开创了病毒直接进

攻计算机主板芯片的先例。可以说CIH病毒提供了一种全新的病毒程序方式和病毒发展方向。

第二节 CIH病毒的初始化

1.用SIDT指令取得IDT base address(中断描述符表基地址),然后把IDT的INT 3 的入口地址改为指向CIH自己的INT3程序入口部分;

2.执行INT 3指令,进入CIH自身的INT 3入口程序,这样,CIH病毒就可以获得Windows最高级别的权限(Ring 0级),可在Windows的内核执行各种操作(如终止系统运行,直接对内存读写、截获各种中断、控制I/O端口等,这些操作在应用程序层Ring 3级是受到严格

限制的)。病毒在这段程序中首先检查调试寄存器DR0的值是否为0,用以判断先前是否有CIH病毒已经驻留。

3.如果DR0的值不为0,则表示CIH病毒程式已驻留,病毒程序恢复原先的INT 3入口,然后正常退出INT3,跳到过程9;

4.如果DR0值为0,则CIH病毒将尝试进行驻留。首先将当前EBX寄存器的值赋给DR0寄存器,以生成驻留标记,然后调用INT 20中断,使用VxD call Page Allocate系统调用,请求系统分配2个PAGE大小的Windows系统内存(system memory),Windows系统内存地址范围为C0000000h~FFFFFFFFh,它是用来存放所有的虚拟驱动程序的内存区域,如果程序想长期驻留在内存中,则必须申请到此区段内的内存。

5.如果内存申请成功,则从被感染文件中将原先分成多块的病毒代码收集起来,并进行组合后放到申请到的内存空间中;

6.再次调用INT 3中断进入CIH病毒体的INT 3入口程序,调用INT20来完成调用一个IFSMgr_InstallFileSystemApiHook的子程序,在Windows内核中文件系统处理函数中挂接钩子,以截取文件调用的操作,这样一旦系统出现要求开启文件的调用,则CIH病毒的传染部分程序就会在第一时间截获此文件;

7.将同时获取的Windows默认的IFSMgr_Ring0_FileIO(核心文件输入/输出)服务程序的入口地址保留在DR0寄存器中,以便于CIH病毒调用;

8.恢复原先的IDT中断表中的INT 3入口,退出INT 3;

9.根据病毒程序内隐藏的原文件的正常入口地址,跳到原文件正常入口,执行正常

第三节 病毒发作条件判断

在CIHv1.4中,病毒的发作日期是4月26日,病毒从COMS的70、71端口取出系统当前日期,对其进行判断:

MOV AX,0708

OUT 70,AL

IN AL,71 取当前系统月份-AL

XCHG AL,AH

OUT 70,AL

IN AL,71 取当前系统日-AL

XOR AX,0426 是否为4月26日

JZ 病毒发作程序

之所以不采用这段代码做特征码,是为防止正常程序使用,或者易于发作条件修改。

第四节 病毒的破坏

1.通过主板的BIOS端口地址0CFEH和0CFDH向BIOS引导块(boot block)内各写入一个字节的乱码,造成主机无法启动。

随着闪清链仔存(FlashMemory)价格的下跌,奔腾机唤碧器上BIOS普遍采用PROM(可编程只读存储器),它可以在12伏以下的电压下利用软件的方式,从BIOS端口中读出和写入数据,以便于进行程序的升级。CIH病毒正是利用闪存的这一特性,往BIOS里写入乱码,造成BIOS中的原内容被会彻底破坏,主机无法启动。

所幸的是,CIH只能对少数类型的主板BIOS构成威胁。这是因为,BIOS的软件更新是通过直接写端口实现的,而不同答汪主

板的BIOS端口地址各不相同。现在出现的CIH只有1K,程序量太小,还不可能存储大量的主板和BIOS端口数据。它只对

端口地址为0CFEH和0CFD的BIOS(据有关资料为Intel 430TX chipset、部分Pentium chipsets)进行攻击

2.覆盖硬盘

通过调用Vxd call IOS_SendCommand直接对硬盘进行存取,将垃圾代码以2048个扇区为单位,从硬盘主引导区开始依

次循环写入硬盘,直到所有硬盘(含逻辑盘)的数据均被破坏为止。

特征码:

55 8D 44 24 F8 33 DB 64 87 03 E8 00 00 00 00 5B 8D

4B 42 51 50 50 0F 01 4C 24 FE 5B 83 C3 1C FA 8B 2B

66 8B 6B FC 8D 71 12 56 66 89 73 FC C1 EE 10 66 89

73 02 5E CC 56 8B F0 8B 48 FC F3 A4 83

偏移位置:0x240

特码长度:0x40

反汇编代码:

00400240 55 PUSH EBP

00400241 8D4424 F8 LEA EAX,DWORD PTR SS:[ESP-8]

00400245 33DB XOR EBX,EBX

00400247 64:8703 XCHG DWORD PTR FS:[EBX],EAX

0040024A E8 00000000 CALL Win95_ci.0040024F

0040024F 5B POP EBX

00400250 8D4B 42 LEA ECX,DWORD PTR DS:[EBX+42]

00400253 51 PUSH ECX

00400254 50 PUSH EAX

00400255 50 PUSH EAX

00400256 0F014C24 FE SIDT FWORD PTR SS:[ESP-2] ; 用SIDT指令取得IDT base address(中断描述符表基地址),

; 然后把IDT的INT 3 的入口地址改为指向CIH自己的INT3程序入口部分;

0040025B 5B POP EBX

0040025C 83C3 1C ADD EBX,1C

0040025F FA CLI

00400260 8B2B MOV EBP,DWORD PTR DS:[EBX]

00400262 66:8B6B FC MOV BP,WORD PTR DS:[EBX-4]

00400266 8D71 12 LEA ESI,DWORD PTR DS:[ECX+12]

00400269 56 PUSH ESI

0040026A 66:8973 FC MOV WORD PTR DS:[EBX-4],SI

0040026E C1EE 10 SHR ESI,10

00400271 66:8973 02 MOV WORD PTR DS:[EBX+2],SI

00400275 5E POP ESI

00400276 CC INT3 ; 执行INT 3指令,进入CIH自身的INT 3入口程序,获得权限(Ring 0级),

00400277 56 PUSH ESI

00400278 8BF0 MOV ESI,EAX

0040027A 8B48 FC MOV ECX,DWORD PTR DS:[EAX-4]

0040027D F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]

0040027F 83E8 08 SUB EAX,8

与1.3版本匹配,源病毒初始代码如下:

MyVirusStart:

push ebp

; *************************************

; * Let's Modify Structured Exception *

; * Handing, Prevent Exception Error *

; * Occurrence, Especially in NT. *

; *************************************

lea eax, [esp-04h*2]

xor ebx, ebx

xchg eax, fs:[ebx]

call @0

@0:

pop ebx

lea ecx, StopToRunVirusCode-@0[ebx]

push ecx

push eax

; *************************************

; * Let's Modify *

; *************************************

pop esi

; *************************************

; * Generate Exception to Get Ring0 *

; *************************************

int HookExceptionNumber ; GenerateException

ReturnAddressOfEndException = $

; *************************************

; * Merge All Virus Code Section *

; *************************************

push esi

mov esi, eax

LoopOfMergeAllVirusCodeSection:

mov ecx, [eax-04h]

rep movsb

sub eax, 08h

; *************************************

; * Generate Exception Again *

; *************************************

; *************************************

; * Let's Restore *

; * Structured Exception Handing *

; *************************************

; *************************************

; * When Exception Error Occurs, *

; * Our OS System should be in NT. *

; * So My Cute Virus will not *

; * Continue to Run, it Jmups to *

; * Original Application to Run. *

; *************************************

StopToRunVirusCode:

@1 = StopToRunVirusCode

; *************************************

; * Return Original App to Execute *

; *************************************

文档:

;sID=1

音频:

今天讲一下怎么改病毒的特征码,让它不被杀毒软件杀掉,就拿hgzvip1.2没有配置的服务端为例子

3movscom

现在能被金山认识出来!

一般从程序的入口开始找特征码

4bdf68是内存的虚拟地址

bd368就是文件的相对偏移地址

现在查不出了,就说明特征码就在刚在的那一片

刚才我们填充的是120,现在就取它的一半90

范围更小了

再取90的一半

哈,范围更小了

再取48的一半

运气真好,就是这一段了,我们可以把范围更精确一点

有毒,说明不是这一段,go on,go on,go on,

查不到了,就说明是从bd376这里左右开始的

反编译原来的文件看一下,搞错了,应该用原来的文件

我们就从这里改,先看懂这里程序的意思

xor eax,eax 是把eax清为0

那么后面的两句程序的意思也是把内存地址清0,就是这两句。

我们把它的先后顺序换一下就可以了,这两句就ec和e8不同,我们换一下它们的先后顺序。

对应的文件就是这里,查一下还会不会被金山认出,哈哈,它不认识了!

但是还会被kv认出,所以我们得继续,把kv识别的特征也得改了,

方法和这里是一样的,我就不继续了。

关键点在于找到特征码之后,不能乱改,一定要把程序的意思看懂了,不然程序可能出错的。

跪求汇编语语言命令详解

哈哈,太多了

汇编命令详解

名称 解释 格配伍式

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\Desktopdebug

-a

2129:0100movax,200

2129:0103movbx,200

2129:0106movcx,200

2129:0109

此时,发现movbx,200一句错误,应为movbx,20,可以敲回车返回"-"状态,然后输入:

-a103

2129:0103movbx,20

如果多或者少若干行,不必重新输入,可以用M命令移动后面的程序来去掉或者增加程序空间.

A.程序调用命令

CDEBUG [D:] [PATH] [FILENAME[.EXT]] [PARM1] [PARM2]

其中,文件名是被调试文件的名字。如未键入文件名。可用DEBUG命令N和L把需要文件装入存储器后再调试。D指定驱动器,PATH为路径,FILENAME为文件名,PARM为命令参数

B.显示存储单元命令

-D [ADDRESS]或 ;ADDRESS 地址

-D [RANGE] ;RANGE 范围

C.修改存储单元内容命令

-E ADDRESS [LIST]

D.检查和修改寄存器内容命令

-R [REGISTER NAME] ;Register name 寄存器名字

E.汇编命令

-A [ADDRESS]

F.跟踪命令

-T [=ADDRESS] [VALUE] ;Value 变量值

G.运行命令

-G [=ADDRESS ] [ADDRESS2 [ADDRESS3]

H.反汇编命令

-U [ADDRESS]

-U [RANGE]

I.命名命令

-N FILESPECS [FILESPECS]

FILESPECS的格式可为[D:][PATH]FILENAME [.EXT]

J.装入命令

-L [ADDRESS[DRIVE SECTOR SECTOR]] ;DRIVE SECTOR 磁盘 扇区

K.写命令

W ADDRESS DRIVE SECTOR

L.退出命令

-Q

MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]什么意思?

DWORD PTR ES:[EDI],将ES:[EDI]这个内存强制转换为dword双字类型,PTR就是转换符,DWORD为双扮历前字类型,在汇编中有BYTE,WORD,DWORD几烂喊种变量类型,分别对应1,2,4个字节。

整个语句的意思就是厅清把

DWORD PTR DS:[ESI】内存单元的值传送到DWORD PTR ES:[EDI]单元保存,因为内存单元一般是2个字节的,这里强制转换为4个字节!

MOV 就是传送子令

请问这个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 110

d cs:100 110

d,cs:100,110

指定有效地址项

Debug 命令中的 address 参数指定内存位置。Address 是一个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。可以忽略段寄存器或段地址。a,g,l,t,u 和 w 命令的默认段是 CS。所有其他命令的默认段是 DS。所有数值均为十六进制格式。

有效地址如下:

CS:0100

04BA:0100

在段名和偏移量之间要有冒号。

指定有效范围项

Debug 命令中的 range 参数指定了内存的范围。可以为 range 选择两种格式:起始地址和结束地址,或者起始地址和长度范围(由 l 表示)。

例如,下面的两个语法都可以指定从 CS:100 开始的 16 字节范围:

cs:100 10f

cs:100 l 10

++

Debug 子命令

选择 Debug 命厅源令以获得详细信息。

Debug:A(汇编)

Debug:C(比较)

Debug(转储)

Debug:E(键入)

Debug:F(填充)

Debug:G(转向)

Debug:H(十六进制)

Debug:I(输入)

Debug:L(加载)

Debug:M(移动)

Debug:N(名称)

Debug:O(输出)

Debug:P(执行)

Debug:Q(退出)

Debug:r(寄存器)

Debug:s(搜索)

Debug:T(跟踪)

Debug:U(反汇编)

Debug:W(写入)

Debug:XA(分配扩展内存)

Debug:XD(取消分配扩展内存)

Debug:XM(映射扩展内存页)

Debug:XS(显示扩展内存状态)

***********************Debug子命令******************************

Debug:A(汇编)

直接将 8086/8087/8088 记忆码合并到内存。

该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。

a [address]

参数

address

指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。

有关将数据输入到指定字节中的信息,请单击“相关主题”列表中的 Debug E(键入)。

有关反汇编字节的信息,请单击“相关主题”列表中的 Debug U(反汇编)。

范例

a 命令支持所有形式的间接注册命令,如下例所示:

add bx,34[bp+2].[si-1]

pop [bp+di]

push [si] )

还支持所有操作码同义词,如下例所示:

loopz 100

loope 100

ja 200

jnbe 200

对于 8087 操作码,必须指定 wait 或 fwait 前缀,如下例所示:

fwait fadd st,st(3) ; this line assembles

; an fwait prefix

说明

使用记忆码

段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 mov***(文字因故被系统屏蔽)***(文字因故被系统屏蔽) 可以移动 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

使用伪指令

使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。以下是两个伪指令的范例:

db 1,2,3,4,"THIS IS AN EXAMPLE"

db THIS IS A QUOTATION MARK:"

db "THIS IS A QUOTATION MARK:"

dw 1000,2000,3000,"BACH"

++

Debug:C(比较)

比较内存的两个部分。

c range address

参数

range

指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。有关有效的 range 值的信息,请单击“相关主题”列表中的“Debug 说明”。

address

指定要比较的第二个内存区域的起始地址。有关有效 address 值的信息,请单击“相关主题”列表中的“Debug 说明”。

++

范例

以下命令具有相同效果:

c100,10f 300

c100l10 300

每个命令都对 100h 到 10Fh 的内存数据块与 300h 到 30Fh 的内存数据块进行比较。

Debug 响应前面的命令并显示如下信息(假定 DS = 197F):

197F:0100 4D E4 197F:0300

197F:0101 67 99 197F:0301

197F:0102 A3 27 197F:0302

197F:0103 35 F3 197F:0303

197F:0104 97 BD 197F:0304

197F:0105 04 35 197F:0305

197F:0107 76 71 197F:0307

197F:0108 E6 11 197F:0308

197F:0109 19 2C 197F:0309

197F:010A 80 0A 197F:030A

197F:010B 36 7F 197F:030B

197F:010C BE 22 197F:030C

197F:010D 83 93 197F:030D

197F:010E 49 77 197F:030E

197F:010F 4F 8A 197F:030F

注意列表中缺少地址 197F:0106 和 197F:0306。这表明那些地址中的值是相同的。

++

说明

如果 range 和 address 内存区域相同,Debug 将不显示任何内容而直接返回到 Debug 提示符。如果有差异,Debug 将按如下格式显示:

address1 byte1 byte2 addess2

++++

Debug(转储)

显示一定范围内存地址的内容。

d [range]

参数

range

指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。有关有效的 range 值的信息,请单击“相关主题”列表中的“Debug 说明”。如果不指定 range,Debug 程序将从以前 d 命令中所指定的地址范围的末尾开始显示 128 个字节的内容。

有关显示寄存器内容的信息,请单击“相关主题”列表中的 Debug R(寄存器)。

++

范例

假定键入以下命令:

dcs:100 10f

Debug 按以下格式显示范围中的内容:

04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00 TOM.SAWYER......

如果在没有参数的情况下键入 d 命令,Debug 按以前范例中所描述的内容来编排显示格式。显示的每行以比前一行的地址大 16 个字节(如果是显示 40 列的屏幕,则为 8 个字节)的地址开头。

对于后面键入的每个不带参数的 d 命令,Debug 将紧接在最后显示的命令后立即显示字节内容。

如果键入以下命令,Debug 将从 CS:100 开始显示 20h 个字节的内容:

dcs:100 l 20

如果键入以下命令,Debug 将显示范围从 CS 段的 100h 到 115h 中所有字节的内容:

dcs:100 115

++

说明

当使用 d 命令时,Debug 以两个部分显示内存内容:十六进制部分(每个字节的值都用十六进制格式表示)和 ASCII 码部分(每个字节的值都用 ASCII 码字符表示)。每个非打印字符在显示的 ASCII 部分由句号 (.) 表示。每个显示行显示 16 字节的内容,第 8 字节和第 9 字节之间有一个连字符。每个显示行从 16 字节的边界上开始。

++

Debug:E(键入)

将数据输入到内存中指定的地址。

可以按十六进制或 ASCII 格式键入数据。以前存储在指定位置的任何数据全部丢失。

e address

参数

address

指定输入数据的第一个内存位置。

list

指定要输入到内存的连续字节中的数据。

有关集成记忆码的信息,请单击“相关主题”列表中的 Debug A(汇编)。

有关显示内存部分内容的信息,请单击“相关主题”列表中的 Debug D (转储)。

++

范例

假定键入以下命令:

ecs:100

Debug 按下面的格式显示第一个字节的内容:

04BA:0100 EB.

要将该值更改为 41,请在插入点键入 41,如下所示:

04BA:0100 EB.41_

可以用一个 e 命令键入连续的字节值。在键入新值后按 SPACEBAR(空格键),而不是按 ENTER 键。Debug 显示下一个值。在此范例中,如果按三次 SPACEBAR(空格键),Debug 将显示下面的值:

04BA:0100 EB.41 10. 00. BC._

要将十六进制值 BC 更改为 42,请在插入点键入 42,如下所示:

04BA:0100 EB.41 10. 00. BC.42_

假定决定值 10 应该是 6F。要纠正该值,请按 HYPHEN 键两次以返回到地址 0101(值 10)。Debug 显示以下内容:

04BA:0100 EB.41 10. 00. BC.42-

04BA:0102 00.-

04BA:0101 10._

在插入点键入 6f 更改值,如下所示:

04BA:0101 10.6f_

按 ENTER 停止 e 命令并返回到 Debug 提示符下。

以下是字符串项的范例:

eds:100 "This is the text example"

该字符串将从 DS:100 开始填充 24 个字节。

++

说明

使用 address 参数

如果在没有指定可选的 list 参数的值情况下指定 address 的值,Debug 将显示地址和内容,在下一行重复地址,并等待您的输入。此时,您可以执行下列操作之一:

· 替换字节值。为此,请在当前值后键入新值。如果您键入的值不是有效的十六进制值,或该值包含两个以上的数字,则 Debug 不会回显无效或额外的字符。

· 进入下一个字节。为此,请按 SPACEBAR(空格键)。要更改该字节中的值,请在当前值后键入新值。如果按 SPACEBAR(空格键)时,移动超过了 8 位界限,Debug 程序将显示新的一行并在行首显示新地址。

· 返回到前一个字节。为此,请按 HYPHEN 键 (-)。可以反复按 HYPHEN 键 (-) 向后移动超过多个字节。在按 HYPHEN 时,Debug 开始新行并显示当前地址和字节值。

· 停止执行 e 命令。为此,请按 ENTER 键。在任何字节位置都可以按 ENTER。

使用 list 参数

如果指定 list 参数的值,随后的 e 命令将使用列表中的值替换现有的字节值。如果发生错误,将不更改任何字节值。

List 值可以是十六进制字节或字符串。使用空格、逗号或制表符来分隔值。必须将字符串包括在单或双引号中。

++++

Debug:F(填充)

使用指定的值填充指定内存区域中的地址。

可以指定十六进制或 ASCII 格式表示的数据。任何以前存储在指定位置的数据将会丢失。

f range list

参数

range

指定要填充内存区域的起始和结束地址,或起始地址和长度。关于有效的 range 值的信息,请单击“相关主题”列表中的“Debug 说明”。

list

指定要输入的数据。List 可以由十六进制数或引号包括起来的字符串组成。

++

范例

假定键入以下命令:

f04ba:100l100 42 45 52 54 41

作为响应,Debug 使用指定的值填充从 04BA:100 到 04BA:1FF 的内存位置。Debug 重复这五个值直到 100h 个字节全部填满为止。

++

说明

使用 range 参数

如果 range 包含的字节数比 list 中的数值大,Debug 将在 list 中反复指派值,直到 range 中的所有字节全部填充。

如果在 range 中的任何内存损坏或不存在,Debug 将显示错误消息并停止 f 命令。

使用 list 参数

如果 list 包含的数值多于 range 中的字节数,Debug 将忽略 list 中额外的值。

++

Debug:G(转向)

运行当前在内存中的程序。

g [=address] [breakpoints]

参数

=address

指定当前在内存中要开始执行的程序地址。如果不指定 address,Windows 2000 将从 CS:IP 寄存器中的当前地址开始执行程序。

breakpoints

指定可以设置为 g 命令的部分的 1 到 10 个临时断点。

有关执行循环、重复的字符串指令、软件中断或子程序的信息,请单击“相关主题”列表中的 Debug P(执行)。

有关执行指令的信息,请单击“相关主题”列表中的 Debug T(跟踪)。

范例

假定键入以下命令:

gcs:7550

Windows 2000 运行当前内存中的程序,直到执行到 CS 段中的断点地址 7550 为止。Debug 将显示寄存器的内容和标志的状态并结束 g 命令。

以下命令设置两个断点:

gcs:7550, cs:8000

如果在 Debug 遇到断点之后再次键入 g 命令,将从在断点之后的指令开始执行,而不是在通常的开始地址执行。

++

说明

使用 address 参数

必须在 address 参数之前使用等号 (=) 以区分开始地址 (address) 和断点地址 (breakpoints)。

指定断点

程序在它遇到的第一个断点处停止,而不论您在 breakpoint 列表的什么位置键入断点。Debug 在每个断点处用中断代码代替原始指令。

当程序到达断点时,Debug 将所有断点地址恢复到它们的最初指令并显示所有寄存器的内容、所有标记的状态以及最后执行指令的解码形式。Debug 显示的信息与使用 Debug r(寄存器)命令并指定断点时所显示的信息相同。

如果不在断点处停止程序,Debug 程序将不使用原始指令替换中断代码。

设置断点的限制

可以只在包含 8086 操作代码(操作码)的第一个字节的地址上设置断点。如果设置了 10 个以上的断点,Debug 将显示以下信息:

bp error

对用户堆栈指针的要求

用户堆栈指针必须有效且必须有 6 个字节可用于 g 命令。该命令使用 iret 指令跳转到正在被测试的程序。Debug 设置用户堆栈指针并将用户标志、代码段寄存器和指令指针压入用户堆栈。(如果用户堆栈无效或太小,操作系统可能会失败。)Debug 在指定的断点处设置中断代码 (0CCh)。

重新启动程序

不要在 Windows 2000 显示以下消息后尝试重新启动程序;

Program terminated normally

要正确地运行程序,必须通过使用 Debug n(名称)和 l(加载)命令重新加载该程序。

++++

Debug:H(十六进制)

对指定的两个参数执行十六进制运算。

h value1 value2

参数

value1

代表从 0 到 FFFFh 范围内的任何十六进制数字。

value2

代表从 0 到 FFFFh 范围内第二个十六进制数字。

++

范例

假定键入以下命令:

h19f 10a

Debug 执行运算并显示以下结果。

02A9 0095

++

说明

Debug 首先将指定的两个参数相加,然后从第一个参数中减去第二个参数。这些计算的结果显示在一行中:先计算和,然后计算差。

++++

Debug:I(输入)

从指定的端口读取并显示一个字节值。

i port

参数

port

按地址指定输入端口。地址可以是 16 位的值。

有关将字节值发送到输出端口的信息,请单击“相关主题”列表中的 Debug O(输出)。

++

范例

假定键入以下命令:

i2f8

同时假定端口的字节值是 42h。Debug 读取该字节,并将其值显示如下:

42

++

Debug:L(加载)

将某个文件或特定磁盘扇区的内容加载到内存。

要从磁盘文件加载 BX:CX 寄存器中指定的字节数内容,请使用以下语法:

l [address]

要略过 Windows 2000 文件系统并直接加载特定的扇区,请使用以下语法:

l address drive start number

参数

address

指定要在其中加载文件或扇区内容的内存位置。如果不指定 address,Debug 将使用 CS 寄存器中的当前地址。

drive

指定包含读取指定扇区的磁盘的驱动器。该值是数值型:0 = A, 1 = B, 2 = C 等。

start

指定要加载其内容的第一个扇区的十六进制数。

number

指定要加载其内容的连续扇区的十六进制数。只有要加载特定扇区的内容而不是加载 debug 命令行或最近的 Debug n(名称)命令中指定的文件时,才能使用 drive、start 和 number 参数。

有关指定用于 l 命令的文件的信息,请单击“相关主题”列表中的 Debug n(名称)。

有关写入调试到磁盘的文件的信息,请单击“相关主题”列表中的 Debug w(写入)。

++

范例

假定启动 Debug 并键入以下命令:

nfile.com

现在可以键入 l 命令以加载 File.com。Debug 将加载文件并显示 Debug 提示符。

假定需要从驱动器 C 将起始逻辑扇区为 15 (0Fh) 的 109 (6Dh) 个扇区的内容加载到起始地址为 04BA:0100 的内存中。为此,请键入以下命令:

l04ba:100 2 0f 6d

++

注意

使用不带参数的 l 命令

当使用不带参数的 l 命令时,在 debug 命令行上指定的文件将加载到内存中,从地址 CS:100 开始。Debug 同时将 BX 和 CX 寄存器设置为加载的字节数。如果不在 debug 命令行指定文件,所装入的文件将是最近使用 n 命令经常指定的文件。

使用具有 address 参数的 1 命令

如果使用带 address 参数的 l 命令,Debug 将从内存位置 address 开始加载文件或指定扇区的内容。

使用带全部参数的 l 命令

如果使用带所有参数的 l 命令,Debug 将加载指定磁盘扇区的内容而不是加载文件。

加载特定扇区的内容

指定范围内的每个扇区均从 drive 读取。Debug 从 start 开始加载,直到在 number 中指定的扇区数中的内容全部被加载。

加载 .exe 文件

Debug 忽略 .exe 文件的地址 address 参数。如果指定 .exe 文件,Debug 将文件重新定位到 .exe 文件的标题中指定的加载地址。在 .exe 文件被加载到内存前,标题自身从 .exe 文件脱离,因此磁盘上的 .exe 文件大小与内存中的不同。如果要检查整个 .exe 文件,请使用不同的扩展名重命名文件。

打开十六进制文件

Debug 将具有 .hex 扩展名的文件认为十六进制格式文件。键入不带参数的 l 命令,可以加载从十六进制文件中指定的地址处开始的十六进制文件。如果键入的 l 命令包含 address 参数,Debug 将把指定的地址加到在十六进制文件中找到的地址上,以确定起始地址。

++++

Debug:M(移动)

将一个内存块中的内容复制到另一个内存块中。

m range address

参数

range

指定要复制内容的内存区域的起始和结束地址,或起始地址和长度。

address

指定要将 range 内容复制到该位置的起始地址。

++

范例

假定键入以下命令:

mcs:100 110 cs:500

Debug 首先将 CS:110 地址中的内容复制到地址 CS:510 中,然后将 CS:10F 地址中的内容复制到 CS:50F 中,如此操作直至将 CS:100 地址中的内容复制到地址 CS:500 中。要查看结果,请使用 Debug d(转储)命令,并使用 m 命令指定目标地址。

++

说明

复制操作对现有数据的影响

如果新数据没有写入正在被复制的数据块中的地址,则源数据将保持不变。但是,如果目标块已经包含数据(就象它在覆盖副本操作中一样),则将改写该数据。(覆盖复制操作是指那些目标数据块部分内容覆盖原数据块部分内容的操作。)

执行覆盖复制操作

m 命令执行目标地址的覆盖复制操作,而不丢失数据。将改写的地址内容首先复制。因此,如果将较高位地址的数据复制到较低位地址,则复制操作从原块的最低位地址开始并向最高位地址进行。反之,如果要将数据从低地址复制到高地址,复制操作从原块的最高地址开始,向最低地址进行。

++++

Debug:N(名称)

指定 Debug l(加载)或 w(写入)命令的可执行文件的名称,或者指定正在调试的可执行文件的参数。

n [drive:][path] filename

要指定测试的可执行文件的参数,请使用以下语法:

n file-parameters

参数

如果在没有参数的情况下使用,则 n 命令清除当前规范。

[drive:][path] filename

指定要测试的可执行文件的位置和名称。

file-parameters

为正在测试的可执行文件指定参数和开关。

有关将文件或指定磁盘扇区的内容加载到内存中的信息,请单击“相关主题”列表中的 Debug L(加载)。

有关写入调试到磁盘的文件的信息,请单击“相关主题”列表中的 Debug W(写入)。

++

范例

假定已经启动 Debug,并加载了正在调试的程序 Prog.com。接着您决定为 Prog.com 指定两个参数并运行此程序。以下是此范例的命令序列:

debug prog.com

nparam1 param2

g

在这种情况下,Debug g(转向)命令会运行该程序,就好像您已在 Windows 2000 命令提示符后键入了如下命令:

prog param1 param2

所以,测试和调试反映 Prog.com 通常的运行时间环境。

在下面的命令序列中,第一个 n 命令将 File1.exe 指定为后接的 l(加载)命令的文件,该命令将 File1.exe 加载到内存。第二个 n 命令指定 File1.exe 将使用的参数。最后,g 命令将运行 File1.exe 文件,就好像您在 Windows 2000 命令行中键入了 File1 File2.dat File2.dat 一样。

nfile1.exe

l

nfile2.dat file3.dat

g

注意

· 不要在 n 命令的第二种形式后使用 l 命令。还要注意,如果现在使用 w(写入)命令,Windows 2000 将使用名称 File2.dat 保存正在调试的文件 File1.exe。为避免出现此结果,应该总是在 l 或 w 命令之前立即使用 n 命令的第一种形式。

++

说明

n 命令的两个用途

可以按两种方式使用 n 命令。首先,您可以使用它以指定后面的 l(加载)或 w(写入)命令所使用的文件。如果在没有命名所调试文件的情况下启动 Debug,必须在使用 l 命令加载文件之前使用命令 nfilename。在 CS:5C 为文件控制块 (FCB) 正确编排文件名的格式。其次,可以使用 n 命令指定被调试文件的命令行参数和开关。

内存区域

以下四个内存区域都会受到 n 命令的影响:

内存位置 内容

CS:5C 文件 1 的文件控制数据块 (FCB)

CS:6C 文件 2 的文件控制数据块 (FCB)

CS:80 n 命令行的长度(以字符表示)

CS:81 n 命令行字符的开头

为 n 命令指定的第一个文件名被放在 CS:5C 的 FCB 中。如果指定第二个文件名,此名称将放置到 CS:6C 的 FCB 中。n 命令行上键入的字符数(除第一个字符之外,n)存储在位置 CS:80。n 命令行上的实际字符(再次,除了字母 n 之外)存储在以 CS:81 开头的位置。注意这些字符可以是在 Windows 2000 命令提示符下键入的命令中有效的任何开关和分隔符。

++++

Debug:O(输出)

将字节值发送到输出端口。

o port byte-value

参数

port

通过地址指定输出端口。端口地址可以是 16 位值。

byte-value

指定要指向 port 的字节值。

有关从输入端口读取字节值的信息,请单击“相关主题”列表中的 Debug I(输入)。

++

范例

要将

3movscom的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、3movscom的信息别忘了在本站进行查找喔。

本文链接:https://bk.89qw.com/a-1393752

最近发表
网站分类