SOFT-ICE命令详解(2)
F-O
命令:F
作用:填充某一块内存区域
语法:Faddressllengthdata-list
用法:
length:字节长度
data-list:所要填的数据.可以是用单引号或双引号括起来的字符串执行F命令将向所指
定的内存区域填充length长度的数据,如果数据不够长度,将重复数据,直到达到长度为止.
点评:无
命令:FAULTS
作用:打开或关闭错误跟踪功能
语法:FAULTS[on│off]
用法:
FAULTS命令将打开或关闭SoftICE的错误跟踪功能.不加参数将显示当前的开关状态.
点评:
由于SoftICE做为一个DEBUGGER,FAULTS默认为ON,所以一旦CPU有非法指令,SoftICE就
会不停地弹出,让你知道错在哪里,实际在工作中这样的情况如果太频繁地发生,最好将其置
为OFF.我一般将其置为ON,当发生非法指令时再手工置为OFF.你也可以在中一
开始就置其为OFF.初学者一般不知道有这个命令,一旦发生非法指令,除了按R键,只有傻
站着.-(
命令:FILE
作用:显示或切换当前源文件
#语法:FILE[file-name]
用法:
FILE命令常用来辅助在源文件中没有符号表的地方下断点.用FILE命令将所需的源文件显
示在代码窗口中,用SS命令查找一下,再用BPX或F9来下断点.如果加文件名参数,则所选的
文件变成当前文件,并被显示在代码窗口中.如果没有文件名参数,则显示当前的源文件(如
果当前有的话).如果加*,则列出当前符号表中所有源文件.在WIN95中,用FILE加文件名
同时也切换内存地址内容.
点评:
一般用于高级编程工具的辅助调试,如C语言等.不过这些编程工具已经内置DEBUGGER,所以
就看个人习惯了.
命令:FKEY
作用:显示或修改当前快捷键定义
语法:FKEY[function-keystring]
用法:
function-key:快捷键:
F1-F12:
SF1-SF12:Shift键加F1-F12
CF1-CF12:Ctrl键加F1-F12
AF1-AF12:Alt键加F1-F12
string:一个或多个SoftICE的命令.
命令前加^表示在按快捷键时不显示相应的命令内容.命令后加;代表回车.FKEY后只跟
function-key,而不跟string,将取消该快捷定义.除了用FKEY命令可以定义快捷键外,用
SoftICE的LOADER也能做到这一点默认快捷键清单:
F1=h;F2=^wr;
F3=^src;F4=^rs;
F5=^x;F6=^ec;
F7=^here;F8=^t;
F9=^bpx;F10=^p;
F11=^G@SS:ESP;F12=^pret;
SF3=^format;CF8=^XT;
CF9=TRACEOFF;CF10=^XP;
CF11=SHOWB;CF12=TRACEB;
AF1=^wr;AF2=^wd;
AF3=^wc;AF4=^ww;
AF5=CLS;AF8=^XTR;
AF11=^dddataaddr->0;
AF12=^dddataaddr->4;
CF1=altscroff;lines60;wc32;wd8;
CF2=^wr;^wd;^wc;
点评:无
命令:FLASH
作用:在P和T命令执行过程中刷新Windows屏幕
语法:FLASH[on│off]
用法:
如果将FLASH置为ON,则在执行T或P命令时,SoftICE将刷新一下Windows屏幕,这在调
试一个直接对显存操作的程序时特别有用.在一般情况下,当用P命令跨过一个CALL时,而
此CALL又调用显示驱动程序时,Sof-tICE才重新刷新屏幕.FLASH命令不带参数将显示当
前状态.默认FLASHOFF.
点评:无
命令:FORMAT
作用:改变数据窗口的显示格式
语法:FORMAT
用法:
FORMAT命令用来改变数据窗口的显示格式.SoftICE有快捷键Shift-F3来代替FORMAT.显
示格式将按字节,字,双字,短实型,长实型,10字节实型循环.
点评:参见D,DATA命令.
命令:G
作用:执行到某一地址
语法:G[=start-address][break-address]
用法:
=start-address:开始地址
break-address:中断地址
G命令不带参数将从SoftICE中返回.如果带参数break-address,则SoftICE将在所指定的
地址处下一个一次性断点;如果带=start-address,SoftICE将从指定的地址处开始执行,否
则从当前CS:EIP处执行.程序中其他的断点(非G命令下的断点)照样起作用.无论是谁先弹
出,都将清除G命令所下的一次性断点.
G命令不带参数类似于X命令.G命令在Windows95中使用除错寄存器,如果除错寄存器用
完,则用INT3.
点评:由于G命令缺省用DRx,所以有时可以对付一些在INT3上作手脚的程序.
命令:GDT
作用:显示全局描述符表
语法:GDT[lector]
用法:
lector:指定GDT选择器
GDT命令将显示全局描述符表的内容.如果加选择符参数,则只显示此选择符所指的描述符.
输出:GDT的线性基址和长度将显示在输出数据的顶行.
输出数据的每一行内容的说明:
value:最低两位即描述符特权级
type:描述符类型,如下:
Code16:16位代码描述符
Data16:16位数据描述符
Code32:32位代码描述符
Data32:32位数据描述符
LDT:局部描述符表描述符
TSS32:32位任务状态段描述符
TSS16:16位任务状态段描述符
CallG32:32位调用门描述符
CallG16:16位调用门描述符
TaskG32:32位任务门描述符
TaskG16:16位任务门描述符
TrapG32:32位陷肼门描述符
TrapG16:16位陷肼门描述符
IntG32:32位中断门描述符
IntG16:16位中断门描述符
Rerved:保留的描述符
ba:描述符中的段基址
limit:描述符中的段界限
DPL:描述符特权级,0,1,2,3
prentbit:P或NP表示该段是否在内存中
gmentattributes:段特性:
RW:数据段可读写
RO:数据段只读
RE:代码段可读可执行
EO:代码段只可执行
B:TSS(任务状态段)忙置位
ED:数据扩展方式
参见LDT.
点评:
这段翻译并不完全用PDF手册上的.如"lector"原指选择符(器),用来指向描述符表中的
描述符,而PDF中type的说明全用到lector说的意思虽是一样,但和别的文献矛盾,故
认为不妥,将其翻译成descriptor即描述符.实际上可以看出,一个选择符指向一个描述符,
两者是一致的.描述符类型实际上也就是指向它的选择
符类型.
命令:GENINT
作用:强行产生一个中断
语法:GENINT[nmi│int1│int3│interrupt-number]
用法:
interrupt-number:对Windows95来说,0-5fh
GENINT强行产生一个中断,用于SoftICE和别的DEBUGGER协作的时侯,如:GENINTnmi将使
SoftICE将控制返还给CodeViewForDos.(对其他DEBUGGER,请尝试0,1,2,3)GENINT还用于
测试中断例程.但SoftICE不检测一个虚拟机安装系统 中断是否有效,它只是摹拟中断的产生,所以当用此命
令时要注意相应的中断例程是否存在.
点评:无
命令:H
作用:显示帮助信息
语法:H[command]
用法:
键入H命令不带任何参数将显示所有命令的帮助.要获得详细的帮助,在H后加命令名就
可.详细的帮助将包括命令的描述,命令的语法,和例子.
点评:
H命令可以很方便地帮助使用者查询SoftICE的命令.实际上在命令窗口的底部有一个状态
条,它提供的实时帮助也是很有用的.
命令:HBOOT
作用:系统重新启动
语法:HBOOT
用法:
HBOOT将重新启动计算机.等同于按Ctrl+Alt+Del组合键.HBOOT一般都能成功,只有特殊
情况下(某些插卡需要重加电)才用机器上的RESET或POWER键.
点评:
HBOOT让我想到两件事:
1,以前学微机时,老师老是盯着我们,唯恐我们乱启动机器.想起来真是不寒而栗,好象是我
们的过错一样.可机器明明死了嘛,不重新启动怎么行?
2,有大部分品牌机上没有RESET键,死机就按POWER键,按得老板倒抽凉气.:)
命令:HEAP
作用:显示Windows全局堆
语法:HEAP-L[free│module-name│lector]
用法:
-L:只显示含局部堆的全局堆入口
module-name:模块名.
lector:LDT选择符
HEAPFREE将显示空闲的全局堆.
HEAP跟模块名将只显示由指定的模块拥有的全局堆入口.HEAP跟LDT选择符将只显示与此
选择符相应的全局堆入口.HEAP不带参数将显示整个全局堆的情况.
输出:
lectororhandle:选择符符或句柄.
address:32位虚拟地址
size:堆的大小(字节)
modulename:模块名
--------------------------------
type:全局堆的类型
code:不可丢弃的代码段
codeD:可丢弃的代码段
Data:数据段
ModuleDB:模块数据基础段
TaskDB:任务数据基础段
BurgerM:"三明治"(就是堆本身)
Alloc:被动态分配的内存
Resource:Windows资源
--------------------------------
额外信息:
如果某全局堆的入口是代码段或数据段,则会显示该段在.EXE中的段号.如果某全局堆的入
口是Windows资源,则会附加显示如下资源类型:
--------------------------------
UrDef(用户自定义);Icon(图标);
String(字符串);Accel(快捷键);
IconGrp(图标组);Cursor(光标);
Menu(菜单);FontGrp(字体组);
ErrTable(错误表);NameTabl(名字表);
Bitmap(位图);Dialog(对话框);
Font(字体);CursGrp(光标组)
--------------------------------
点评:
PDF手册中称堆本身为Burger-->"三明治"(碎肉夹饼)很贴切,堆本来就是乱七八遭.
命令:HEAP32
作用:显示Windows全局堆
语法:HEAP32[hheap32│task-name]
用法:
hheap32:由HeapCreate()返回的堆句柄.
task-name:32位任务的名字.
HEAP32不带参数显示32位进程的堆的情况:
.KERNEL32缺省系统堆.
.进程用HeapCreate()申请的私有堆.
.两个由VMM产生的Ring-0级的堆.第一个是换页锁定的堆,第二个是可换页的堆..一个属于
所有虚拟机的Ring-0堆.
如果加上进程名,SoftICE将显示所有该进程的缺省堆,且地址内容也切换到该进程中.如果
加上堆的基地址而不是进程名,SoftICE将显示该进程的非缺省堆.
WINDOWS95的调试版还提供了额外的调试信息,想要用SoftICE看到这些信息,必须:
.对于KERNEL32Ring-0堆,必须安装有SDK除错版.
.对于VMMRing-0堆,必须安装VMM的DDK除错版.
输出信息(HEAP32):
HeapBa:堆的基址
MaxSize:堆可增长的最大范围,在此范围内堆无需再创建一个新段.
Committed:以千字节为单位当前存在于物理内存中的被保证的内存大小
Segments:堆中段的数量.当堆增长超出段所能容纳的范围,就建立一个新段
Type:堆的类型:
--------------------------------
Private:由应用程序建立的Ring-3堆
System:KERNEL32建立的Ring-3堆
Ring0:VMM建立的Ring-0堆
VMM##:由VMM建立的为特定虚拟机
存储数据的堆.
--------------------------------
输出信息(HEAP32带参数):
Address:堆元素的地址.
Size:以字节为单位堆元素的长度.
Free:如果堆元素是空闲的块,则会显示"FREE",否则不显示.
点评:在SoftICEv3.20实际操作上和手册说的中有些许不同.
命令:HERE
作用:运行到当前光标所在行
语法:H形容母亲的词 ERE
用法:
HERE命令让程序一直走到光标所在行再停下来.注意:
只有当光标在代码窗口中时才有效.如果代码窗口不可见或光标不在代码窗口中,则请用G
命令代替.也可用EC命令将光标移到代码窗口中去,再用HERE.
HERE命令有个快捷键F7.将光标定位到你想让程序暂停的指令处,按下F7,程序将在此处设
一个一次性断点.程序中其他非一次性的断点照样起作用.无论是谁先弹出,都将清除HERE
所下的一次性断点.和G命令一样,HERE命令尽量采用除错寄存器DRx,只有用完时才用INT
3
点评:无.
命令:HWND
作用:显示窗口句柄的信息
语法:HWND[-x][hwnd│[[level][process-name]]
用法:
level:窗口等级号码.0是最高级.1其次,等等.窗口等级代表了父窗口和子窗口的关系.
-x:显示窗口的冗余信息.
hwnd:窗口句柄.
process-name:任何当前进程名
如果指定了窗口句柄,就无需指定等级,进程名等其他参数,SoftICE将显示所指定窗口句柄
的信息.
输出:
ClassName:此窗口所属类的名称或类的原子.
WindowProcedure:窗口函数.
点评:窗口句柄很有用的.(废话!)
命令:I
作用:从输入/输出(I/O)端口读入数据
语法:I[size]port
用法:
size:B字节(默认);W字;D双字
port:端口地址.
I命令在大多数情况下是作一个I/O输入指令,获取真实的硬件端口的数据.在虚拟端口的
情况下,取得真实值和应用程序所见到的虚拟值可能不同.对于21h和A1h端口,SoftICE
是例外,它不进行读取,而是返回So-ftICE弹出时的值.
点评:参见O命令.
命令:I1HERE
作用:遇到内嵌的INT1指令时激活SoftICE
语法:I1HERE[on│off]
用法:
I1HERE命令使SoftICE在遇到程序中内嵌的INT1指令时弹出.I1HERE在调试程序时需在某
处暂停时特别有用.在SoftICE弹出之前,SoftICE会检查当前是否有一条INT1指令在程序
中.如果没有的话,SoftICE将不弹出.在程序要暂停的指令之前加一句INT1就能做到这一
点.SoftICE弹出时,EIP会停在INT1的下一条指令后.
I1HERE不带参数将显示当前I1HERE的状态.缺省为OFFI1HERE在与如BoundsChecker之类
的调试工具分工协作时很有用,因为BoundsChecker用到INT3,为了防止冲突应使用INT1.
另外,VMM,Windows内存管理的VxD,在Windows出现某些严重错误时会在严重错误返回前执行
一个INT1指令.如果此时I1HERE为ON时,你就能跟踪这类错误.如由VMM因换页错误而
产生INT1时寄存
器的值如下:
.EAX=错误地址.
.ESI指向一个ASCII字符串(信息).
.EBP指向一个CRS(在DDK的中定义的客户寄存器结构)
点评:
基础信息:INT1实际上是单步中断的处理例程.CPU在检测到TP标志为1时(TP是由
DEBUGGER设的),就自动进行这一例程.DEBUGGER们挂接这个中断例程进行一些诸如显示当
前寄存器值等操作,并等待用户进一步的指令.在程序中直接用INT1指令也能达到效
果.SoftICE不象DOS下的,一碰到INT1就中断,
缺省是不中断的,只有当I1HERE为ON时才中断.
命令:I3HERE
作用:在遇到INT3指令时激活SoftICE
语法:I3HERE[on│off]
用法:
I3HEREON将使SoftICE每碰到一个INT3时都弹出,这在调试程序时需要在某处暂停特别
有用.在你需要暂停的指令之前加一个INT3就行.如果你是编WINDOWS程序,加个函数
DebugBreak().这个函数也执行一个INT3.
I3HERE不带参数将显示当前状态.请参见I1HERE.
点评:
基础信息:INT3是断点中断处理例程.也被DEBUGGER们挂接,显示寄存器值,给出一些信息,
并等待用户下一步操作.DEBUGGER在下断点时,将断点处的指令替换成INT3,把替换下的指
令保存,在执行完例程后再恢复原先保存的指令,修改堆栈中的断点地址,使程序得以继续.
DOS下的老当遇到程序中的INT3指令时会进行同样的操作,也修改堆栈中的断点
地址,所以IP又停在那条INT3上,如果你打入G,程序将一直停在此处,这时改一下IP就
可以了.
命令:IDT
作用:显示中断描述符表
语法:IDT[interrupt-number]
用法:
interrupt-number:所要显示的中断号IDT命令读取中断描述符表寄存器的值,获得表基
址,然后显示中断描述符表的内容.IDT命令不带参数将显示所有中断的情况,如果带中断号,
则只显示相应的入口.输出参数如下:
interruptnumber:0-05fh的中断号.
interrupttype:中断类型如下:
---------------------
CallG32:32位调用门.
CallG16:16位调用门.
TaskG:任务门.
TrapG16:16位陷肼门.
TrapG32:32位陷肼门.
IntG32:32位中断门.
IntG16:16位中断门.
---------------------
address:(选择符:偏移量)形式的地址.
lector'sDPL:选择符的描述符特权级,0,1,2,3
prentbit:P或NP,表示该描述符是否在内存中.
Owner+Offt:符号名或拥有者名,和在它们中的偏移.
点评:参见GDT,LDT.
命令:LDT
作用:显示局部描述符表
语法:LDT[lector]
用法:
lector:指定LDT选择符LDT命令将显示局部描述符表的内容.SoftICE先读取局部描述
符表寄存器的值,再定位描述符表.如果局部描述符表不存在,会显示一个错误信息.如果指
定选择符,则只显示该选择符所指向的描述符.如果指定的选择符是一个全局选择符,则
SoftICE将自动显示该全局选择符所指的描述符.
输出:LDT的线性基址和长度将显示在输出数据的顶行输出数据的每一行内容的说明:
value:最低两位即描述符特权级
type:描述符类型,如下:
---------------------------
Code16:16位代码描述符
Data16:16位数据描述符
Code32:32位代码描述符
Data32:32位数据描述符
CallG32:32位调用门描述符
CallG16:16位调用门描述符
TaskG32:32位任务门描述符
TaskG16:16位爆炒龙虾尾 任务门描述符
TrapG32:32位陷肼门描述符
TrapG16:16位陷肼门描述符
IntG32:32位中断门描述符
IntG16:16位中断门描述符
Rerved:保留的描述符
---------------------------
ba:描述符中的段基址
limit:描述符中的段界限
DPL:描述符特权级,0,1,2,3
prentbit:P或NP表示该段是否在内存中
gmentattributes:段特性:
---------------------------
RW:数据段可读写
RO:数据段只读
RE:代码段可读可执行
EO:代码段只可执行
B:TSS(任务状态段)忙置位
---------白起简介 ------------------
点评:
这段翻译并不完全用PDF手册上的.如"lector"原指选择符(器),用来指向描述符表中的
描述符,而PDF手册中type的说明全用到lector.说的意思虽是一样,但和别的文献矛盾,
故认为不妥,将其翻译成descriptor,即描述符.实际上可以看出,一个选择符指向一个描述
符,两者是一致的.描述符类型实际上也就是指向它的
选择符类型.
命令:LHEAP
作用:显示Windows局部堆
语法:LHEAP[lector│module-name]
用法:
lector:局部描述符表数据选择符.
module-name:16位模块名.
LHEAP显示Windows程序在全局堆中申请的数据信息.
如果不跟选择符参数,当前的DS寄存器的内容(数据选择符)被做为缺省值.用前次说过的
HEAP命令找标有LH的选择符来做为LHEAP的参数.如果用module-name做参数,则SoftICE
用此模块的缺省数据段进一一得一 行堆遍历.
输出:
offt:16位的偏移量(相对于相应的选择符基址)
size:堆入口(每个组成部分)的字节大小.
type:类型如下:
---------------------
FIX:固定的.
MOV:可移动的.
FREE:空闲的.
---------------------
handle:相应的句柄.对固定的堆组成部分来说,此值和offt相等,且是由LocalAlloc()
返回的.对于可移动的组成部分来说,此值将会被做为LocalLock()的参数.
点评:无.(天气好热!翻译得好累!)
命令:LINES
作用:改变SoftICE窗口的显示行数
语法:LINES[25│43│50│60]
用法:
LINES命令用来改变SoftICE窗口的显示行数.默认为25行.可以有:25行;43行;50行;60
行;43,50,60行只适用于VGA卡.
LINES不带参数将显示当前行数.如果用ALTSCR命令切换显示器输出到单显,SoftICE自动
转为25行,再转回VGA卡时要手工用LINES命令来恢复原值.
点评:
实际上,我的3.20用的是SoftICE自带的通用视频驱动程序,行范围可以从25一直到
128!!(除非为SoftICE开的显存不够)
命令:LOCALS
作用:从当前栈中列出局部变量
语法:LOCALS
用法:
输出:
StackOfft:栈偏移.
Typedefinition:类型定义.
Value,Data,orstructuresymbol({...}):值,数据,或结构符号.SoftICE根据局部变量的
类型来用不同的形式显示它们,如果是指针,则显示所指向的数据.如果是结构,则显示结构符
号.如果既不是指针,又不是结构,则显示本身值.
点评:无
命令:M
作用:传送数据
语法:Msource-addressllengthdest-address
用法:
source-address:源数据的起址;
length:要传送的字节长度;
dest-address:目的数据块的起址.
用M命令将数据块从源地址传送到目的地址.
如Mds:1000l2000es:5000
将2000h个字节从DS:1000h传到ES:5000h处.
点评:无
命令:MACRO
作用:定义一个宏命令,使之执行一系列SoftICE指令.
#语法:MACRO[macro-name]││[="macrobody"]
用法:
macro-name:3-8个字符的宏名,(不区分大小写);
macro-body:用分号隔开的一系列SoftICE指令,首末加冒号;
*:删除一个或所有的已定义的宏命令;
=:定义(或重定义)一个宏命令.
MACRO命令用于定义SoftICE指令的超集.macro-body可以包含SoftICE的指令,也可包含宏
定义,甚至是当前的宏定义本身.(这当然会产生递归调用,如果编得不好的话会产生错误,也
没有什么大意思).在这一系列命令之间用分号(;)隔开,最后一个命令后不用加分号.
macro-body中还可以带入命令行参数,和DOS命令的%1,%2...一样,合法值在1-8之间.注意
一点,macro-body首尾是用冒号的.所以在宏定义体中如果要用到,",%时要在前加一,
这跟C语言的写法是一致的.
macro_name参数用来代表宏名,可以是字母或数字或下划线组成.可以是现有的宏名,那样
的话就会重定义这个宏.宏名不可以和现有的SoftICE内部指令相同.会发生错误.MACRO*表
示删除当前定义的所有(有名字的)宏.(因为断点的DO子句实际上也是宏,不过是无名字的,
它们不能就这样被删除了!)
MACROmnames*删除当前名为mnames的宏.
MACROmnames将编辑名为mnames的宏,在编辑过程中可以用ESC键取消改动.一个很有用
的例子:
:MACRO1shot="bpx%1do"bcbpindex""
用这个宏可以设一个一次性断点,非常方便!
点评:无
命令:MAP32
作用:显示当前所有32位模块的内存映象(图).
语法:MAP32[module-name│module-handle│address]
用法:
modulename:Windows模块名;
modulehandle:模块的基址;
address:落在可执行模块中的地址.
MAP32不带参数将显示所有的32位模块的信息.加参数将只显示指定模块的信息.
输出如下:
Owner:模块名.
OBJName:可执行文件的区段名.
Obj#:可执行文件中的区段号.
Address:选择符:偏移量格式的区段地址.
Size:区段的大小(字节)
Type:区段类型:
--------------------
CODE代码
IDATA初始化的数据
UDATA未初始化的数据
RO只读
RW读/写
SHARED对象是共享的.
--------------------
点评:无
命令:MAPV86
作用:显示当前虚拟机的DOS内存映象
语法:MAPV86[address]
用法:
address:段:偏移量格式的地址
MAPV86不带参数将显示当前整个虚拟机的内存映象.加参数将显示指定包含所指定地址的内
存区域的信息.有时侯DOSVM的页没有切进来,所以会有"PAGENOTPRESENT"的出错信息,
所以可以再弹出一次.MAPV86在配合SYMLOC命令时很有用,因为在Windows启动前装载的程
序,Windows不会自动将它们的符号信息映射到V86内存,用MAPV86命令就可以取得它们的代
码段,将符号表与之对齐,就可以跟踪调试了.
输出如下:
VMID:虚拟机的ID.
VMhandle:32位虚拟机的句柄.
CRSpointer:虚拟机的32位客户登记表的指针.(?)
VMaddress:32位线性地址.
另外,如果SoftICE弹出时CS:IP指向一个MAPV86的入口,那一行的内容将高亮显示.
点评:无
命令:MOD
作用:显示Windows模块列表.
语法:MOD[partial-name]
用法:
partial-name:Windows模块名,(可以是开头的若干个字母).
MOD不带参数将显示所有的模块.若加partial-name,则符合要求的模块将被列出.输出如
下:
modulehandle:16位的句柄.
ba:线性基址.
pe-header:选择符:偏移量格式的PE文件头.
modulename:模块名.(编程序时在.DEF中用NAME或LIBRARY命名的.)
filename:文件的路径(全名).
点评:无
命令:O
作用:向I/O端口输出数据.
语法:O[size]portvalue
用法:
size:B字节(缺省值);W字;D双字
port:端口地址.
value:要输出字节,字,或双字.
O命令将立即输出到硬件端口(当然那两个21h和A1h要等退出SoftICE窗口时才执行)(?)字母的英文
点评:
关于21h和A1端口,二者是关系到中断的,PDF文档在这写得不是很详细.实际操作情思五行属什么 况是多
种多样的.
本文发布于:2023-03-24 22:29:56,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1679668199373709.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:hboot.doc
本文 PDF 下载地址:hboot.pdf
留言与评论(共有 0 条评论) |