命令:M
功能:数据块搬移指令,用于将内存中指定区域的数据从一个地址复制到另一个地址。
语法:M source-address l length dest-address
用法说明:source-address 表示源数据起始地址,length 指定要传输的字节数,dest-address 为目标地址。例如,M ds:1000 l 2000 es:5000 表示将 2000h 个字节从 DS:1000h 复制到 ES:5000h 处。该命令简洁直观,无需复杂参数。
点评:无。
命令:MACRO
功能:定义宏,将多条 SoftICE 指令封装为一条快捷命令,提升调试效率。
语法:MACRO [ macro-name] | [*] | [= "macro body"]
用法说明:macro-name 为 3-8 个字符的宏名称(不区分大小写);macro-body 由分号分隔的多个 SoftICE 指令组成,首尾必须用冒号包裹;* 用于删除一个或所有已定义的宏;= 用于定义或重新定义宏。宏体支持命令行参数,类似 DOS 批处理中的 %1、%2,有效值为 1-8。注意:宏体首尾必须是冒号,如需使用反斜杠、双引号、百分号,需在前面加反斜杠转义,与 C 语言规则一致。宏名称不能与现有 SoftICE 内部指令重名,否则会报错。MACRO * 删除所有具名宏(断点中使用的 DO 子句是匿名宏,无法删除)。MACRO mnames * 删除名为 mnames 的宏。MACRO mnames 进入编辑模式,按 Esc 取消更改。
一个非常实用的示例:MACRO 1shot = "bpx %1 do \"bc bpindex\"" —— 可快速设置一次性断点,极大简化调试操作。
点评:宏病毒!
命令:MAP32
功能:列出当前所有 32 位模块的内存映射信息,便于分析模块加载布局。
语法:MAP32 [module-name | module-handle | address]
用法说明:不带参数时显示所有 32 位模块详情;带参数则仅显示指定模块。输出包含:Owner(模块名)、OBJ Name(区段名)、Obj#(区段号)、Address(选择符:偏移量)、Size(大小,字节)、Type(类型)。类型包括:CODE(代码段)、IDATA(已初始化数据段)、UDATA(未初始化数据段)、RO(只读段)、RW(读写段)、SHARED(共享段)。
点评:无。
命令:MAPV86
功能:显示当前虚拟机(V86)的 DOS 内存映射,用于调试 DOS 程序和实模式代码。
语法:MAPV86 [address]
用法说明:不带参数时显示整个虚拟机的内存映像;带参数(段:偏移量格式)则显示包含该地址的内存区域信息。注意:有时 DOS 虚拟机的页面未加载,会提示“PAGE NOT PRESENT”,多试一次即可正常显示。该命令与 SYMLOC 配合使用尤为有效——在 Windows 启动前加载的程序,Windows 不会自动将符号信息映射到 V86 内存,通过 MAPV86 获取其代码段地址,对齐符号表后即可进行跟踪调试。
输出项包括:VM ID(虚拟机 ID)、VM handle(32 位句柄)、CRS pointer(客户登记表指针)、VM address(32 位线性地址)。若 SoftICE 弹出时 CS:IP 恰好指向 MAPV86 的某个入口,相应行会高亮显示。
点评:无。
命令:MOD
功能:列出当前 Windows 加载的模块列表,方便查看 DLL 和 EXE 的地址信息。
语法:MOD [partial-name]
用法说明:不带参数时显示所有模块;带 partial-name(模块名称前缀)则筛选出匹配项。输出包含:module handle(16 位句柄)、base(线性基址)、pe-header(PE 文件头,格式为选择符:偏移量)、module name(模块名,由 .DEF 文件中的 NAME 或 LIBRARY 定义)、file name(完整路径)。
点评:无。
命令:O
功能:向 I/O 端口写入数据,用于直接操作硬件寄存器。
语法:O[size] port value
用法说明:size 可选 B(字节,默认)、W(字)、D(双字);port 为端口地址;value 为待输出的值。该命令会立即向硬件端口发送数据。但需注意:对 21h 和 A1h 端口(与中断控制器相关)的写入操作,需等到退出 SoftICE 窗口后才会真正生效。
点评:关于 21h 和 A1h 端口,PDF 文档描述不够详尽,实际使用中情况较为复杂。
命令:P
功能:单步执行程序,用于逐条指令或逐行源代码调试。
语法:P [ret]
用法说明:P 执行单条指令。在汇编模式下,遇到 CALL、INT、LOOP、REP 等指令时,不会跟踪进入内部,而是直接执行完毕再返回控制——即“跨过”这些指令。若加上 ret 参数,SoftICE 会持续单步执行,直到遇到返回指令(RET、RETF)为止。在源码模式下,P 执行一个源程序表达式,同样不进入子程序内部。底层实现:多数情况使用单步标志,遇到 CALL、INT、LOOP、REP 时,则在后续指令处设置一次性的 INT 3 断点。快捷键:F10 对应 P,F12 对应 P ret。
点评:F10 可能是使用频率最高的按键,请好好保护你的键盘!
