发信人: liyv.bbs@bbs.cst.sh.cn (小邱), 信区: cnhacker
标 题: 使用soft_ICE 06 使用其它指令(2)
发信站: 生命玄机站 (Mon Sep 7 01:48:22 1998)
转信站: Lilac!ustcnews!cstshnews!lifebbs
§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 视窗。
§5.5 公用指令
指令:
A --- 组译程式码
S --- 搜寻资料
F --- 将资料填入记忆体
M --- 搬移资料
C --- 比较两记忆区块
A --- 组译程式码
语法: A [address]
解说:
Soft-ICE 的组译器允许你把程式码直接组译进记忆体中。这个组译器支援基
本的 8086 程式码及 80186 、80286 真实定址模式的扩充。但是运算辅助器及
80386 的特殊程式码、暂存器定址模式等无法组译。
A 指令会进入 Soft-ICE 内建的组译器。每行前会显示位址当提示符号。当
组合语言之程式码打入并按下 Enter 後,此程式码会组译进指定位址的记忆体中
。程式码必需符合标准的 Intel 模式。在位址提示符号下按 Enter 会离开组译
模式。
如果你正组译的记忆体范围在程式码窗中是可见的,在你组译时程式码会交
互变化。
Soft-ICE 的组译器支援标准的 8086 族指令,不过有些加强:
* DB 指令用来直接定义记忆体中之位元组资料。DB 指令後接一串位元组资
料 或/和 由空白、逗号分隔的字串。
* RETF 代表一个 far return 。
* WORD PTR 和 BYTE PTR 用来决定资料的大小。如:
MOV BYTE PTR ES:[1234],1
* 使用 FAR 和 NEAR 以明确的指定远程或近程的跳跃或呼叫。如果未指定
FAR 、NEAR ,一律视为 NEAR 。
* 参考到记忆体位置的运算域必需放在方括号中。如: MOV AX,[1234] 。
〔例〕 A CS:1234
这道指令会提示你输入组合语言码并从 CS:1234 开始组译之。输入最後一
道程式码後在位址提示符号後按 Enter 。
S --- 搜寻资料
语法: S address L lebgth data-list
data-list --- 一串位元组资料或以逗号、空白分隔的加引号字串。加引号
的字串可以使用单引号或双引号。
length --- 位元组长度。
解说:
S 指令会在记忆体中搜寻和 data-list 相同之位元组或字元。搜寻的动作由
指定的 address 开始,持续搜寻 length 位元组。每个发现的位址都会显示出来
。
〔例〕 S DS:SI+10 L CX 'Hello',12,34
这道指令会从目前的资料节段中差距位址为 SI+10 处开始搜寻 Hello 字
串後接 12h 、13h 的资料。搜寻会持续 CX 位元组才停止。
H --- 将资料填入记忆体
语法: F address L length data-list
data-list --- 一串位元组资料或以逗号、空白分隔的加引号字串。加引号
的字串可以使用单引号或双引号。
length --- 位元组长度。
解说:
F 指令会用指定的 data-list 来填满记忆体。填入的动作会从指定的
address 开始并持续 length 位元组。如果有需要会重覆 data-list 。
〔例〕 F 8000:0 l 100 'Test'
这道指令会从 8000:0000 开始填入 100h 位元组的 Test 。Test 字串会
一直重覆直到填完指定的长度。
M --- 搬移资料
语法: M start-address L length end-address
length --- 位元组长度。
解说:
M 指令会从指定的 start-address 搬移 length 位元组的资料到
end-address 。
〔例〕 M 1000:0 L 200 2000:0
这道指令会从记忆体位址 1000:0000 处搬移 200h 位元组的资料到
2000:0000 处。
C --- 比较两记忆区块
语法: C address1 L length address2
length --- 位元组长度。
解说:
C 指令会拿 address1 处 length 位元组大小的记忆体区块和 address2 处
之资料做比较。如果第一块区块的值和第二块的值不同时会显示两者各自之值及
其记忆体位址。
〔例〕 C 5000:100 L 10 6000:100
这道指令会比较从记忆体位址 5000:100 开始 10h 位元组之记忆体区块和
从 6000:100 开始 10h 位元组的记忆体区块之值。
--
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃萧秋水虽脸色苍白,但依然笑问道:“老铁,小邱,看来你们的 ┃
┃武功又有精进!” ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
※ 来源:·生命玄机 bbs.cst.sh.cn·[FROM: 202.127.16.22]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:209.578毫秒