SoftICE使用说明(五)

使用其它指令

 

§5.1 显示及编辑类指令

 

指令:

 

U --- 反组译或显示原程式码

 

R --- 显示或更改暂存器

 

MAP --- 显示系统记忆体分布图

 

D --- 用最後一次指定的形式显示记忆体

 

DB --- 以位元组的形式显示记忆体

 

DW --- 以字组的形式显示记忆体

 

DD --- 以双字组的形式显示记忆体

 

E --- 用最後一次指定的形式编辑记忆体

 

EB --- 以位元组的形式编辑记忆体

 

EW --- 以字组的形式编辑记忆体

 

ED --- 以双字组的形式编辑记忆体

 

INT? --- 显示最後一次呼叫的插断号码

 

? H --- 显示辅助讯息

 

VER --- 显示 Soft-ICE 的版本号码

 

U --- 反组译或显示原程式码

 

语法: U [address] [L [=] length]

 

length --- 要反组译的程式码长度

 

解说:

 

U 这个指令会显示正在除错的程式的程式码。

 

如果没有指定 length ,内定值是 8 行或萤幕长度减一。

 

如果未指定 address ,这个指令会从最後一次反组译的後一位元组开始反组

译。如果从未使用过反组译指令,则从目前 CS:IP 开始。

 

 

如果程式码窗是可见的,则程式码会显示在其中。

 

如果指定的位址范围的原始程式码有载入,由目前的原始码模式来决定是否

显示原始码。

 

〔例〕 U $-10

这道指令从目前位址的前 10h 位元组开始反组译。

 

〔例〕 u .499

这道指令会从 499 行开始显示 原始码。程式码窗必需是可见的且必需在

原始码模式。

 

R --- 显示或更改暂存器

 

语法: R register-name [ [=] value ]

 

register-name --- 为下列任一:

AL AH AX BL BH BX CL CH CX DL

DH DX DI SI BP SP IP CS DS ES

SS 、或 FL

 

value --- 如果 register-name 不是 FL value 是个 16 进位值或运算式

。若 register-name FL value 下列旗号符号一或多个的组

合。旗号符号可视需要在前面加上 + -

 

O -- Overflow flag 溢位旗号

D -- Direcrion flag 方向旗号

I -- Interrupt flag 插断旗号

S -- Sign flag 正负号旗号

Z -- Zero flag 零值旗号

A -- Auxiliary carry flag 辅助进位旗号

P -- Parity flag 极性旗号

C -- Carry flag 进位旗号

 

解说:

 

R 指令是用来显示或更改暂存器之值的。

 

如果没有指定参数会显示所有暂存器和旗号的值及目前 CS:IP 的程式码。

 

如果仅指定 register-name 而未加 value ,则 Soft-ICE 会显示指定暂存

器现在的值并提示你输入新值。如果 register-name FL ,目前设置的旗号会

 

以高亮度大写显示;未设置的旗号则用普通小写显示。要维持现在暂存器的值,

 

直接按 Enter

 

如果 register-name value 均有指定,则指定的暂存器的值将被改成

value

 

想要改变旗号的值,把 FL register-name ,後接你想切换的旗号符号。

如果要设置某旗号,在旗号符号前加上 + 。要关闭某旗号,则在旗号符号前加上

 

一个 - 。旗号可以按任何顺序排列。

 

〔例〕 R AH 5

这道指令会把 AH 暂存器的值改成 5

 

〔例〕 R FL = O Z P

这道指令会切换 O Z P 旗号的值。

 

〔例〕 R FL

这道指令会显示目前旗号的值并让你可以修改其值。

 

〔例〕 R FL O +A -C

这道指令会切换 O 旗号,设置 A 旗号并关闭 C 旗号。

 

MAP --- 显示系统记忆体分布图

 

语法: MAP

 

解说:

 

MAP 指令显示各记忆体部份的名称、位置和大小。大小是以页来计算的。一

页等於 10h byte

 

CS:IP 所指的部份会以高亮度显示。

 

使用 MAP 指令的时机:

 

中断点发生时指向未知的记忆体区段。

 

你想控制常驻程式或系统程式。你可以根据 MAP 指令所显示的开始位址

汉大小来设置范围中断点。

 

你怀疑程式或系统在其记忆体空间之外写码。MAP指令可用来找出此区段

的记忆体位址以便在 CSIP 中使用。

 

你必需找出哪个常驻程式拥有目前的插断向量。

 

〔例〕 MAP

以下是这道指令显示的范例:

 

..........

 

DOS 的版本低於 3.1 ,将显示程式的位址而非其程式名称。

 

D DB DW DD --- 显示记忆体

 

语法: D [size] [address] [ L [=] length ]

 

size --- B -- byte W -- word D -- double word

 

length --- 要显示几位元组。

 

解说:

 

D 这个指令会显示指定位址的记忆体内容。

 

记忆体内容是以指定的 size 的形式显示。如果没有指定size,会以最後

一次使用的 size 来显示。所有的形式均会显示 ASCII 码。

 

如果未指定address ,则由前一次显示的最後一位元组的後一位元组开始显

示。

 

如果没有指定 length ,内定值是 8 行或因视窗较小而少一些。

 

若资料窗是可见的,则资料会显示在资料窗且 length 会被忽略。

 

〔例〕 DW DS:00 L=8

这道指令会以字组和 ASCII 的形式显示目前资料节段的前 8 位元组。

 

E EB EW ED --- 以位元组的形式编辑记忆体

 

语法: E [size] address [data-list]

 

size --- B -- byte W -- word D -- double word

 

data-list --- 一串指定之 size 的资料,(位元组、字组或双字组)或以

逗号、空白分隔的加引号字串。加引号的字串可以使用单引

号或双引号。

 

解说:

 

E 指令显示指定位址的记忆体内容并让你编辑其值。

 

这个指令以 ASCII 的形态显示记忆体内容,并且是以指定的 size 形态。

 

记忆体编辑器让你可以快速的更新记忆体。你可以键入 ASCII 字元或打入位

元组、字组、双字组之值以编辑记忆体。如果没有指定size ,以最後一次使用

size 为准。以下是记忆体编辑的按键:

 

--- 游标上移

--- 游标下移

--- 游标右移

--- 游标左移

SPACE --- 游标移至下一个元素上

TAB --- 在数字区和 ASCII 区间切换

ESC Enter --- 离开记忆体编辑器

 

在你输入资料之时,真正记忆体上的值也随之更新。所有的数字值都是以16

进位表示。按 TAB 键可以在数字区和 ASCII 区间切换。

 

如果资料窗是可见的,则在其中修改资料;否则在指令窗中修改。

 

资料显示的长度,在指令窗中内定为 8 行。如果资料窗是可见的,则和资料

 

窗同大小。

 

如果未加参数且资料窗是可见的,则游标会移到资料窗中。若资料窗是不可

见的,则在指令窗中由最後一次显示或编辑的位址开始进行编辑。

 

〔例〕 EB 1000:0

这道指令由 1000:0000 开始,以位元组的形态,用数字和 ASCII 字元显

示资料的值。你可以编辑这些显示出来的值。

 

〔例〕 EB 8000:0 "HELLO",0D

这道指令把从 8000:0000 开始的值以 HELLO 字串和一个归位字元代替。

 

INT? --- 显示最後一次呼叫的插断号码

 

语法: INT?

 

解说:

 

INT? 指令显示最後一次发生的插断号码及其位址。

 

〔例〕 INT?

以下是 INT? 显示结果的例子:

 

Last Interrupt: 16

At: 0070:0255

 

这个例子显示在 Soft-ICE 视窗被叫出之前,系统最後一次呼叫的是 16h

插断,位址在 0070:0255 。如果最後一次插断是个软体插断,从0070:0255

做反组译会显示此插断的程式码。若是个硬体插断,反组译则会显示插断发生

时所执行的程式码。

 

? H --- 显示辅助讯息

 

语法: < ? | H > [command | expression]

 

解说:

 

? H 指令两者均会显示辅助讯息。

 

如果未指定参数将会一次一个萤幕的显示所有指令和运算子的简单解说。按

任意键以继续显示或按 ESC 键离开辅助说明。

 

若有指定参数则会显示包括指令语法及范例的详尽说明。

 

如果加上运算式,则会计算并以 16 进位、10 进位及 ASCII 字元显示其结

果。

 

〔例〕 ? ALTKEY

这道指令会显示包括 ALTKEY 指令的语法及范例的资料。

 

〔例〕 H 10 + 14*2

这道指令会显示: 0038 00056 "8" 。这是 10+14*2 16 进位、10

位值及 ASCII 字元。

 

VER --- 显示 Soft-ICE 的版本号码

 

语法: VER

 

〔例〕 VER

这道指令会显示 Soft-ICE 的版本及 Nu-Mega 的版权讯息。

 

§5.2 I/O 埠指令

 

指令:

 

I IB --- 由位元组 I/O 埠输入

 

IW --- 由字组 I/O 埠输入

 

O OB --- 由位元组 I/O 埠输出

 

OW --- 由字组 I/O 埠输出

 

I IB IW --- I/O 埠输入

 

语法: I [size] port

 

size --- B -- byte W -- word D -- double word

 

port --- 一个位元组或字组的值

 

解说:

 

这个由埠输入的指令是用来读取及显示硬体埠之值的。你可以从位元组或字

组埠输入。如果没有指定 size ,内定值是位元组。

 

〔例〕 I 21

这道指令是显示一号中断控制器的遮罩暂存器之值。

 

O OB OW --- 由字组 I/O 埠输出

 

语法: O [size] port value

 

size --- B -- byte W -- word D -- double word

 

port --- 一个位元组或字组的值

 

value --- 位元埠为一位元组值;字组埠为一字组值

 

解说:

 

对埠输出的指令是用来对硬体埠写值的。你可以对位元组埠或字组埠做输出

,如果没有指定 size ,内定值是位元组。

 

〔例〕 O 21 FF

这道指令会遮罩住一号中断控制器的所有中断。

 

§5.3 转换控制指令

 

指令:

 

X --- 离开 Soft-ICE 之视窗

 

G --- 执行到某位址

 

T --- 追踪一道程式码

 

P --- 单步执行程式

 

HERE --- 执行到目前游标那行

 

GENINT --- 强制某一插断

 

EXIT --- 强制离开目前之 DOS 程式

 

BOOT --- 载入系统 (保留 Soft-ICE

 

HBOOT --- 硬体系统载入 (完全重设)

 

X --- 离开 Soft-ICE 之视窗

 

语法: X

 

解说:

 

X 指令会离开 Soft-ICE 视窗并恢复因叫出 Soft-ICE 而中断的程式之控制

权。Soft-ICE 视窗会消失。如果有设置任何中断点,它将被启动。

 

〔例〕 X

 

G --- 执行到某位址

 

语法: G [=staer-address] [break-address]

 

解说:

 

G 指令会离开 Soft-ICE 视窗并设置一个只用一次的执行中断点。除此之外

,所有的 sticky 中断点也会被启动。

 

若有指定 start-address 参数,将从 start-address 开始执行;否则会从

目前的 CS:IP 开始执行。程式将一直执行,直到达到 break-address 、使用了

 

叫出视窗的热键或 sticky 中断点发生才会停止。

 

break-address 必需是一道程式码的第一位元组。

 

当达到指定的 break-address 时,CS:IP 将指向设置中断点的位置。

 

未加参数的 G 指令和 X 指令有相同的作用。

 

除非所有的中断点暂存器都被 sticky 中断点占满了,不然 non-sticky

断点会使用 80386 中断点暂存器。在这种状况下,中断点将会使用 INT 3 方式

 

。这种情形下,在 ROM G P 指令将无法正常工作。如果你尝试这样做将会

 

显示出错误讯息。

 

〔例〕 G CS:1234

这道指令将在 CS:1234 设置一个只用一次的执行中断点。

 

T --- 追踪一道程式码

 

语法: T [=start-address] [count]

 

解说:

 

T 指令使用单步旗号以单步执行一道程式码。

 

如果没有指定 start-address ,将从目前的 CS:IP 开始执行。若有指定

start-address ,则 CS:IP 将指向 start-address 以进行单步执行。

 

如果有指定 count Soft-ICE 将单步执行 count 次。TRACE 指令将持续执

行直到 count 为零或按了 ESC 键,而不管是否有中断点发生。

 

若是在原始码模式,T 指令会单步到下一道原始码叙述。如果目前的叙述是

个程序或呼叫函数且呼叫的程序的原始码存在,T 指令会单步执行进入这个呼叫

 

。如果没有呼叫的程序或函数的原始码,T 指令会单步执行完整个程序。

 

〔例〕 T = 1284 3

这道指令会单步执行在记忆体位址 1284 3 道程式码。

 

P --- 单步执行程式

 

语法: P

 

解说:

 

P 指令是个逻辑的程式单步执行。除非目前 CS:IP 之程式码是呼叫、插断、

回圈或反复字串,不然将执行此程式码。若为呼叫、插断等程式码,将会执行完

 

整个程序或反复动作才会回到 Soft-ICE

 

P 指令会设置一个只用一次的执行中断点。除非所有的中断点暂存器都被

sticky 中断点占满了,不然 non-sticky 中断点会使用 80386 中断点暂存器。

 

在这种状况下,中断点将会使用 INT 3 方式。这种情形下,在 ROM G P

指令将无法正常工作。如果你尝试这样做将会显示出错误讯息。

 

若是在原始码模式,P 指令会单步到下一道原始码叙述。如果目前的叙述是

个程序或呼叫函数,P 指令会把它整个执行完。

 

〔例〕 P

这道指令会单步执行程式。

 

HERE --- 执行到目前游标那行

 

语法: HERE

 

解说:

 

HERE 指令会一直执行到目前游标所在那行。只有当游标在程式码窗中才能使

HERE 指令。如果程式码窗不可见或游标不在其中,用 G 指令代替。

 

HERE 指令会离开 Soft-ICE 视窗并设置一个只用一次的执行中断点。此外,

所有的 sticky 中断点也会被启动。

 

程式将由目前的 CS:IP 开始执行,直到执行到游标所在位置的程式码、使用

了叫出视窗的热键或某 sticky 中断点发生为止。

 

除非所有的中断点暂存器都被 sticky 中断点占满了,不然 non-sticky

断点会使用 80386 中断点暂存器。在这种状况下,中断点将会使用 INT 3 方式

 

。这种情形下,在 ROM G P 指令将无法正常工作。如果你尝试这样做将会

 

显示出错误讯息。

 

〔例〕 HERE

这个例子在目前游标所在设置一个执行中断点,然後离开 Soft-ICE 并从

目前的 CS:IP 开始执行。

 

GENINT --- 强制某一插断

 

语法: GENINT INT1 | INT3 | NMI | interrupt-number

 

interrupt-number --- 00 FF 中的一个数字

 

解说:

 

GENINT 指令会强制发生某一插断。当 Soft-ICE 和另一个软体除错器共用时

,这个功能可以用来把控制权交给另一个除错器。这也可以用来测试插断程序。

 

 

GENINT 指令会模拟执行一道硬体插断或 INT 程式码。它将把 falg CS

IP 之值推入堆叠,并把 CS IP 之值改成插断向量表中和指定的 interrupt-

number 相对的进入点。

 

〔例〕 GENINT NMI

这道指令会强制发生一个无法遮罩的插断。如果 Soft-ICE CodeView

一起使用,这将把控制权交回 CodeView

 

EXIT --- 强制离开目前之 DOS 程式

 

语法: EXIT [R] [D]

 

R --- 恢复插断向量表

 

D --- 清除所有中断点

 

解说:

 

EXIT 指令藉强制执行 INT 21h 4Ch 功能来中止目前程式。这个指令只有

DOS 处於可以接受此函数呼叫的状态下才能使用。如果此呼叫是由目前的中断

 

函式呼叫或是在 DOS 尚未备妥时,系统的行为将无法预期。

 

使用 R 参数时,除了中断向量表外,不会做任何系统重设的动作。这意味著

BIOS 变数、视讯模式及其它系统层次的资料并不会被还原。

 

使用 R 参数会把中断向量还原成它们最後一次储存的状态。Soft-ICE会在

其载入时、程式以 LDR.EXE 载入时及使用 VECS S 指令时储存中断向量。

 

〔注〕依照下列步骤来重新启动由 LDR.EXE 载入的程式:

 

EXIT R

LDR prog.EXE

 

EXIT 指令会把中断向量表还原成程式载入前之值,然後回到命令处理器。

由执行 LDR 并加上 .EXE 的尾巴可以把程式重新载入而不需重载符号及原

始码。符号和原始码会保持在记忆体中。

 

〔注意〕EXIT 指令必需小心使用。因为Soft-ICE可以在任何时候叫出,可能会

DOS 不能接受中止函数呼叫的情形发生。而且 EXIT 指令也不会重置

程式的状况。举例来说,EXIT 指令不会重设视讯模式。如果你的程式把

BIOS 和硬体放在特别的视讯模式中,使用 EXIT 指令後仍会留在此模式

中。

 

〔例〕 EXIT R

还原中断向量表并跳出目前的程式。如果程式是用 LDR.EXE 载入的,则要

R 参数。

 

BOOT --- 载入系统 (保留 Soft-ICE

 

语法: BOOT

 

解说:

 

BOOT 指令会重置系统并保留 Soft-ICE BOOT 可以用来对载入程序、DOS

驱动程式及非 DOS 的作业系统做除错。

 

BOOT 是以 ROM BIOS 19h 插断呼叫的方法。有时候 19h 插断可能无法工

作。如果发生这种状况,叫出 Soft-ICE 并使用 HBOOT 指令。

 

为了让 BOOT 正确的工作,Soft-ICE 必需由 CONFIG.SYS 中做第一个驱动程

式载入。这样 Soft-ICE 才能尽可能的还原系统原始状态。

 

〔例〕 BOOT

这道指令会重新载入系统。Soft-ICE 依然保留。

 

HBOOT --- 硬体系统载入 (完全重设)

 

语法: HBOOT

 

解说:

 

HBOOT 指令会重置整个系统。在重置的过程中 Soft-ICE 不会保留。除非介

面卡需要重开电源才能重置否则HBOOT就够用了。在这种罕有的状况中,你必需

关掉电源再重新打开。

 

〔例〕 HBOOT

这道指令会重新载入系统。Soft-ICE 必需要重新载入。

 

§5.4 除错模式指令

 

指令:

 

ACTION --- 设定中断点发生後的动作

 

WARN --- 设定 DOS/ROM BIOS 重入 (re-entrancy) 警告模式

 

BREAK --- 在任何时候中断

 

13HERE --- INT 3 指向 Soft-ICE

 

ACTION --- 设定中断点发生後的动作

 

语法: ACTION [INT1 | INT3 | NMI | HERE | int-number]

 

int-number --- 任何可用的插断号码 (0-FFh) 。只有当自己的中断点处理

程序已取代原插断向量时才可使用。(参阅 §11.2)

 

解说:

 

ACTION 指令用来决定当中断点条件成立时要把控制权交给谁。大部份的状况

都是 INT3 HERE INT3 是在 Soft-ICE 和其它除错器一起使用时使用;

HERE

则是用来使中断点条件成立时回到 Soft-ICE INT1 NMI 则是两者择一用在

 

无法使用INT3的除错器时。例如:使用 CodeView 时,ACTION设为NMI最好。

 

只有当自己的中断点处理程序已取代原插断向量时才可使用 int-number

如果没有中断点处理程序而使用 int-number 将会发生错误。参阅 §11.2

以取得更多资讯。

 

如果没有加任何参数将会显示目前的设定。

 

ACTION 的内定值是 HERE

 

〔例〕 ACTION HERE

这道指令设定当中断点条件成立时将返回 Soft-ICE

 

WARN --- 设定 DOS/ROM BIOS 重入 (re-entrancy) 警告模式

 

语法: WARN [ON | OFF]

 

解说:

 

WARN 指令是用来让 Soft-ICE 和会使用 DOS ROM BIOS 的除错器一起使

用。许多除错器使用 DOS ROM BIOS 来做萤幕输出和读取按键。因为 DOS

 

ROM BIOS 不完全能重入,若中断点发生在 DOS ROM BIOS 在执行时,除错器

 

可能无法正常的工作。

 

如果设定 WARN ON 而且 ACTION 不是 HERE ,在真正动作发生前会先把控制

权交给 Soft-ICE 。系统会显示目前 CS:IP 并让你决定是要继续或是回到

Soft-

ICE 。一般而言,你应该选择回到 Soft-ICE 以继续除错。只有在你确定不会造

 

DOS ROM BIOS 重入时才可选择继续。

 

Soft-ICE DEBUG SYMDEB CodeView 一起使用时应该把 WARN

ON

 

如果未加参数将会显示目前 WARN 的状态。

 

WARN 的内定值是 OFF

 

〔例〕 WARN ON

这道指令会打开 DOS/ROM BIOS 重入警告模式。

 

BREAK --- 在任何时候中断

 

语法: BREAK [ON | OFF]

 

解说:

 

BREAK 指令让你即使在关闭插断的状况下也能从当掉的系统叫出 Soft-ICE

。你可以在整个除错过程中使用 BREAK 模式或在需要时开关它。

 

BREAK 模式会些微的降低系统的效率。系统的效率虽会降低,但却可以跳出

当掉的程式。即使效率会降低,若是程式随时可能会当掉,使用者还是可能会一

 

直使用 BREAK 模式。

 

不像其它也可以随时叫出的除错器,Soft-ICE 不需要外加的开关。当 BREAK

ON 时,只要按热键即可叫出 Soft-ICE

 

如果没有加参数将会显示目前 BREAK 的状态。

 

BREAK 的内定值是 OFF

 

〔例〕 BREAK ON

这道指令会打开 BREAK 模式。这意味著即使关闭插断,Soft-ICE 也可随

时叫出。

 

13HERE --- INT 3 指向 Soft-ICE

 

语法: 13HERE [ ON | OFF]

 

解说:

 

13HERE 指令让你指定所有的 INT 3h 均会叫出 Soft-ICE 的视窗。这项功能

在你想让程式停在某特定位置时很有用。

 

要使用这项功能,在你的程式码中你想停下来的位置加上 INT 3 指令。当

INT 3 发生时会叫出 Soft-ICE 视窗。这时候,你可以使用 R IP 指令来改变指

 

令指标指向 INT 3 的下一个程式码;然後你可以继续进行除错。

 

如果没有加参数将会显示目前 13HERE 的状态。

 

13HERE 的内定值是 OFF

 

〔例〕 13HERE ON

这道指令会打开 13HERE 模式。在这之後的所有 INT 3 均会叫出 Soft-

ICE 视窗。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值