怎样用softICE调试程序

前 言 ~~~~~~ 由於保护越来越强悍, 使得合法买软体的我们, 还要受到各种千奇百怪的折磨, 弟深深觉得受到侮辱。(您呢 ?) 所以小弟和朋友们不遗馀力的寻找各种好的破解工具, 并将之推荐给诸位。软体公司应当知道, 将盗版的成本转嫁给合法的使用者, 那是不对的, 唯有尊重 User, 并加强服务态度, 台湾软体业才有起飞的一天。 Soft-ICE 功能之强大, 如以下文件所言, "可以比拟硬体侦错器", 换言之只要 程式没有进入保护模式, 都逃不过本程式的中断, 而且一般软体刻意当掉 debugger 的陷阱都不用费心。 本文件由 Chi-hao Tseng 和朋友一起翻译, 如果文件中有不当之处, 欢迎 在 90 Net - Copy Board 区写信给弟 (Chi-hao Tseng)... 另外本文件非常非常欢迎你 copy 给有需要的人, 不过不要让小弟看到本文 件中任何一部份的内容被修改或被拿来图利 (小弟和朋友们会很痛心的), 在最後还是要感谢你肯花时间来看小弟的拙作.... 第 一 章 -------- [介绍] 1.1 本程式的功能 1.2 使用手册 1.3 系统需求 1.1 本程式的功能 ---------------- Soft-ICE 是一个软体除错工具。可是它拥有相当於硬体侦错器(hardware-level) 的能力, 使它能凌驾於 DOS 一般的除错程式之上。 Soft-ICE 使用 386 的虚拟 86 模式(virtual 86 mode) 将 DOS 所有程式摆在 一个虚拟机器 (Virtual Machine) 上, 使得 Soft-ICE 可以完全控制 DOS 的环境。 Soft-ICE 使用 80386 保护模式的特色, 像是 paging、I/O privilege level 和 break point register, 加'硬体侦错器'中断指示著你存在的DOS 除错程式. 我们设计 Soft-ICE 时有三个目标: 1. 利用这 80386 实际上的机器潜在能力 去侦错未来的东东 那个是不可能的 或以 缓慢 仅软体的除错程式 是禁止的. 即时的'硬体侦错器'中断点,记忆体保护,中断跳出程式 , 等等. 2. 和现有侦错器的使用方式相容。我们想要提供一个工具 -- 它的使用方式和现有 侦错器的使用方式相同, 可是它却拥有硬体除错器的能力。如此使用者就可以省去 不必要学习的时间, 而得到有力的工具。 3. 是一个拥有友善使用者介面 (user-friendly) 的程式。 由於 Soft-ICE 的视窗可以自由移动, 和变换大小, 所以即使一些资讯被档 在视窗底下, 只要经过移动和变换大小, 也可以被使用者看到, 另外动态 的线上辅助功能, 使得你偶而才用一次 Soft-ICE 也不会感到困扰.... Soft-ICE 的特色: * 可设定某记忆体在读/写时、I/O 埠在读/写时、到达某块记忆体范围, 或是某插断 发生时, 立即中断回到 Soft-ICE。 * 反向追踪程式。 * 原始程式的侦错。 * 可以和其它侦错器同时侦错程式。 * 完全支援 EMM 4.0 (expand memory manager)。 * 如果是单色萤幕, 则可以自动将 Soft-ICE 放在 640 KB 主记忆体以外的空间。 * 本程式可在任何时刻呼叫出来。 * 即使键盘插断被改, 本程式还是可以呼叫出来。 * 本程式实际是放在另一虚拟机器上, 这麽做是为了怕其它程式刻意的更改 或摧毁 Soft-ICE 的程式码。所以即使 DOS 当掉了, Soft-ICE 能仍正常 的工作。(注1.) * 如果你的电脑拥有超过 640 KB 的记忆体, 则 Soft-ICE 将不会 占用低於 640 KB 的传统记忆体。 * 亲合力极强的动态线上帮助。 * 本程式像是一个真正独立於电脑外的硬体侦错器。这代表你可以侦错任何 一个设备驱动程式(.sys), 这是传统的除错程式所不及的。 * 甚至可以对 DOS 不相容或可以自我开机的程式除错。 * 安装相当简单。 你根本不用调任何一个 DIP 开关, 而且本程式也不会占用 任何一个 I/O 埠, 更不会跟任何一块记忆体相冲。 附注: Soft-ICE 是使用真实的位址(segment:offset) 来定址, 而不是使用 286 和 386 的定址方式来定址。 1.2 使用手册 ------------ [ Soft-ICE 的手册有四个主要部份 ] (第一节) 学习如何使用 Soft-ICE (第二节) 各种命令的说明 (第三节) 所支援的特性 (第四节) 进阶的主题 第一节讨论使用本程式侦错时最常遇到的问题。在本节中我们也安插了一个小 实验。 "学习Soft-ICE" ,和一个小的实验, Soft-ICE据有亲和力的线上辅助能被使用於参考命令叙述与语法. 这”学习 Soft-ICE”部分包含安装指示,一个使用者介面的叙述 与教导.这教导被设计把你自身执行的更快速. ”命令”部分叙述所有这 Soft-ICE 命令. 这命令叙述被方程式群团结成组织以一个alphabetic索引备考. ”支援赋与著特点”部分盖先进的装载选择, 象徵的与来源同水准除错,与 EMM 4.0可能性. ”先进的主题”部分主题,诸如:使用 Soft-ICE 以 DOS loadable 驱动器与使用 Soft-ICE 在非Dos作业系统. 遍及在这手册,在这些教导和这些命令部分, 当你读这些指定的资料.像是已给你那些你需要的 Soft-ICE 资料. 4 ”ENTER”一个键,如下这键,你将按下这键标示. 当这说明告诉你去”ENTER”一个片语, 诸如:WIN,你将键入这指定的字元,然後按ENTER键. 1.3系统需求 Soft-ICE 工作在 IBM系列Model 70与80 Compaq 80386与 80386SX 电脑, AT级相容品 与 80386 微处理器 . 假如他们是AT相容品 Soft-ICE 将只工作在 80386 XT 微处理器 . Soft-ICE 工作最好在延伸记忆体,但以传统的记忆系统工作也好. Soft-ICE ,为它的影像输出和 keystroke输入不使用 DOS或 ROMBIOS. 所以影像以下列的模式必定会相容的: MDA, Hercules, CGA, EGA, or VGA. Soft-ICE 同时也有支援 双萤幕结构, 当除错videointensive程式可能是有帮助的. 注1. PS.(这就是 VM86 mode 的优先权多工, 利害之处 ) 第 二 章 ---------- [介绍] 2.1 磁片内容 2.2 载入 Soft-ICE 2.2.1 无 Extended Memory 时的载入方法 2.2.2 有 Extended Memory 时的载入方法 2.2.3 如何调整 Soft-ICE 使能依您的设定启动 2.3 脱离 Soft-ICE 2.4 重新载入 Soft-ICE 2.1 磁片内容 Soft-ICE 原本装在一片5又1/4英□或一片3又1/2英□的磁片中。 当您执行S-ICE时,S-ICE注册所有人的大名将会被显示於萤幕上,以制止著作权被 侵害。 S-ICE磁片本身为了您方便起见,并未实际做防拷措施。同样,为了我们的 便利,我们感激您对我们的许可协约有著高度的尊敬。为免原版磁片损毁而制作一 份备份程式乃非常重要的一件事。 Soft-Ice磁片的目录中应当含有下列档案: S-ICE.EXE S-ICE.DAT LDR.EXE MSYM.EXE EMMSETUP.EXE UPTIME.EXE README.SI SAMPLE.EXE SAMPLE.ASM SAMPLE.SYM S-ICE.EXE 为 Soft-ICE 主程式。 S-ICE.DAT 为 Soft-ICE 启始参数设定档。 LDR.EXE 为 Soft-ICE 主程式及符号档(symbol file)的载入程式。 MSYM.EXE 为 Soft-ICE 符号档的产生程式。 EMMSETUP.EXE 为供使用者自定扩展记忆体(expanded memory)使用方式的程式。 UPTIME.EXE 为修正时间调[拯]的程式。 README.SI 为一文字档,其中包含有Soft-ICE使用手册未提及的事项。 SAMPLE.EXE 为使用者指南中所使用的一个示范(DEMO)程式。 SAMPLE.ASM 为 SAMPLE.EXE 的组合语言原始程式。 SAMPLE.SYM 为 SAMPLE.EXE 的符号档。 2.2 载入Soft-ICE 在执行Soft-Ice之前,先将磁片中所有的档案拷贝至硬碟机中。 这些档案应当放置於您的档案路径所能存取到的目录中。 S-ICE.EXE 能以DEVICE DRIVER的形式载入抑或以一般程式於DOS 命令行下执行。 如果想要使用Soft-Ice的特点的话,则SICE.EXE必须在CONFIG.SYS中以DEVICE DRIVER 的方式载入。 注解 : 如果您没有extended memory的话,则Soft-ICE 无法以device driver的形式载入。 也就是说您必须在DOS prompt下载入它。 2.2.1 无 Extended Memory 的载入方法: 当您没有extended memory时,Soft-ice将尽量将自己本身载入到记忆体最高位置。 而被Soft-ice所使用的记忆体将会被排除在外(map out)。因此DOS记忆体的可视范围 将比载入前为少,建议您在其他任何常驻程式前载入 S-ICE。 如果您没有 extended memory, 只要键入: S-ICE 2.2.2 使用 Extended Memory 来载入的方法: 以Extended Memory来载入S-ICE可以下列两种方法达成: 1. 在 CONFIG,SYS, 中将S-ICE.EXE以driver的形式载入: 如果您将使用下列的功能,则必须是此种方法。 * 与经由ROM BIOS CALLS来存取记忆体的程式,共享记忆体。 (如 VDISK,SYS, RAMDRIVE.SYS,HIMEM.SYS,cache programs, 等等). * 使用Soft-ICE EMM 4,0 相容能力。 * 使用Soft-ICE 作为符号或原始程式阶段的除错。 * 使用back trace ranges. * 与其它Nu-Mega 的产品如MagicCV,共同使用S-ICE。 当以DRIVER形式载入时,Soft-Ice将配置一部份的Evtended memory以作为 自己本身及其附属程式使用,因此不会有记忆体冲突发生。S-ICE.EXE必须 在其它会配置Extended memory的程式之前载入。(例如:VDISK.SYS, RAMDRIVE.SYS)。通常如果Soft-Ice在CONFIG.SYS中第一个载入时,能得到 最好的效果。 对於那些新进使用Soft-Ice的使用者而言,在CONFIG.SYS中以下列叙述来将 Soft-Ice当作第一个载入的程式是很明智的: device = drive: /path/S-ICE.EXE /SYM 50 Drive 及 path 须指派为S-ICE.EXE 所在的目录.该项叙述会在系统重置後 将Soft-Ice载入,适合作为入门指引。无论如何,Soft-ICE将不会载入更为 强大的功能(如EMM 4.0)。在您使用有一些心得後,您可以重新调整Soft-Ice 来使用诸如此类的功能。如果您已熟悉Soft-Ice或想要立即调整设定以使用 其功能的话,请参阅第六章(Soft-ICE 初始设定选项)。 第 三 章 30分钟内学会 DEBUG §3.1 序言 Soft-ICE 的所有动作都发生在一个可以随时叫出的视窗中。Soft-ICE 的所有 指令都可以显示在一个小视窗中,但这个视窗可以扩大到整个萤幕。当你把 Soft- ICE 当做其它除错程式的助手使用时,你可能会使用小视窗。当你把 Soft-ICE 当 独立除错器用时,你可能会使用大视窗。 如果你使用原来磁片上的设定档( S-ICE.DAT ),那视窗一开始是占满整个 萤幕的。 §3.2 叫出视窗 载入 Soft-ICE 後,你可以随时叫出视窗。一开始你只要按 Ctrl - D 即可叫 出 Soft-ICE 。使用 ALTKEY 的指令可以更改此热键。( 参阅 §5.8 ) §3.3 由视窗中返回 使用 X 这个指令或你叫出 Soft-ICE 的热键均可以回到原先的画面。你在 Soft-ICE 中设定的所有中断点此时开始启动。 §3.4 改变视窗大小 你可以改变 Soft-ICE 视窗的宽度和高度。在独立模式中显示程式码时,改变 视窗大小的功能特别有用。视窗的高度为 8 到 25 行。按 Alt - ↑ 使视窗变高 Alt - ↓ 使视窗变短 使用 WIN 的指令以改变视窗的宽度。( 参阅 §5.9 )直接输入 WIN 而不 加参数会在下面两种模式中切换: WIDE 模式 --- 占满整个萤幕 NARROW 模式 --- 46 个字元宽 有些指令像 D 、E 、R 、U ,使用 WIDE 模式以显示更多讯息时较为方便。 §3.5 移动视窗 Soft-ICE 的视窗是可以移动且可以定位在萤幕上的任何地方。这功能在 NARROW 模式下特别有用。在你需要时移动视窗以便观看萤幕上被视窗挡到的地方。你可以 用下列按键控制萤幕的移动: Ctrl - ↑ 向上移一行 Ctrl - ↓ 向下移一行 Ctrl - → 向右移一列 Ctrl - ← 向左移一列 §3.6 行编辑按键 Soft-ICE 容易使用的行编辑器让你可以叫回并编辑上一个指令。它的功能类似 那些有名的 CED 行编辑器。以下按键可以帮助你在命令窗中编辑指令: → --- 游标右移 ← --- 游标左移 Ins --- 切换插入模式 Del --- 消除现在字元 Home --- 把游标移到一行的开头 End --- 把游标移到一行的结尾 ↑ --- 显示上一个指令 ↓ --- 显示下一个指令 Shift - ↑ --- 显示向上卷一行 Shift - ↓ --- 显示向下卷一行 Page Up --- 显示向上卷一页 Page Down --- 显示向下卷一页 BackSpace --- 消除前一个字元 Esc --- 取消目前命令 当游标在资料窗或程式码窗时,另有特殊的按键,这在後面将会讨论到。 §3.7 动作状态行 在萤幕底部的状态行提供指令语法的辅助。 §3.8 指令语法 Soft-ICE 是个由指令操控的除错工具。要令 Soft-ICE 有动作,你要下指令给 它。指令可以因不同参数而有改变。 所有的指令都是 1 到 6 个字元的字串且不分大小写。所有的参数都是字串或 运算式。 运算式是典型的数字,也可以是数字和运算子的结合。所有的数字均以 16 进 位表示。一个位元组 (byte) 参数有 2 位,字组 (word) 参数有 4 位。双字组 (double word) 是两个由 : 分隔的字组参数。以下是一些参数的例子: 12 --- 位元组参数 10FF --- 字组参数 E000:0100 --- 双字组参数 暂存器在运算式中可以拿来当位元组或字组参数用。例如: U CS:IP -10 的指 令会从现在指令指标所指位址向前 10 byte 开始反组译。以下的暂存器名称可以用 在运算式中: AL 、AH 、AX 、BL 、BH 、BX 、CL 、CH 、CX 、DL 、DH 、DX 、DI 、 SI 、BP 、SP 、IP 、CS 、DS 、ES 、SS 、FL §3.8.1 指定记忆体位址 许多 Soft-ICE 的指令要求以记忆体位址当参数。一个记忆体位址是由两个 16 位元的字组中间以分号 (:) 分隔而组成的。第一个字组表示节段位址 (segment address) 而第二个字组表示差距位址 (offset segment) 。 公用符号可以在所有 Soft-ICE 指令中用来取代位址。公用符号必需先由 Soft-ICE 的程式载入器 (LDR.EXE) 载入。参阅第七章以取得使用公用符号的完 整说明。 Soft-ICE 运算式的运算器接受一些特殊字元和位址的使用。这些字元是: $ --- 现在 CS:IP 所指的位址 @位址 --- 间接双字组 .number --- 原始程式码行号 当你要输入目前指令指标的位址时,可以用 $ 代替 CS:IP 。 使用 @ 可以让你参考到位址所指处的双字组。你可以使用多层的 @ 。 如果用 . 来代表位址,它是用来代表原程式码中的行号,而非实际的位址。 这只有在原始程式码有载入的情形下才能使用。这种情况下,位址是以 10 进位 表示。 例如: U.1234 --- 从原始程式码第 1234 行开始反组译 U $-10 --- 从目前指令指标所指处向前 10 byte 开始反组译 G @SS:SP --- 假如你目前正在第一个中断程序,下这个指令会在堆叠的 返回位址设个暂时中断点并跳过此中断程序。 §3.9 功能键 功能键可以代替一串 Soft-ICE 中之指令。功能键可以由命令行设定或从 S-ICE.DAT 中定义。 Soft-ICE 磁片上原来的 S-ICE.DAT 已经对 12 个功能键有设定。你可以在任 何时候改变任何一个设定。个键定义如下表所示。这样设计是为了方便微软的 CodeView 的使用者。 F1 --- 显示一般辅助画面 ( H; ) F2 --- 在暂存器窗中切换 ( ^WR; ) F3 --- 改变目前原始码的模式 ( ^SRC; ) F4 --- 回复视窗 ( ^RS; ) F5 --- 回到原程式 ( ^X; ) F6 --- 在命令窗中和程式码窗中切换 ( ^EC; ) F7 --- 执行到游标所在那行 ( ^HERE; ) F8 --- 单步执行 ( ^T; ) F9 --- 在游标所在那行设中断点 ( ^BPX; ) F10 --- 单步执行 ( ^P; ) F11 --- 执行到返回位址 ( ^G @SS:SP; ) F12 --- 显示 Soft-ICE 的版别 ( ^VER; ) 指令前的 ^ 会让这个指令不显示出来。指令後的 ; 则代表按下 Enter 。输入 FKEY 的指令可以显示目前功能键所代表的意义。要使用功能键直接按下功能键即可 ,不需再键入指令。要自定功能键,参阅 §5.8 FKEY 指令的解说或第六章有关 在 S-ICE.DAT 设定功能键的部份。 §3.10 辅助 利用辅助的指令可以得到有关指令的简单解说、语法和使用例子。要得到辅助 的资讯,键入: ? 或 H --- 显示所有指令和运算子的简短解说 ? 指令 或 H 指令 --- 显示关於指令语法和例子更详细的资讯 ? 运算式 或 H 运算式 --- 把运算式的结果以 16 、10 进位及 ASCII 码 显示出来 §3.11 课程 (好多喔....偷懒一下,跳过去吧!) ┌------------------┐ │ 第 二 节 指 令 │ └------------------┘ 第二节包括每个指令的语法、解释及范例。所有的数字均以 16 进位表示。使 用到 + - * / 或暂存器的数字均可视为运算式。所有的指令都不区分大小写。指令 语法叙述中的斜体字需以真实的值代替而不是打入斜体字。 以下是本节中所使用的代号: [ ] --- 语法中非必用的部份 < > --- 可选用的部份 X|Y --- 使用 X 或 Y ( X Y 择一使用 ) count --- count 指定中断点条件要成立几次才会真正引发中断。如果没 有设定,内定值是 1 。每次引发中断而叫出 Soft-ICE 的视窗 後,记数器自动回复为原先指定值。 verb --- 指定在什麽状况下中断点会做用。R 代表读取;W 代表写入; RW 代表读取及写入;X 代表执行。 address --- 位址。由两个 16 位元之字组以冒号分隔而组成。第一个字组 代表区段位址,第二个字组代表差距位址。位址可以由符号或 暂存器构成,也可以包括 $ 、. 、@ 等特殊符号。参阅 §3.8 以取得更多资讯。 break-number --- 中断点号码是在你修改中断点(即编辑、删除、重新启动 、暂停作用)时使用的。它是用来代表各中断点的代码。 中断点号码是由 0 到 F 。 list --- 一串由逗号或空白分隔的中断点号码。 mask --- 由 1 、0 、X 所构成的位元遮罩。X 代表不处理的位元。 例如: BPIO 21W EQ M 1XXX XXXX 如果 21 埠被写入且造成其高位元被设定则会引发中断。 第 四 章 如何使用中断点指令 §4.1 序言 Soft-ICE 具有以往只有硬体除错器才具有的中断点能力。因为 80386 晶片的 威力和弹性,使我们不需要额外的硬体设备就能有更强大的中断点能力。 中断点的触发可以由记忆体某位址的读取、记忆体范围的读取、程式的执行及 埠的存取来达成。Soft-ICE 赋与每个中断点一个一位的 16 进位号码( 0 - F ) 。这个中断点号码是当你对中断点做删除、中止、启动、编辑等动作时使用。 Soft-ICE 的所有中断点都是 "sticky" 。这个意思是这些中断点在启动後不会 自动消失。你必需以 BC 或 BD 指令来消除或关闭它。Soft-ICE 一次可以处理 16 个中断点。同种形态的中断点最多可以有 10 个。但记忆体位址的中断点 ( BPM ) 因 80386 处理器之暂存器的缘故,最多只能设 4 个。 中断点可以设个计数参数。计数参数是中断点真正触发作用前被忽略的次数。 §4.2 设置中断点 指令: BPM BPMB BPMW BPMD --- 在记忆体位址被存取或执行时引发中断 BPR --- 对记忆体范围设置中断点 BPIO --- 对 I/O 埠存取时触发中断 BPINT --- 呼叫插断时触发中断 BPX --- 设置 / 清除 执行中断点 CSIP --- CS:IP 范围的检定判断 BPAND --- 等待复合中断点的发生 BPM BPMB BPMW BPMD --- 在记忆体位址被存取或执行时引发中断 语法: BPM [size] address [verb] [qualifier value] [C=count] size --- B 、W 、D B -- byte 位元组 W -- word 字组 D -- Double word 双字组 size 是指中断点所涵盖的范围。举例来说,如果使用的是双字组 ,而其第三个位元组被改变了,就会引发中断。如果有指定判断资 格 (qualifier) ,size 也是很重要的。 verb --- R 、W 、RW 或 X qualifier --- EQ 、NE 、GT 、LT 、M EQ -- 相等 NE -- 不等 GT -- 大於 LT -- 小於 M -- 遮罩 qualifier 只有在读写中断点才有用到。 value --- 由中断点大小决定是位元组、字组或双字组的值 解说: BPM 指令会在记忆体读、写或执行时引发中断。 verb 内定值为 RW ; size 内定值为 byte 。 除了 X 外的 verb 值会使程式执行引发中断的那段程式码。CS:IP 所指的是 引发中断的後一行程式码。如果 verb 值是 X ,CS:IP 所指的是中断点设置的位 置。 如果设定的是 R ,当记忆体位址被读取或做没有改变的写入时,将引发中断。 如果设定的是 R 、W 、RW 时,指定的位址被执行时并不会引发中断。 〔注〕如果使用 BPMW ,指定的位址必需由字组边界开始。如果使用 BPMD , 指定的位址必需指向一个双字组边界。 〔例〕 BPM 1234:SI W EQ 10 C=3 这道指令设定一个位元组的记忆体存取中断点。当 10H 第三次写入 1234:SI 时将启动中断点。 〔例〕 BPM CS:1235 X 这道指令设定一个执行中断点。当 CS:1235 的程式码被执行时将引发中断 。此时 CS:IP 所指的就是中断点设定位址。 〔例〕 BPMW DS:F00 W EQ M 0XXX XXXX XXXX XXX1 这道指令设定一个字组的记忆体写入中断点。当 DS:F00 被写入一个高位 元为 0 ,低位元为 1 (其它位元不考虑)的资料时,将引发中断。 〔例〕 BPM DS:1000 W GT 5 这道指令设定一个位元组的记忆体写入中断点。当 DS:1000 被写入一个大 於 5 的值时,将引发中断。 BPR --- 对记忆体范围设置中断点 语法: BPR start-adderss end-address [verb] [C=count] start-address 、end-address --- 界定范围的开始及结束位址 verb --- R 、W 、RW 、T 或 TW 解说: BPM 指令让你对一段记忆体范围设中断点。 除了 T 和 TW 外的 verb 值均会执行引发中断的程式码。CS:IP 将指向引发 中断的下一段程式码。 你不能设定执行的范围中断点。如果想做到执行的范围中断点必需使用 R 。 程式码的引出被视为是对范围中断点的读取。 如果未指定 verb ,内定值是 W 。 在某些状况下,设置范围中断点会降低系统的性能。Soft-ICE 将会分析所有 对包括范围中断点的 4K 记忆体的读写动作。性能的降低通常无法察觉,但也可 能有严重降低的例外。 verb 值使用 T 或 TW 将在指定范围内可以做回溯追踪 (back trace) 。它 们并不会真正引发中断而只是记录下程式码的资料。这个资料可以用 SHOW 或 TRACE 指令显示出来。参阅第九章以取得更多有关回溯追踪的资讯。 〔例〕 BPR B000:0 B000:1000 W 这道指令定义一个记忆体范围的中断点。任何对单色影像记忆体的写入均 会引发中断。 BPIO --- 对 I/O 埠存取时触发中断 语法: BPIO port [verb] [qualifier value] [C=count] port --- 一个位元组或字组形态的值 verb --- R 、W 或 RW 。 R -- read ( IN ) W -- write ( OUT ) qualifier -- EQ 、NE 、GT 、LT 、M EQ -- 相等 NE -- 不等 GT -- 大於 LT -- 小於 M -- 遮罩 value -- 一个位元组或字组形态的值 解说: BPIO 指令会在 I/O 埠读写时引发中断。 如果有指定 value 值,它将被拿来和引发中断的 IN 、OUT 程式码所读/写 的真正资料值做比较。value 可以是一个位元组或字组。如果是对一个位元组的 埠做 I/O ,则是使用较低的 8 位元来做比较。 CS:IP 将会指向引发中断之程式码的後一段程式码。 如未指定 verb ,内定值是 RW 。 〔例〕 BPIO 21 W NE FF 这道指令定义一个 I/O 埠存取中断点。如果一号中断控制器的遮罩暂存器 被写入除了 FFh 之外的值,将会引发中断。 〔例〕 BPIO 3FE R EQ M 11XX XXXX 这道指令定义一个位元组的 I/O 埠读取中断点。如果 3FEh I/O 埠被读取 ,且这个值的二高位元是 1 时,将会引发中断。其它位元可以是任意值。 BPINT --- 呼叫插断时触发中断 语法: BPINT INT-NUMBER [ < AL | AH | AX > = value] [C=count] int-number --- 由 0 到 FFh 的插断号码 value --- 一个位元组或字组的值 解说: BPINT 指令可以在呼叫硬体插断或软体插断时引发中断。藉由指定 AX 暂存 器之值可以轻易分离指定的 DOS 或 BIOS 呼叫。 如果没有指定 value 值,在呼叫指定的插断向量时将引发中断。这个插断可 以是硬体插断、软体插断或内部插断。 选定的 value 值当插断发生时将和指定的暂存器比较 (AH 、AL 或 AX) 。 如果其值和指定的暂存器值相同时,将引发中断。 中断点引发时,如果是硬体插断,CS:IP 将指向此插断程序的第一段程式码 。使用 INT? 指令可以得知此插断呼叫发生时执行到哪里。如果是软体插断,则 CS:IP 将指向呼叫此插断的程式码。 〔例〕 BPINT 21 AH=4C 这道指令定义一个 21h 插断的中断点。当 DOS 4Ch 函式(结束程式)被 呼叫时将引发中断。 BPX --- 设置 / 清除 执行中断点 语法: BPX [address] [C=count] 解说: BPX 指令让你在原始程式中 设置/清除 执行中断点。如果游标在程式码窗中 ,则不需要输入位址,执行中断点将设置在目前游标所在位址。如果目前游标所 在位址已经设置一个执行中断点,则将清除此中断点。 如果程式码窗是不可见的或游标未在其中,则必!指定位址。如果只有指定差 距位址,目前的 CS 值会被当做节段位址。 〔注〕除非中断点的位置在 ROM 中,不然 BPX 均使用 INT 3 的方式设置中断点 。用这样来取代中断点暂存器是为了能设置更多的中断点。如果你的处境 因某些原因必需使用中断点暂存器(例如说程式码未载入),你可以用 BPM 指令设置执行中断点。 〔例〕 BPX .1234 这道指令将在原始程式第 1234 行设置中断点。 CSIP --- CS:IP 范围的检定判断 语法: CSIP [OFF | [NOT] start-address end-address] NOT --- 如果使用 NOT ,只有当 CS:IP 所指超出范围,才会引发中断。 OFF --- 停止对 CS:IP 的检定。 解说: CSIP 指令会使中断点的成立条件由指令指标所指位址而定。这个功能在你怀 疑程式会突然修改其范围之外的程式码时特别有用。 当中断点条件成立时,CS:IP 暂存器会被拿来和指定的范围做比较。当其在 范围内时会引发中断。要在 CS:IP 指在范围外时引发中断,则需要用 NOT 参数。 如果没有加参数则会显示目前 CSIP 的范围。 〔例〕 CSIP NOT F000:0 FFFF:0 这个指令只有在中断点条件成立且 CS:IP 并未指向 ROM BIOS 时才会引发 中断。 BPAND --- 等待复合中断点的发生 语法: BPAND list | * | OFF list --- 一串由逗号或空白分开的中断点号码。 * --- 复合所有的中断点。 解说: BPAND 指令会对二或多个中断点做逻辑的 AND 运算。只有当所有的中断点条 件均成立时才会真正引发中断。 有些情况下你会希望在许多不同条件均成立下才引发中断。BPAND 指令让你 指定二或多个在中断发生前必需成立的中断点。这个功能让你可以设置更复杂的 中断点条件。 每次使用 BPAND 指令均会把指定的中断点号码加入名单中,直到使用 BPAND OFF 指令为止。 你可以用 BL 指令列出中断点以察看哪些中断点号码被复合在一起。被复合 在一起的中断点其中断点号码後会有个 & 。 一旦中断点被复合後,除非此中断点被清除或 BPAND 被关闭才会中止。 〔例〕 BPAND 0,2,3 这道指令将复合 0 号、2 号、3 号中断点。只有当三个的条件均成立时才 会引发中断。例如:如果 2 号 和 3 号的条件均成立一次以上,但 0 号的条 件尚未成立,则只有当 0 号的条件成立时才会引发中断。 §4.3 处理中断点 Soft-ICE 提供许多指令来处理中断点。处理类的指令可以用来列出、修改、删 除、启动和中止中断点。中断点是以由 0h 到 Fh 的中断点号码来识别的。处理中 断点的指令有: BD --- 中止中断点 BE --- 启动中断点 BL --- 列出中断点 BPE --- 编辑中断点 BPT --- 把中断点当样板 BC --- 清除中断点 BD --- 中止中断点 语法: BD list | * list --- 一串由逗号或空白分开的中断点号码。 * --- 中止所有中断点。 解说: BD 指令是用来暂时中止中断点的活动的。中断点可用 BE 指令(启动中断点 )重新启动。 你可以用 BL 指令列出中断点以察看哪些中断点被中止了。被中止的中断点 其中断点号码後会有一个 * 。 〔例〕 BD 1,3 这道指令会暂时中止 1 号和 3 号中断点。 BE --- 启动中断点 语法: BE list | * list --- 一串由逗号或空白分开的中断点号码。 * --- 启动所有中断点。 解说: BE 指令是用来重新启动被 BD 指令中止的中断点。当中断点第一次定义时将 会自动启动。 〔例〕 BE 3 这道指令会启动 3 号中断点。 BL --- 列出中断点 语法: BL 解说: BL 指令会显示所有目前设定的中断点。BL 指令会列出每个中断点的中断点 号码、中断点条件、中断点状态和计数。 中断点的状态分为启动和中止。中止的中断点其中断点号码後会有个 * 。在 BPAND 指令中使用到的启动的中断点其中断点号码後面会有个 & 。最後一个引发 中断的中断点会以高亮度显示。 BL 指令没有参数。 〔例〕 BL 这道指令会显示所有定义的中断点。以下列出一个 4 个中断点的例子: 0) BPMB 1234:0000 W EQ 0010 C=03 1) BPR B000:0000 B000:1000 W C=01 2) BPIO 00021 W NE OOFF C=01 3) BPINT 21 AH=4C C=01 BPE --- 编辑中断点 语法: BPE break-number 解说: BPE 指令会把中断点的叙述放到编辑行以供修改。然後你可以用编辑键重新 编辑,按 Enter 重新输入。这个指令让你可以快速修改原有中断点的参数。 〔例〕 BPE 1 这道指令会把 1 号中断点的叙述搬到编辑行并清除原 1 号中断点。按 Enter 可以把这个中断点重新输入。 BPT --- 把中断点当样板 语法: BPT break-number 解说: BPT 指令会把已存在的中断点叙述拿来当新中断点的样板。 原存在的中断点叙述会被放到编辑行去。中断点号码所指的中断点并没有任 何改变。这个指令让你可以快速的设置和原中断点相似的新中断点。 〔例〕 BPT 3 这道指令会把 3 号中断点的样板放入编辑行。当你按下 Enter 後会增加 一个新中断点。 BC --- 清除中断 语法: BC list | * list --- 一串由逗号或空白分开的中断点号码。 * --- 启动所有中断点。 解说: BC 指令是用来永远清除一个或多个中断点的。 〔例〕 BC * 这道指令会清除所有的中断点。 第 五 章 使用其它指令 §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 视窗。 §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 搬移 <mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>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 位元组的记忆体区块之值。 § 5.6 特别的除错指令 指令: SHOW --- 显示在 history buffer 中之程式码 TRACE --- 进入模拟追踪模式 (trace simulation) XT --- 在模拟追踪模式中进行单步执行 XP --- 在模拟追踪模式中进行程式单步 XG --- 在模拟追踪模式中执行到某位址 XRSET --- 重设回溯追踪缓冲区 (back trace buffer) VECS --- 储存/还原/比较插断向量 SNAP --- 拍下记忆体区段的快照 EMMMAP --- 显示 EMM 分配图 SHOW --- 显示在 history buffer 中之程式码 语法: SHOW [B | start] B --- 这会使 SHOW 指令从缓冲区中最早的程式码开始显示。 start --- 从缓冲区中最後一个程式码(最後抓入之程式码)之前多少程式 码开始显示。 解说: SHOW 指令会显示在回溯追踪缓冲区中之程式码。如果有程式码之原始码,会 以混合的方式显示;否则只显示程式码。 SHOW 指令可以用上、下、PageUp 、PageDown 等键来卷动。按 Esc 键以离 开 SHOW 指令。 在每道程式码位址之前有个缓冲区记入号码。这个号码表示你多深入显示缓 冲区。号码越高表示你在缓冲区中更深的地方。 〔注〕在使用 SHOW 指令之前必需先用范围回溯追踪记录程式码。参阅第九章以 取得更多有关范围回溯追踪的资讯。 〔建议〕把程式码窗设为可见并在其中显示目前回溯追踪缓冲区之真正程式码区 段是很有用的。以此比较程式码和真正之流程时较不会为跳跃和呼叫困 扰。 在 TRACE 指令後接著使用 SHOW 指令可以让你用两种不同的观点来看在回溯 追踪缓冲区中之程式码。 〔例〕 SHOW 40 这道指令会从回溯追踪缓冲区倒数第 40 个程式码开始显示。 TRACE --- 进入模拟追踪模式 (trace simulation) 语法: TRACE [start] | [OFF] start --- 从缓冲区中最後一个程式码(最後抓入之程式码)之前多少程式 码开始模拟追踪。 OFF --- 离开模拟追踪模式。 解说: TRACE 指令让你可以把回溯追踪缓冲区中之程式码以宛如第一次执行之情形 再重播一次。你必需把程式码窗设为可见才能使用模拟追踪模式。进入模拟追踪 模式後,你可以使用 XT 、XP 和 XG 指令来追踪缓冲区中之程式码。 输入 TRACE OFF 以离开模拟追踪模式。 未加参数的 TRACE 指令会显示目前模拟追踪模式是 ON 或 OFF 。 〔注〕在使用 TRACE 指令之前必需先用范围回溯追踪记录程式码。参阅第九章以 取得更多有关范围回溯追踪的资讯。 〔建议〕在程式码窗设为可见之状态下模拟追踪模式可发挥最大功能。把 TRACE 指令和 SHOW 指令连接使用是很有用的。这会同时以两种不同的型式显 示回溯追踪缓冲区中之程式码。 〔例〕 TRACE 40 这道指令会从回溯追踪缓冲区倒数第 40 个程式码开始进入模拟追踪模式 。在输入 TRACE OFF 指令之前会一直留在模拟追踪模式。 XT --- 在模拟追踪模式中进行单步执行 语法: XT [R] R --- 反向进行单步执行。 解说: XT 指令会单步执行在回溯追踪缓冲区中之程式码。这个指令的行为类似普通 除错中之 T 。要注意的是在模拟追踪模式中单步执行不会改变除了 CS 、IP 外 之暂存器的值。 XT 指令让你可以重播回溯追踪缓冲区中之程式码。 〔注〕在使用 XT 指令之前必需先进入模拟追踪模式。参阅第九章及 TRACE 指令 以取得更多有关范围回溯追踪的资讯。 〔建议〕如果你常常使用 XT 指令,它可以像其它指令一样设个功能键代替。 〔例〕 XT 这道指令会在模拟追踪模式中单步执行一道程式码。 XP --- 在模拟追踪模式中进行程式单步 语法: XP 解说: XP 指令会在回溯追踪缓冲区中进行一程式单步。这个指令的行为类似普通除 错中之 T 。要注意的是除了 CS 、IP 外之暂存器的值均不会改变。 XP 指令让你可以重播回溯追踪缓冲区中之程式码。 〔注〕在使用 XP 指令之前必需先进入模拟追踪模式。参阅第九章及 TRACE 指令 以取得更多有关范围回溯追踪的资讯。 〔建议〕如果你常常使用 XP 指令,它可以像其它指令一样设个功能键代替。 〔例〕 XP 这道指令会在模拟追踪模式中程式单步一道程式码。 XG --- 在模拟追踪模式中执行到某位址 语法: XG [R] address R --- 反向搜寻位址。 address --- 回溯追踪缓冲区中欲执行到之位址。 解说: XG 指令会把程式码指标移到回溯追踪缓冲区中指定之位址的下一道程式码。 如果在位址之前有加 R 的话会把程式码指标移到指定位址的前一道程式码。 address 必需是一道程式码叙述的第一位元组。 XG 指令的行为类似普通除错中之 G 。 〔注〕在使用 XG 指令之前必需先进入模拟追踪模式。参阅第九章及 TRACE 指令 以取得更多有关范围回溯追踪的资讯。 〔例〕 XG 273:1030 这道指令会把程式码指标移到位址 273:1030 的後一道指令。 XRSET --- 重设回溯追踪缓冲区 (back trace buffer) 语法: XRSET 解说: XRSET 指令会重设回溯追踪缓冲区。如果在回溯追踪缓冲区中有你不想要的 程式码时,在设定回溯范围时要先执行这个指令。 〔例〕 SRSET 这道指令会重设回溯追踪缓冲区。 VECS --- 储存/还原/比较插断向量 语法: VECS [C|S|R] C --- 比较目前的插断向量表和储存起来之表。 S --- 储存目前插断向量表。 R --- 由缓冲区中还原插断向量表。 解说: VECS 指令允许你把插断向量表储存到 Soft-ICE 中之内建缓冲区或还原之。 你也可以比较真正的插断向量表和储存起来之表并显示出两者间不同之处 使用 C 指令比较目前的插断向量表和储存之向量表时,会以下列格式显示: address old-vector new-vector 每个有改变的插断向量均会显示出来。 载入 Soft-ICE 时之插断向量表会被储存起来。当程式以 LDR.EXE 载入时也 会自动储存向量表。只有一份插断向量表会被储存,所以每次执行 VECS S 时上 一份备份的插断向量表会被覆写掉。 如果没有加参数则会显示整个插断向量表。 〔例〕 VECS C 这道指令会比较真正的插断向量表和上次储存在 Soft-ICE 内建缓冲区中 之插断向量表。 SNAP --- 拍下记忆体区段的快照 语法: SNAP [C | S | R] address1 address2 C --- 比较缓冲区和记忆体范围。 S --- 把记忆体范围存到缓冲区中。 R --- 从缓冲区还原记忆体范围。 解说: SNAP 指令会拍下记忆体区段的快照以供稍後的比较用。用 S 参数会把一记 忆体范围备份到延伸记忆体中之缓冲区里。使用 C 参数会显示延伸记忆体中缓冲 区和指定的位址范围之真实记忆体间不同之处。加上 R 参数则会把延伸记忆体中 之缓冲区拷贝到主记忆体中之位址范围。 如果使用 C 参数来比较缓冲区和位址范围,则会以下列格式输出: address old-data new-data 每一改变的位元组都会显示出来。 使用 C 和 R 指令时通常不需加 address 。如果没有指定 address ,则会 使用最後一次有加 address 之 SNAP 指令的 address 。 〔注〕要使用 SNAP 指令你必需在 CONFIG.SYS 中 S-ICE.EXE 那行加上 /TRA XXXX 参数。 SNAP 指令会把资料储存到回溯追踪缓冲区中。如果你正在使用回溯追踪则会 和 SNAP 起冲突。如果你在回溯追踪缓冲区中有程式码资料时使用 SNAP S 指令 会把回溯追踪资讯覆写掉。反过来说,如果你用 SNAP 指令储存一区段然後又打 开范围回溯追踪则会覆写掉 SNAP 的缓冲区。 〔例〕 SNAP S 2000:0 4000:0 这道指令会把从 2000:0 到 4000:0 的资料区段存到 Soft-ICE 的回溯追 踪缓冲区。 EMMMAP --- 显示 EMM 分配图 语法: EMMMAP 解说: EMMMAP 指令会显示 EMM 记忆体中每一个可取得的 page 及目前映射到的 page 。 〔注〕你必需启动 Soft-ICE 的 EMM 特性才能使用这个功能。参阅第八章以 取得更多有关启动 EMM 能力的资讯。 〔例〕 EMMMAP 这会以下列的格式显示目前 EMM 的分配情形: Phy Page Seg addres Handle/Page 00 D000 FFFF 01 D400 0001/0000 02 D800 0001/0001 03 DC00 0001/0002 在这个范例中,page 0 是在 D000 且没有映射。pgae 1 是在 D400 , handle 是 1 且 page 0 映射到此。page 2 是在 D800 ,handle 是 1 且 page 1 映射到此。page 3 是在 DC00 ,handle 是 1 且 page 2 映射到此。 §5.7 视窗指令 指令: WR --- 切换暂存器窗 WC --- 切换/设定程式码窗之大小 WD --- 切换/设定资料窗之大小 EC --- 进入/离开程式码窗 . --- 定位目前的程式码 Soft-ICE 有三种视窗:暂存器窗、资料窗和程式码窗。这些视窗都可以随时切 换出来或关闭。资料和程式码窗可以改变其大小;暂存器窗的大小是固定的。视窗 的顺序总是固定不变。从萤幕顶端由上而下依次是暂存器窗、资料窗、程式码窗。 WR --- 切换暂存器窗 语法: WR 解说: 如果暂存器窗目前是不可见的则这个指令会把它切为可见。若暂存器窗目前 是可见的,WR 指令会关闭暂存器窗。 暂存器窗会显示 8086 暂存器及各旗号之值。 内定的功能键: F2 WC --- 切换/设定程式码窗之大小 语法: WC [window-size] window-size --- 1 到 21 间的十进位数。 解说: 如果没有指定 window-size ,这个指令会切换程式码窗。如果程式码窗是不 可见的会把它切为可见;若是可见的则会关闭之。 如果有指定 window-size ,则程式码窗会重设大小。如果程式码窗本来是不 可见的则会以指定的大小显示。 〔注〕如果你想把游标移到程式码窗中要使用 EC 指令。参阅 EC 指令的解说以 取得更多资讯。 〔例〕 WC 12 如果程式码窗是不可见的则会显示一个 12 行大小的程式码窗。如果程式 码窗目前在萤幕上,它的大小会重设为 12 行。 WD --- 切换/设定资料窗之大小 语法: WD [window-size] window-size --- 1 到 21 间的十进位数。 解说: 如果没有指定 window-size ,这个指令会切换资料窗。如果资料窗是不 可见的会把它切为可见;若是可见的则会关闭之。 如果有指定 window-size ,则资料窗会重设大小。如果资料窗本来是不 可见的则会以指定的大小显示。 〔例〕 WD 1 如果资料窗是不可见的则会显示一个 1 行大小的资料窗。如果资料窗 目前在萤幕上,它的大小会重设为 12 行。 EC --- 进入/离开程式码窗 语法: EC 解说: EC 指令会使游标在程式码窗和指令窗中切换。如果游标在指令窗中,它会被 移到程式码窗中。如果游标在程式码窗中,它会被移到指令窗中。 当游标在程式码窗时,会有更多可用的功能,这使得除错更为容易。这些功 能是: * Point-and-shoot break points Point-and-shoot break points 是用 BPX 指令设置的。如果没有加参数 ,会在目前游标所在位置设置中断点。游标所在那行必须包含程式码。( 如果你不确定,把程式码窗以混合的模式开著) 内定 BPX 的功能键是 F9 。 * Go to cursor line 你可以在游标所在位置设个暂时中断点,用 HERE 指令执行到那里。游标 所在那行必须包含程式码。(如果你不确定,把程式码窗以混合的模式开 著) 内定 BPX 的功能键是 F7 。 * Scrolling the code window 只有当游标在程式码窗中时才能卷动程式码窗。卷动的按键在程式码窗中 有不同的定义。 UP --- 把程式码窗向上卷一行。 DOWN --- 把程式码窗向下卷一行。 PageUp --- 把程式码窗向上卷一页。 PageDown --- 把程式码窗向下卷一页。 〔注〕 程式码窗必须是可见的 EC 指令才能使用。 . --- 定位目前的程式码 语法: . 解说: 当程式码窗是可见的时候,"." 指令会显示目前的程式码。 § 5.8 除错器设定指令 指令: PAUSE --- 显示满一个萤幕後暂停 ALTKEY --- 设定 Soft-ICE 的启动热键 FKEY --- 显示、修改功能键 BASE --- 设定/显示目前的基数 CTRL-P --- 把 LOG 送到印表机 Print-Screen --- 印出目前萤幕 PRN --- 设定印表机的输出埠 PAUSE --- 显示满一个萤幕後暂停 语法: PAUSE [ON | OFF] 解说: PAUSE 指令会在每一页的结束时暂停萤幕。如果 PAUSE 设为 ON,Soft-ICE 会提示你按任意键以继续卷动视窗,提示讯息会显示在萤幕底部的状态行里。 如果没有指定任何参数则会显示目前 PAUSE 的状态。 PAUESE 的内定值是 ON。 〔例〕 PAUSE ON 这个指令指定接下来萤幕上的显示会等你输入任意键後才继续卷动。 ALTKEY --- 设定 Soft-ICE 的启动热键 语法: ALTKEY [ALTletter] | [CTRLletter] | [SYSREQ] letter --- 任何一字母 (A - Z) 解说: ALTKEY 指令可以让你改变用来叫出 Soft-ICE 的热键。你可以把热键改成 CTRL + 字母、ALT + 字母或是 SysRq (即 PrtScr) 键。 有时候你或许会使用会和 Soft-ICE 的 Ctrl-D 热键相冲突的程式,避免这 种冲突的方法之一是使用 ALTKEY 指令改变叫出 Soft-ICE 的热键。另一个方法 则是在热键组合中多按个 SHIFT 键,Soft-ICE 对这样的组合不会有反应,所以 能把热键传到你的程式去。举例来说,如果你使用的常驻程式是以 Ctrl-D 叫出 来的,试著用 Ctrl-Shift-D 来叫出你的程式。有些键盘上你必须按 Alt-PrtScr 来模拟发出个 System Request。小心不要意外的把萤幕上的东西印了出来。 如果没有指定参数则会显示目前的热键。 内定的热键是 Ctrl-D。 〔例〕 ALTKEY ALT Z 这道指令指定 Ctrl-Z 是叫出 Soft-ICE 的热键。 FKEY --- 显示、修改功能键 语法: FKEY [function-key-name string] function-key-name --- F1, F2...... F12 string --- string 包含任何 Soft-ICE 的指令和特殊字元:^ 及 ;。^ 是 用来让指令不显示出来,; 则代表按下 ENTER。 解说: FKEY 指令是用来指定某功能键所代表的指令字串,功能键可设定来代表任何 Soft-ICE 中的指令。 如果没有指定参数则会显示目前各功能键代表的指令。 要取消某个功能键可以用这样的方法:FKEY 加 function-key-name,然後接 上一个空白字串。 你也可以在设定档 S-ICE.DAT 中预先指定功能键的功能。参阅 §6.4 以 取的更多有关在设定档中设定功能键的资讯。 在功能键设定字串中加上归位键的符号可以让一个功能键代表一系列的指令 指令。归位键是用 ; 来表示。 如果你在功能键的设定前面加上 ^ (Shift-6),则接下来的指令将不会显示 出来。指令的作用还是一样没变,但是显示在指令窗中的所有讯息 (包括错误讯 息) 都不会再出现。这个模式在指令会改变视窗中资料而你又不想因此造成指令 窗中的混乱时特别有用。 当功能键有加上 ^ 设定时,你可以在键入其他指令的途中使用这个功能键而 不会对输入中的指令造成任何影响。例如,如果你使用的是 F2 的内定值,你可 以在输入你下一个指令的时候按 F2 来切换暂存器窗。 〔注〕Soft-ICE 有个 S-ICE.DAT 的设定档,你可以把功能键的设定写在这个档 案中,这样在载入 Soft-ICE 的时候会自动设定功能键。在设定档中设定 功能键的语法是: function-key-name = "string" 。在设定档中设定功 能键的时候要用双引号把字串括起来。 〔例〕 FKEY F2 ^WR; (command line) 这道指令用来设定 F2 代表切换暂存器窗的指令, ^ 代表这个指令不会显 示出来, ; 代表按下 Enter。如此 F2 键就可以用来切换暂存器窗的 on 或 off,而且即使是在输入其他指令的时候也可以随时使用。 〔例〕 FKEY F1 "G CS:120; R; G CS:" (command line) 这个例子显示你可以用一个功能键代表许多指令,也可以代表一个指令的 一部份,等待使用者的输入来完成它。输入这道指令後,按下 F1 键会执 行到 CS:120 处,显示目前的暂存器之值,然後显示 G 指令等待使用者的 输入。 〔例〕 FKEY F1 WD 3;D DS:100; (command line) 这个例子会设定 F1 键代表一串指令。这个按键是可见的,而且以 Enter 结束。它会把资料窗设为三行的大小并显示从 DS:100 处起的的资料。 〔例〕 F1 = "WR;WD 2; WC 10;" (S-ICE.DAT) 如果这一行是放在 S-ICE.DAT 中,当载入 Soft-ICE 时会自动设定 F1 键 。当在 Soft-ICE 中按下 F1 键时,它会切换暂存器窗,打开一个二行的 资料窗,及一个十行的程式码窗。参阅第六章以取得更多有关在 S-ICE.DAT 设定功能键的资讯。 BASE --- 设定/显示目前的基数 语法: BASE [10 | 16] 解说: BASE 指令是用来设定基数是以 10 或 16 为底。以 10 为底在小视窗模式中 会受到限制,这是受到视窗宽度的影响。即使是在大视窗模式中有些指令显示的 资料数目也会受限制。 当基数为 10 的时候,所有输入和显示的数字和位址都是以十进位表示。如 果基数是 16 的话,则是除了原始码行号,WIN 指令中的萤幕座标、大小以 10 进位表示外,均为 16 进位。 基数的内定值是 16。 〔例〕 BASE 16 这道指令会会把基数设为 16。 CTRL-P --- 把 LOG 送到印表机 语法: CTRL - P 解说: 在你按下 CTRL - P 後,所有显示在指令窗中的的讯息也会被送到印表机去 。要停止把 LOG 送到印表机的动作只要再按一次 CTRL - P 即可。 当你用 CTRL - P 送许多资料到印表机时,会许你会想把 PAUSE 设为 OFF, 这样资料才可以一直卷动下去而不需要去按键。 Print-Screen --- 印出目前萤幕 语法: Print-Screen 解说: 按下 Print-Screen 键後会把整个萤幕上的东西倾印印表机去。 如果你只是想印出记忆体内容或是某个指令的的辅助资料,使用 CTRL - P 会比用 Print-Screen 快得多,这是因为 Print-Screen 会把萤幕上包括边界的 每个字元都送到印表机去。 PRN --- 设定印表机的输出埠 语法: PRN [LPTx | COMx] x --- 介於 1 到 4 的数字 解说: PRN 指令允许你把 CTRL - P 和 Print-Screen 的资料送到不同的印表机去 。 如果没有指定参数则会显示目前指定的印表机。 〔例〕 PRN COM 1 这道指令会把 CTRL - P 和 Print-Screen 的输出送到 COM 1 埠去。 § 5.9 萤幕控制指令 指令: FLASH --- 执行 P 或 T 指令时还原萤幕 FLICK --- 减轻萤幕的闪烁 WATCHV --- 设定监控显示模式 RS --- 显示程式萤幕 CLS --- 清除视窗 ALTSCR --- 转换到替换萤幕 WIN --- 改变 Soft-ICE 的视窗大小 FLASH --- 执行 P 或 T 指令时还原萤幕 语法: FLASH [ON | OFF] 解说: FLASH 指令让你指定在 T 或 P 指令执行时是否要还原萤幕。如果你指定要 还原萤幕,则在 T 或 P 指令执行的时候会短暂的还原一下。在对会存取 VIDEO MEMORY 的程式片段时你会需要用到这个功能。 如果 P 指令用来执行一个 CALL 或中断,则一定会有萤幕还原的动作,因为 执行的函式中可能会对萤幕写入。 如果没有指定参数则会显示目前 FLASH 的状态。 FLASH 的内定值是 OFF。 〔例〕 FLASH ON 这道指令会把 FLASH 的状态设为 ON。执行任何 P 或 T 指令时会还原萤 幕。 FLICK --- 减轻萤幕的闪烁 语法: FLICK [ON | OFF] 解说: 有些显示卡在输出字元之前要先等垂直、水平扫描完成才行。如果任意的输 出,在显示字元时将会发生闪烁的现象。如果你使用 Soft-ICE 时萤幕会有闪烁 的现象,你应该把 FLICK 设为 ON。 有些 EGA 卡上你离开 Soft-ICE 时颜色可能没有还原的很正确,这是模拟的 EGA 显示的问题。3DA 埠是个有两个功能的显示埠。第一种是一些老旧的 CGA 软 体靠 3DA 来做 hsync 和 vsync,这样可以避免在一些老旧的 CGA 控制卡上造成 闪烁的现象。第二个功能则是用来重新设定 EGA 卡的调色盘。Soft-ICE 有个演 算法可以不用一直监控这个埠,一直监控会减慢一些认为自己在 CGA 卡上执行的 老旧程式之速度。但是在某些状况下,这套演算法可能无法使用。如果你是在 EGA 上使用 Soft-ICE 而且发现颜色并没有正确的还原的话,把 FLICK 设为 ON,这 样 Soft-ICE 会监控 3DA 埠而解决这个问题。 当 FLICK 设为 ON 时,萤幕更新的速度会变慢。 如果没有指定参数则会显示目前 FLICK 的状态。 FLICK 的内定值是 OFF。 〔例〕 FLICK ON 这道指令会把 FLICK 模式设为 ON。Soft-ICE 会等水平、垂直扫描完成後 再输出字元。 WATCHV --- 设定监控显示模式 语法: WATCHV [ON | OFF] 解说: WATCHV 指令让你指定 Soft-ICE 要如何监控显示埠。通常 Soft-ICE 只有在 执行 INT 10 切换到非文字模式後才监控显示埠。但是有些程式不用 INT 10 来 切换显示模式,这种状况下,如果 WATCHV 设为 OFF,则 Soft-ICE 在储存或还 原萤幕时可能会发生问题。把 WATCHV 设为 ON 则会让 Soft-ICE 随时监控显示 埠。 如果你发现 Soft-ICE 并未正确的处理你的萤幕,或不能正确的还原游标的 位置,把 WATCHV 设为 ON。把 WATCHV 设为 ON 可能会影响目前显示模式的效率 。 如果没有指定参数则会显示目前 WATCHV 的状态。 WATCHV 的内定值是 OFF。 〔例〕 WATCHV ON 这道指令会把 WATCHV 设为 ON。 RS --- 显示程式萤幕 语法: RS 解说: RS 指令让你暂时还原程式萤幕,Soft-ICE 视窗将消失直到你按任一键为止 。 这个功能在对经常更新萤幕的程式做除错时很有用。当 Soft-ICE 叫出来时 会回到文字模式,使用 RS 指令可以暂时回到绘图模式萤幕。 〔例〕 RS CLS --- 清除视窗 语法: CLS 解说: CLS 指令会清除 Soft-ICE 的视窗,并把提示符号及游标移到视窗的左上角 。 〔例〕 CLS ALTSCR --- 转换到替换萤幕 语法: ALTSCR [ON | OFF] 解说: ALTSCR 指令允许你把萤幕的输出从原定萤幕重新导向到替换萤幕去。这个功 能在你对绘图模式程式除错时非常有用,这样你就不用在绘图模式和 Soft-ICE 间切换来切换去。 ALTSCR 要求系统连接两台显示器。替换萤幕必须处於文字模式,这是显示器 的内定模式。 WATCHV 的内定值是 OFF。 〔例〕 ALTSCR ON 这道指令会把萤幕的输出重新导向到替换显示器上。 WIN --- 改变 Soft-ICE 的视窗大小 语法: WIN [N | W] [start-row length [start-column]] N --- 当指定 N 时,视窗会被设为较小的模式: 46 字元宽。 W --- 当指定 W 时,视窗会被设为整个萤幕的宽度。 start-row --- 0 到 17 的数字。指定视窗从哪一列开始。 length --- 8 到 25 的数字。指定视窗有几列。 start-column --- 在小视窗模式中指定视窗位置为从左边算过来第几行。 start-row 和 start-column 指定小视窗模式中视窗左上 角的位置。在大视窗模式中,start-column 会被忽略。 解说: WIN 指令可以让你修改 Soft-ICE 视窗的宽度和高度。 如果没有指定参数,这个指令会在小视窗模式和大视窗模式中切换。 如果 WIN 指令只有加上 N 或 W 参数时,则视窗的宽度会变换成指定的大小 ,但高度不变。 如果视窗的行数加上 start-row 大於 25,则视窗的 length 到萤幕底端为 止。 WIN 的内定值是小视窗模式。 〔例〕 WIN N 4 9 30 这个指令会把视窗设定为从第 4 列、第 30 行处开始显示,并且是 9 列 高、46 个字元宽。 〔例〕 WIN 这道指令会在大视窗和小视窗模式间切换。 〔例〕 WIN W 10 8 这个指令会把视窗设定为从第 10 列处开始显示,并且是 8 列高、整个萤 幕的宽度。 § 5.10 符号及原始码指令 *** 对不起.... 不会用所以不会翻..... 期待其他高人的大作.... *** </HTML>Z 是叫出 Soft-ICE 的热键。 FKEY --- 显示、修改功能键 语法: FKEY [function-key-name string] function-key-name --- F1, F2...... F12 string --- string 包含任何 Soft-ICE 的指令和特殊字元:^ 及 ;。^ 是 用来让指令不显示出来,; 则Hacker.AIX/00000024/00000006.htm 100644 023417 000143 00000010644 06446674335 015467 0 ustar 00bbsroot bbs 000000 000000 <HTML> S-ICE 指令说明 -------------------------------------------------------------------- /TRA 0000k ; 设定追踪缓冲区之大小、最小10K... /SYM 0000k ; 设定载入语法档之缓冲区大小......... /S ; 如其延伸记忆体不够才加此参数....... -------------------------------------------------------------------- BOUNDS [ON | Off ] ; BOUNDS ON ; 打开核对保护模式中断之指令......... BOUNDS OFF ; 关掉核对保护模式中断之指令......... -------------------------------------------------------------------- R 32 ; 在S-ICE视窗内分解32位元之指令...... -------------------------------------------------------------------- SHOW [B | Start] [L Length]; 增强Demp的功能可指定开始长度列印PRN B - ; 设定节段位址及节内位址至缓冲区..... Start - ; 指定开始的节段位址起点............. Length - ; 指定结束的节段位址终点............. -------------------------------------------------------------------- FILE [file-name |*] ; 指令语法档案以供参考组合码......... -------------------------------------------------------------------- TABS [2 | 4 | 8] ; 指令原始档案的控制扩充长度......... -------------------------------------------------------------------- PRN COM1 ; 指令PRN至正确的通讯埠.............. -------------------------------------------------------------------- Colors = " 4FH,4EH,7EH, 2FH,0EH,70H, 1EH,1FH,5FH, 30H,3CH,3EH" Colors = " 暂存器颜色, 资料区颜色, 程式码颜色, 指令颜色 " ; 指令 SOFT-ICE 的视窗的颜色以16进位. -------------------------------------------------------------------- 新特性 ---> 由除错程式及常驻程式设定一个中断点、硬体模拟........... Mov Ah,09h Mov AL,所须交给之函数(副程式) Mov SI,'FG' ( 4647h ) Mov DI,'JM' ( 4A4Dh ) Int 03h 其 SOFT-ICE 副函数如下: AL 副函数数值说明 10h 显示 SOFT-ICE 的重要资料至指定位址 11H 执行一个 SOFT-ICE 的指令 12H 得到一个硬体中断点的位址 13H 设定一个硬体中断点的位址 14H 清除一个硬体中断点的位址 其 SOFT-ICE 副函数定义如下: 10h 显示 SOFT-ICE 的重要资料至指定位址 引用 DS:DX 作其索引位址..... 字串索引最大可以一百个字元(0Dh)... 11H 执行一个 SOFT-ICE 的指令 引用 DS:DX 作其索引指令..... 12H 得到一个硬体中断点的位址 返回值暂存器数值定义如下: DH - 传回最後中断的向量而成过去 DL - 传回最後硬体中断的类型而成过去 BH - 传回最後中断的向量 BL - 传回最後硬体中断的类型 传回类型如下: 1 - I/O 2 - INT 3 - BPX (int 3 style BP) 4 - 保留的 5 - 定范图 13H 设定一个硬体中断点的位址 返回值暂存器数值定义如下: AX - 传回设定错误码 BX - 传回设定中断码 14H 清除一个硬体中断点的位址 输入:BX = 硬体中断号码 返回:BX = ????

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录: 本手册的功能 读者对象 本手册的组织结构 排版风格 如何使用本手册 其它相关文件 (外国人就是罗嗦,为了求全,只好随他了。) 第一章 欢迎使用SoftICE 产品概况 介绍SoftICE 介绍Symbol Loader 如何得到客户服务 联系NuMega公司的技术支持中心 第二章 安装SoftICE 介绍 硬件和软件要求 SoftICE显示选择 安装之前 安装 安装之后 配置BOOT。INI以便在多处理器系统中支持单CPU 配置SoftICE在Windows 95下正确载入 通过串行口连接第二台计算机 解决显卡问题 第三章 SoftICE教程 介绍 载入SoftICE 构造GDIDEMO样本程序 装入GDIDEMO样本程序 控制SoftICE屏幕 通过源码跟踪和逐步调试 读本地数据 设定断点和目标断点 设定一个断点 设定STICKY断点 (此处不知STICKY作何解释。待我读到此处时大概会明白) 使用SoftICE命令行信息 使用符号和符号表 设定条件断点 设置BPX断点 编辑断点 设定读写内存断点 第四章 将代码装入SoftICE 调试的概念 准备调试程序 准备调试设备驱动程序和VxDs(虚拟设备驱动程序) 手工装入SoftICE 装入SoftICE for Windows 95 装入SoftICE for Windows NT 构造带有调试信息的程序 使用Symbol Loader转换和载入文件 修改模块设定 修改通用设定 修改编译设定 修改调试设定 指定程序的源文件 删除符号表 在DOS命令行里使用Symbol Loader 使用Symbol Loader的命令行工具 NMSYM命令行的语法 使用NMSYM来转换符号信息 使用NMSYM来装入模块和符号信息 使用NMSYM来装入或导出符号表 使用NMSYM卸载符号信息 使用NMSYM来保存历史记录 关于NMSYM的信息 第五章 SoftICE导航 介绍 呼出SoftICE窗口 启动时禁用SoftICE 使用SoftICE窗口 调整窗口大小 控制窗口 拷贝和粘贴数据 用鼠标输入命令 得到帮助 使用命令窗口 滚动窗口 键入命令 重呼命令 使用运行时宏 将命令窗口的历史缓存保存到文件 相关命令 控制代码窗口 读信息 在代码窗口键入命令 使用本地窗口 控制本地窗口 扩展和分解堆栈 相关命令 使用观察窗口 控制观察窗口 设定观察表达式 读信息 扩展和分解类型表达式 相关命令 使用寄存器窗口 控制寄存器窗口 读信息 编辑寄存器和标志位 相关命令 使用数据窗口 控制数据窗口 读信息 改变内存地址和格式 编辑内存 辅助表达式 相关命令 第六章 使用SoftICE 在跟踪错误时调试多个程序 跟踪错误 Ring-3 32位保护模式(Win32程序) Ring-0 驱动代码(内核模式设备驱动程序) Ring-3 16位保护模式(16位Win程序) 地址内容 使用INT 0x41 .DOT命令 理解从R-3到R-0的转变 第七章 使用断点 第八章 ----------------------------------------------------------- (...很累人那!今天就这些了吧.因为我也是读一些翻译一些,所以有些"向前引用 "的名词术语不知道要如何解释其意义.应该读完再翻译比较好...不过那个时候我 又开学了...呜...一点时间也没有了!) 第七章 使用断点 介绍 SoftICE所支持的断点类型 断点选项 执行断点 内存断点 中断断点 I/O断点 窗口消息断点 理解断点的含义 虚断点 设置断点活动 条件断点 条件断点计数功能 在条件表达式中使用本地变量 在条件断点里引用堆栈 参考 多重断点 所用时间 断点统计 在表达式中引用断点 维护断点 使用内嵌断点 第八章 使用表达式 表达式 操作符 操作符优先级 形成表达式 表达式类型 定制类型 取得符号的数值 间接使用符号 第九章 装入系统组件符号 装入由DLL和EXE文件导出的符号表 使用未命名的入口点

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值