﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-寻梦岁月-随笔分类-Assembly</title><link>http://www.cnitblog.com/ffan/category/655.html</link><description>寻梦的岁月不言辛苦几许,不问收获几多…</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 21:21:59 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 21:21:59 GMT</pubDate><ttl>60</ttl><item><title>控制转移类指令</title><link>http://www.cnitblog.com/ffan/archive/2005/09/15/2668.html</link><dc:creator>ffan</dc:creator><author>ffan</author><pubDate>Thu, 15 Sep 2005 07:00:00 GMT</pubDate><guid>http://www.cnitblog.com/ffan/archive/2005/09/15/2668.html</guid><wfw:comment>http://www.cnitblog.com/ffan/comments/2668.html</wfw:comment><comments>http://www.cnitblog.com/ffan/archive/2005/09/15/2668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ffan/comments/commentRss/2668.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ffan/services/trackbacks/2668.html</trackback:ping><description><![CDATA[<FONT color=#000000>条</FONT>件转移指令Jcc根据指定的条件确定程序是否发生转移。如果满足条件则程序转移到目标地址去执行程序；不满足条件，则程序将顺序执行下一条指令。 
<P>
<P>其通用格式为：<BR>Jcc LABEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;条件满足，发生转移：IP←IP+8位位移量<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ；否则，顺序执行:IP←IP+2<BR>其中，LABEL表示目标地址（8位位移量）。因为Jcc指令为2个字节，所以顺序执行就是指令偏移指针IP加2。条件转移指令跳转的目标地址只能用前面介绍的段内短距离跳转（短转移），即目标地址只能是在同一段内，且在当前IP地址-128~+127个单元的范围之内。这种寻址方式由于是相对于当前IP的，所以被称为相对寻址方式。条件转移指令不影响标志，但要利用标志。条件转移指令Jcc中的cc表示利用标志判断的条件，共16种。如下图：<BR><IMG style="MARGIN: 5px" alt=条件转移指令 src="http://blog.chinaunix.net/resserver.php?blogId=8327&amp;resource=5372-15.gif"></P>
<P><BR>1、判断单个标志位状态<BR>这组指令单独判断5个状态标志之一，根据某一个状态标志是0或1决定是否跳转。<BR>（1）JZ/JE和JNZ/JNE利用零标志ZF，判断结果是否为零（或相等）<BR>JE指令（相等时转移）<BR>JZ指令（等于0时转移）<BR>这是当ZF=1时转移到目标地址的条件转移指令的两种助记符。这条指令既适用于判断无符号数的相等，又适用于判断带符号数的相等。<BR>JNE指令（不相等转移）<BR>JNZ指令（不等于0转移）<BR>这是当ZF=0时能转移到目标地址的条件转移指令的两种助记符。这条指令也是既适用于判断无符号数，又适用于判断带符号数。<BR>（2）JS和JNS利用符号标志SF，判断结果是正是负。<BR>JS指令（为负转移）——当满足SF=1时，转移到目标地址<BR>JNS指令（为正转移）——满足SF=0时，转移到目标地址<BR>（3）JO和JNO利用溢出标志，判断结果是否产生溢出<BR>JO指令（溢出转移）——OF=1时，转移到目标地址<BR>JNO指令（未溢出转移）——OF=0时，转移到目标地址<BR>（4）JP/JPE和JNP/JPO利用奇偶标志PF，判断结果中“1”的个数是偶是奇<BR>JP/JPE指令（为偶转移）——满足PF=1时转移<BR>JNP/JPO指令（为奇转移）——满足PF=0时转移<BR>数据通讯为了可靠常要进行校验。常用的校验方法是奇偶校验，即把字符ASCII码的最高位用作校验位，是包括校验位在内的字符中为“1”的个数恒为奇数（奇校验），或恒为偶数（偶校验）。若采用奇校验，在字符ASCII中为“1”的个数已为奇数时，则令其最高位为“0”；否则令最高位为“1”。<BR>（5）JC/JB/JNAE和JNC/JNB/JAE，利用进位标志CF，判断结果是否进位或借位，CF标志是比较常用的一个标志。<BR>JC——满足CF=1时转移&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNC——满足CF=0时转移<BR>JB（低于转移）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNB（不低于转移）<BR>JNAE（不高于等于转移）&nbsp;&nbsp;&nbsp; JAE（高于等于转移）<BR>2、用于比较无符号数高低<BR>为区别有符号数的大小，无符号数的大小用高（Above）、低（Below）表示，它需要利用CF确定高低、利用ZF标志确定相等（Equal）。两数的高低分成4种关系：低于（不高于等于）、不低于（高于等于）、低于等于（不高于）、不低于等于（高于）；也就分别对应4条指令：JB(JNAE)、JNB(JAE)、JBE(JNA)、JNBE(JA)。<BR>JA/JNBE<BR>JA即高于转移，JNBE即不低于且不等于转移，高于则没有进位产生，即CF=0，不等于则ZF=0，所以这两条指令满足CF=0且ZF=0时转移<BR>JAE/JNB<BR>高于或等于转移/不低于转移是当CF=0(高于就不产生进位)或ZF=1（等于）时转移。<BR>JB/JNAE<BR>即低于/不高于且不等于转移，是当CF=1（产生借位）且ZF=0（不相等）时转移。<BR>JBE/JNA<BR>即低于或等于/不高于转移，是当CF=1(借位产生)或ZF=1（相等）时转移。<BR>3、用于比较有符号数大小<BR>判断有符号数的大（Greater）、小（Less），需要组合OF、SF标志、并利用ZF标志确定相等与否。两数的大小分成4种关系：小于（不大于等于）、不小于（大于或等于）、小于等于（不大于）、不小于等于（大于）；也就分别对应4条指令：JL(JNGE)、JNL(JGE)、JLE(JNG)、JNLE(JG)。<BR>由上可见，条件转移指令之前常有CMP、TEST、加减运算、逻辑运算等影响标志的指令，利用这些指令执行后的标志或其组合状态形成条件。<BR>JG/JNLE<BR>大于/不小于且不等于转移，是当标志SF与OF同号（即&lt;SF异或OF&gt;=0）且ZF=0时转移<BR>JGE/JNL<BR>大于或等于/不小于转移，是当标志SF与OF同号（即&lt;SF异或OF&gt;=0）或ZF=0时转移<BR>JL/JNGL<BR>小于/不大于也不等于时转移，是当标志SF与OF异号（即&lt;SF异或OF&gt;=1）且ZF=0时转移<BR>JLE/LNG<BR>小于或等于/不大于转移，是当标志SF与OF异号（即&lt;SF异或OF&gt;=1）或ZF=1时转移<BR>4、判断计数器CX是否为0<BR>JCXZ LABEL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;CX=0，则转移；否则顺序执行</P><img src ="http://www.cnitblog.com/ffan/aggbug/2668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ffan/" target="_blank">ffan</a> 2005-09-15 15:00 <a href="http://www.cnitblog.com/ffan/archive/2005/09/15/2668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用中断</title><link>http://www.cnitblog.com/ffan/archive/2005/08/28/2388.html</link><dc:creator>ffan</dc:creator><author>ffan</author><pubDate>Sat, 27 Aug 2005 18:09:00 GMT</pubDate><guid>http://www.cnitblog.com/ffan/archive/2005/08/28/2388.html</guid><wfw:comment>http://www.cnitblog.com/ffan/comments/2388.html</wfw:comment><comments>http://www.cnitblog.com/ffan/archive/2005/08/28/2388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ffan/comments/commentRss/2388.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ffan/services/trackbacks/2388.html</trackback:ping><description><![CDATA[<H2><A name=0></A>&nbsp;</H2>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=760 borderColorLight=#ffd5ff border=1>
<TBODY>
<TR bgColor=#ffd5ff>
<TD class=menu width=30 bgColor=#ffd5ff height=30><FONT color=#ff0000>INT</FONT> </TD>
<TD class=menu width=30><FONT color=#ff0000>AH</FONT> </TD>
<TD class=menu width=100><FONT color=#ff0000>功能</FONT> </TD>
<TD class=menu width=300><FONT color=#ff0000>调用参数</FONT> </TD>
<TD class=menu width=300><FONT color=#ff0000>返回参数</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>0 <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>设置显示方式： <BR></FONT>
<P><FONT color=#008000>AL6~0为显示模式号，1.AL7=0：先清屏，再转为新模式 <BR>2.AL7=1：不清屏，直接转为新模式</FONT> </P>
<P><FONT color=#008000></FONT></P>
<P><FONT color=#008000></FONT></P>
<P><FONT color=#008000></FONT></P>
<P><FONT color=#008000></FONT></P>
<P><FONT color=#008000></FONT></P>
<P><FONT color=#008000></FONT></P>
<P><FONT color=#008000><BR><BR><BR><BR><BR><BR><BR><BR></FONT></P></TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=00 40×25黑白方式 <BR>AL=01 40×25彩色方式 <BR>AL=02 80×25黑白方式 <BR>AL=03 80×25彩色方式 <BR>AL=04 320×200彩色图形方式 <BR>AL=05 320×200黑白图形方式 <BR>AL=06 320×200黑白图形方式 <BR>AL=07 80×25单色文本方式 <BR>AL=08 160×200 16色图形 (PCjr) <BR>AL=09 320×200 16色图形 (PCjr) <BR>AL=0A 640×200 16色图形 (PCjr) <BR>AL=0B 保留(EGA) <BR>AL=0C 保留(EGA) <BR>AL=0D 320×200 彩色图形 (EGA) <BR>AL=0E 640×200 彩色图形 (EGA) <BR>AL=0F 640×350 黑白图形 (EGA) <BR>AL=10 640×350 彩色图形 (EGA) <BR>AL=11 640×480 单色图形 (EGA) <BR>AL=12 640×480 16色图形 (EGA) <BR>AL=13 320×200 256色图形 (EGA) <BR>AL=40 80×30 彩色文本(CGE400) <BR>AL=41 80×50 彩色文本(CGE400) <BR>AL=42 640×400 彩色图形(CGE400)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>1 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>设置光标大小 <BR>(仅在文本显示模式下有效) <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>(CH)<SUB>0-3</SUB>=光标起始处行号 <BR>(CL)<SUB>0-3</SUB>=光标结束处行号</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>2 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>设置光标位置 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>BH=光标所在处的页号 <BR>DH=行号 <BR>DL=列号</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>3 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读光标当前所在位置 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>BH=页号 <BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0><FONT color=#000000>AX = 0000h (Phoenix BIOS) <BR></FONT>DH,DL=行,列 <BR></FONT><FONT color=#000000>CH = 开始扫描行号 <BR>CL = 结束扫描行号</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>4 <BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读光笔当前所在位置 <BR>(适用于EGA显示卡) <BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=0 光笔未打开 <BR>????? =1 光笔已打开，且以下参数有效： <BR><BR>CX=象素行(图形) <BR>BX=象素列(图形) <BR>DH=字符行(文本) <BR>DL=字符列(文本)</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>5</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>置显示页</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=页号</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>6 <BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>屏幕初始化或向上卷动屏幕 <BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=上卷行数 <BR>AL=0 ：整个窗口空白 <BR>AL!=0：屏幕底部为空白输入行 <BR>BH=空白行属性 <BR>CH=左上角行号 <BR>CL=左上角列号 <BR>DH=右下角行号 <BR>DL=右下角列号</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>7 <BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>屏幕初始化或向下卷动屏幕 <BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=下卷行数 <BR>AL=0 整个窗口空白 <BR>AL!=0：屏幕顶部为空白输入行 <BR>BH=空白行属性 <BR>CH=左上角行号 <BR>CL=左上角列号 <BR>DH=右下角行号 <BR>DL=右下角列号</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>8 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读光标位置的字符和属性 <BR>(仅文本显示模式下有效) <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>BH=页号 <BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=光标所在处字符属性 <BR>AL=光标所在处字符编码</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>9 <BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>在光标位置显示字符及属性 <BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>BH=页号 <BR>AL=欲写字符的编码 <BR>BL=欲写字符的属性 <BR>CX=字符重复次数</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>A <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>在光标位置显示字符 <BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>BH=显示页 <BR>AL=欲写字符的编码 <BR>CX=字符重复次数</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT><FONT color=#8080c0></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>B <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>置彩色调板(320×200图形)或边沿色/背景色 <BR>(适用于CGA显示卡)</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>BH=0：文本模式下设置边沿色，图形模式下设置背景色，BL=将设置的颜色号； <BR>BH=1：设置调色板，BL=调色板号</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>C <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>写象素 <BR>(仅在图形显示模式下有效) <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>DX=行(0-199) <BR>CX=列(0-639) <BR>AL=点的前景色</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>D <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读指定页面指定点的颜色 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>BX=欲读点的页号 <BR>DX=行(0-199) <BR>CX=列(0-639)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AL=读得该点的前景色 <BR></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>E <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>显示字符 <BR>(光标前移一格，如到页尾则自动上卷一行，末行空白)</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=欲写字符的编码 <BR>BH=页号 <BR>BL=字符的前景色号</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT><FONT color=#8080c0></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>F <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>取当前显示状态</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=当前每行字符数 <BR>BH=当前页号 <BR>AL6~0=显示模式号 <BR>AL7=1：上次转换未清屏 <BR>AL7=0：上次转换前先清屏</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>10 <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>13 <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>显示字符串(适用AT) <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="33%">
<P><FONT color=#0080c0>ES:BP=串地址 <BR>CX=串长度 <BR>DH,DL=起始行,列 <BR>BH=页号 <BR>AL0=0：<FONT color=#8080c0>光标返回起始位置 <BR><FONT color=#0080c0>AL0=1：</FONT><FONT color=#8080c0>光标跟随移动</FONT></FONT></FONT><FONT color=#0080c0> <BR>AL1=1：包含字符及属性，此时BL指示字符属性 <BR>AL2~7：保留(0) <BR><BR></FONT><FONT color=#0080c0><FONT color=#000000>(*1*)</FONT> <BR></FONT></P></TD>
<TD class=menu width="28%"><FONT color=#8080c0><FONT color=#0080c0>?</FONT> <BR><BR><BR><BR>? <BR><BR></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>11 <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>设备检验 <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AX=返回值 <BR>bit0=1,配有磁盘 <BR>bit1=1,80287协处理器 <BR>bit4,5=01,40×25BW(彩色板) <BR>????? =10,80×25BW(彩色板) <BR>????? =11,80×25BW(黑白板) <BR>bit6,7=罗盘驱动器 <BR>bit9,10,11=RS-232板号 <BR>bit12=游戏适配器 <BR>bit13=串行打印机 <BR>bit14,15=打印机号</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>12</FONT> </TD>
<TD class=menu width="4%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>测定存储器容量</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AX=字节数(KB)</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>0</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>磁盘复位</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>DL=物理驱动器号(0、1：软盘，80H、81H硬盘)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>CF=0：复位成功，此时AH=磁盘状态 <BR>CF=1：复位失败</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>1</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>读磁盘状态</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>DL=物理驱动器号(0、1：软盘，80H、81H硬盘)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>CF=0：读状态成功，此时AH=磁盘状态(*2*) <BR>CF=1：读状态失败</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>2 <BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读扇区状态 <BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=扇区数 <BR>CH,CL=磁道号,扇区号<FONT color=#000000>1-63</FONT> <BR>DH,DL=磁头号,驱动器号 <BR>ES:BX=数据缓冲区地址</FONT> </TD>
<TD class=menu width="28%">
<P><FONT color=#8080c0>CF=0：读成功， <BR>?????? AH=0 <BR>?????? AL=已读取的扇区数 <BR>CF=1：读失败 <BR>?????? </FONT><FONT color=#8080c0>AH=出错代码 <BR></FONT></P></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>3 <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>写指定的扇区 <BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>同上 <BR><BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0>CF=0：写成功 <BR>?????? AH=0 <BR>?????? AL=写入的扇区数 <BR>CF=1：写失败 <BR>?????? AH=出错代码</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>4 <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>检验磁盘扇区 <BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>同上(ES:BX不设置) <BR><BR></FONT></TD>
<TD class=menu width="28%">
<P><FONT color=#8080c0>CF=0：成功 <BR>?????AH=0 <BR>???? AL=检验的扇区数 <BR>CF=1：失败 <BR>????? </FONT><FONT color=#8080c0>AH=出错代码</FONT> </P></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>5 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>对指定磁道格式化(硬盘格式化较复杂，这里只针对软盘格式化)</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=每磁道扇区数 <BR>CH=磁道号 <BR>DH,DL=磁头号,驱动器号 <BR>ES:BX=指向扇区ID的地址指针 <BR></FONT></TD>
<TD class=menu width="28%">
<P><FONT color=#8080c0>CF=0：成功 <BR>CF=1：失败，</FONT><FONT color=#8080c0>AH=出错代码(*3*)</FONT> </P></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>8? </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>取当前驱动器参数</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体>DL=物理驱动器号</FONT> </TD>
<TD class=menu width="28%">
<P><FONT face=宋体>CF=0：成功 <BR>AH=0 <BR>AL：一般为0 <BR>BL=驱动器类型(AT/PS2 floppy only) <BR>CH=最大磁道号的低8位 <BR>CL5~0=扇区号 <BR>CL7~6=最大磁道号高2位 <BR>DH=最大磁头号 <BR>DL=驱动器数量 <BR>ES:DI指向11个字节的磁盘参数表的首址指针 <BR><BR></FONT><FONT face=宋体>CF=1：失败</FONT> </P></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>9? </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>初始化双驱动器</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体 color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%">
<P><FONT face=宋体>CF=0：初始化成功 <BR>AH=磁盘状态 <BR></FONT><FONT face=宋体><BR>CF=1：初始化失败</FONT> </P></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>C? </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>查找柱面</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体>CH=磁道号 <BR>CL5~0=扇区号 <BR>CL7~6=磁道号高2位 <BR>DH=磁头号 <BR>DL=物理驱动器号</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：查找成功 <BR>AH=磁盘状态 <BR><BR>CF=1：查找失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>D </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>备用硬盘复位</FONT> </TD>
<TD class=menu width="33%">DL=物理驱动器号 </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：复位成功 <BR>AH=磁盘状态 <BR><BR>CF=1：复位失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>10H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>检测硬盘是否准备好</FONT> </TD>
<TD class=menu width="33%">DL=物理驱动器号 </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：准备好 <BR>AH=磁盘状态 <BR><BR>CF=1：未准备好</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>11H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>调整硬盘驱动器</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体>DL=物理驱动器号</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：成功 <BR>AH=磁盘状态 <BR><BR>CF=1：失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>14H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>硬盘驱动器内部诊断</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：成功 <BR>CF=1：失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>15H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>取DASD磁盘类型</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体>DL=物理驱动器号</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：成功 <BR>AH=DASD磁盘类型值(*4*) <BR><BR>CF=1：失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>16H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>取软盘变化</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体>DL=物理驱动器号</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：成功 <BR>AH=软盘状态值(*5*) <BR><BR>CF=1：失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>17H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体><FONT face=宋体>设置磁盘格式化类型</FONT></FONT> </TD>
<TD class=menu width="33%">
<P><FONT face=宋体>DL=物理驱动器号 <BR>AL=磁盘格式化类型(*4*)</FONT> </P></TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：成功 <BR>AH=磁盘状态 <BR><BR>CF=1：失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>18H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>设置软盘介质类型</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体>DL=物理驱动器号 <BR>CH=磁道数 <BR>CL=每磁道扇区数 <BR>ES:DI指向11个字节的介质参数表的首址指针 <BR></FONT></TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：<FONT face=宋体>设置</FONT>成功 <BR>AH=磁盘状态 <BR><BR>CF=1：<FONT face=宋体>设置</FONT>失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>13 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>19H </FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>磁头复位</FONT> </TD>
<TD class=menu width="33%"><FONT face=宋体><FONT face=宋体>DL=物理驱动器号 <BR></FONT></FONT></TD>
<TD class=menu width="28%"><FONT face=宋体><FONT face=宋体>CF=0：复位成功 <BR>AH=磁盘状态 <BR><BR>CF=1：复位失败</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>14 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>0 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>初始化串行通讯口 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=初始化参数 <BR>DX=通讯口号(0,1)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=通读口状态 <BR>AL=调制解调器状态</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>14 <BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>1 <BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>向串行通讯口写字符 <BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=字符 <BR>DX=通讯口号(0,1) <BR><BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0>写成功:(AH)<SUB>7</SUB>=0 <BR>写失败:(AH)<SUB>7</SUB>=1 <BR>(AH)<SUB>0-6</SUB>=通讯口状态</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>14 <BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>2 <BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>从串行通讯口读字符 <BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>DX=通讯口号(0,1) <BR><BR><BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0>读成功:(AH)<SUB>7</SUB>=0 <BR>?????? (AL)=字符 <BR>写失败:(AH)<SUB>7</SUB>=1 <BR>(AH)<SUB>0-6</SUB>=通讯口状态</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>14 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>3 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>取通讯口状态 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>DX=通讯口号(0,1) <BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=通讯口状态 <BR>AL=调制解调器状态</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>15</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>0</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>启动盒式磁带马达</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>15</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>1</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>停止盒式磁带马达</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>15 <BR><BR><BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>2 <BR><BR><BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>磁带分块读 <BR><BR><BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>ES:BX=数据传输区地址 <BR>CX=字节数 <BR><BR><BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=状态字节 <BR>AH=00 读成功 <BR>? =01 冗余检验错 <BR>? =02 无数据传输 <BR>? =04 无引导</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>15 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>3 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>磁带分块写 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>DS:BX=数据传输区地址 <BR>CX=字节数</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>同上 <BR></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>0</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>从键盘读字符</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AL=字符ASCII码 <BR>AH=字符的扫描码 <BR></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>1 <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读键盘缓冲区字符 <BR><BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>ZF=0：键盘已准备好读、但键盘缓冲区指针并未改变 <BR>???? AL=字符ASCII码 <BR>???? AH=扫描码 <BR>ZF=1： 键盘尚未准备好读，缓冲区空</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>2</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>读转换键状态</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AL=转换键状态值(*7*) <BR>AH大多数BIOS会改变其值</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>3 <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>设置按键速率和延迟时间</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=设置值 <BR>0:默认 <BR>1:增加延迟时间 <BR>2:按键速率减慢一半 <BR>3:增加延时且按键速率减慢一半 <BR>4:关闭重发字符 <BR>5:设置按键速率与延迟时间 <BR>BH=延迟时间 <BR>BL=按键速率 </FONT></TD>
<TD class=menu width="28%"><FONT face=宋体 color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>5 <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>键盘写（将字符放回缓冲区）</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>CL=欲写的字符ASCII码 <BR>CH=字符的扫描码 </FONT></TD>
<TD class=menu width="28%"><FONT face=宋体>AL=00H：成功 <BR>AL=01H：缓冲区已满，操作失败</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>10H <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT face=宋体>读扩展键盘</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体>AL=读得字符的ASCII码 <BR>AH=字符的扫描码 <BR></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>11H <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT face=宋体><FONT face=宋体>读取扩展键盘状态</FONT></FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT color=#8080c0>ZF=0：键盘已准备好读、但键盘缓冲区指针并未改变 <BR>???? AL=字符ASCII码 <BR>???? AH=扫描码 <BR>ZF=1： 键盘尚未准备好读，缓冲区空</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>16 <BR><BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>12H <BR><BR></FONT></TD>
<TD class=menu width="30%"><FONT face=宋体><FONT face=宋体><FONT face=宋体>读取扩展转换键状态</FONT></FONT></FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT face=宋体><FONT color=#8080c0>AL=转换键状态值(*7*) <BR>AH=扩展转换键状态值(*8*)</FONT></FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>17 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>0 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>打印一个字符 <BR>回送状态字节</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>AL=欲打印字符的ASCII码 <BR>DX= 打印机号(0~2)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=打印机状态字节 <BR>AH7=0：打印机忙 <BR>AH7=1：打印机空闲 <BR>AH6=1：打印机响应 <BR>AH5=1：无打印纸 <BR>AH4=1：已联机 <BR>AH3=1：出错 <BR>AH2~1：保留 <BR>AH0=1：超时 </FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>17 <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>1 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>初始化打印机 <BR>回送状态字节</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>DX=打印机号(0~2) <BR></FONT></TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=打印机状态字节(同上) <BR></FONT></TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>17</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>2</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>取打印机状态</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>DX=打印机号(0~2)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>AH=打印机状态字节(同上)</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>1A <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>0 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读时钟 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>CH:CL=时:分 <BR>DH:DL=秒:1/100秒</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>1A <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>1 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>置时钟 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>CH:CL=时:分 <BR>DH:DL=秒:1/100秒</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>1A <BR></FONT></TD>
<TD class=menu width="4%"><FONT color=#ff0080>2 <BR></FONT></TD>
<TD class=menu width="30%"><FONT color=#008000>读实时钟 <BR></FONT></TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#8080c0>CH:CL=时:分(BCD) <BR>DH:DL=秒:1/100秒(BCD)</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>1A</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>6</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>置报警时间</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>CH:CL=时:分(BCD) <BR>DH:DL=秒:1/100秒(BCD)</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR>
<TR>
<TD class=menu width="5%"><FONT color=#800080>1A</FONT> </TD>
<TD class=menu width="4%"><FONT color=#ff0080>7</FONT> </TD>
<TD class=menu width="30%"><FONT color=#008000>清除报警</FONT> </TD>
<TD class=menu width="33%"><FONT color=#0080c0>?</FONT> </TD>
<TD class=menu width="28%"><FONT color=#0080c0>?</FONT> </TD></TR></TBODY></TABLE>
<P>注： <BR>(*1*) </P>
<P><FONT color=#0080c0>例： <BR></FONT><FONT color=#0080c0>AL=0 <BR>串:char,char,... <BR>(<FONT color=#8080c0>光标返回起始位置)</FONT> <BR><BR>AL=1 <BR>串:char,char,... <BR>(<FONT color=#8080c0>光标跟随移动)</FONT> <BR><BR>AL=2,BL=属性串:char,attr,char,attr,... <BR>(<FONT color=#8080c0>光标返回起始位置)</FONT> <BR><BR>AL=3,BL=属性串:char,attr,char,attr,... <BR>(<FONT color=#8080c0>光标跟随移动) <BR><BR>(*2*) <BR></FONT></FONT><FONT color=#000000>Values for disk operation status: <BR>00h??? successful completion <BR>01h??? invalid function in AH or invalid parameter <BR>02h??? address mark not found <BR>03h??? disk write-protected <BR>04h??? sector not found/read error <BR>05h??? reset failed (hard disk) <BR>05h??? data did not verify correctly (TI Professional PC) <BR>06h??? disk changed (floppy) <BR>07h??? drive parameter activity failed (hard disk) <BR>08h??? DMA overrun <BR>09h??? data boundary error (attempted DMA across 64K boundary or &gt;80h sectors) <BR>0Ah??? bad sector detected (hard disk) <BR>0Bh??? bad track detected (hard disk) <BR>0Ch??? unsupported track or invalid media <BR>0Dh??? invalid number of sectors on format (PS/2 hard disk) <BR>0Eh??? control data address mark detected (hard disk) <BR>0Fh??? DMA arbitration level out of range (hard disk) <BR>10h??? uncorrectable CRC or ECC error on read <BR>11h??? data ECC corrected (hard disk) <BR>20h??? controller failure <BR>31h??? no media in drive (IBM/MS INT 13 extensions) <BR>32h??? incorrect drive type stored in CMOS (Compaq) <BR>40h??? seek failed <BR>80h??? timeout (not ready) <BR>AAh??? drive not ready (hard disk) <BR>B0h??? volume not locked in drive (INT 13 extensions) <BR>B1h??? volume locked in drive (INT 13 extensions) <BR>B2h??? volume not removable (INT 13 extensions) <BR>B3h??? volume in use (INT 13 extensions) <BR>B4h??? lock count exceeded (INT 13 extensions) <BR>B5h??? valid eject request failed (INT 13 extensions) <BR>BBh??? undefined error (hard disk) <BR>CCh??? write fault (hard disk) <BR>E0h??? status register error (hard disk) <BR>FFh??? sense operation failed (hard disk) <BR></FONT></P>
<P><FONT color=#000000>(*3*)软盘格式化错误信息</FONT> </P>
<P><FONT color=#000000>Offset? Size??? Description???? (Table 0212) <BR>00h??? BYTE??? track number <BR>01h??? BYTE??? head number (0-based) <BR>02h??? BYTE??? sector number <BR>03h??? BYTE??? sector size (00h=128 bytes, 01h=256 bytes, 02h=512, 03h=1024) <BR><FONT face=宋体><BR>(*4*)DASD磁盘类型值 <BR>00h no such drive 磁盘驱动器不存在 <BR>01h floppy without change-line support 磁盘驱动器不能改变当前检测 <BR>02h floppy (or other removable drive) with change-line support 磁盘驱动器能改变当前检测 <BR>03h hard disk 硬盘 <BR><BR>(*5*)软盘状态值 <BR>00h 软盘无变化 <BR>01h invalid command (SyQuest) 无效的软盘参数 <BR>06h change line active or not supported 软盘已改变 <BR>80h drive not ready or not present 驱动器未准备好 <BR><BR>(*6*)磁盘格式化类型 <BR>01h = 320/360K disk in 360K drive <BR>02h = 320/360K disk in 1.2M drive <BR>03h = 1.2M disk in 1.2M drive <BR>04h = 720K disk in 720K or 1.44M drive <BR><BR>(*7*)转换键状态值 <BR>Bitfields for keyboard shift flags: <A name=Table556></A><BR>Bit(s) Description (Table 0556) <BR>7 Insert active <BR>6 CapsLock active <BR>5 NumLock active <BR>4 ScrollLock active <BR>3 Alt key pressed (either Alt on 101/102-key keyboards) <BR>2 Ctrl key pressed (either Ctrl on 101/102-key keyboards) <BR>1 left shift key pressed <BR>0 right shift key pressed <BR><BR>(*8*)扩展转换键状态值 <BR>Bitfields for keyboard shift flags 2: <BR><A name=Table562></A>Bit(s) Description (Table 0562) <BR>7 SysReq key pressed (SysReq is often labeled SysRq) <BR>6 CapsLock pressed <BR>5 NumLock pressed <BR>4 ScrollLock pressed <BR>3 right Alt key pressed <BR>2 right Ctrl key pressed <BR>1 left Alt key pressed <BR>0 left Ctrl key pressed </FONT></FONT></P><img src ="http://www.cnitblog.com/ffan/aggbug/2388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ffan/" target="_blank">ffan</a> 2005-08-28 02:09 <a href="http://www.cnitblog.com/ffan/archive/2005/08/28/2388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汇编指令和中断</title><link>http://www.cnitblog.com/ffan/archive/2005/08/25/2340.html</link><dc:creator>ffan</dc:creator><author>ffan</author><pubDate>Thu, 25 Aug 2005 07:16:00 GMT</pubDate><guid>http://www.cnitblog.com/ffan/archive/2005/08/25/2340.html</guid><wfw:comment>http://www.cnitblog.com/ffan/comments/2340.html</wfw:comment><comments>http://www.cnitblog.com/ffan/archive/2005/08/25/2340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ffan/comments/commentRss/2340.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ffan/services/trackbacks/2340.html</trackback:ping><description><![CDATA[<P><SPAN class=tpc_content>一、数据传输指令 <BR>─────────────────────────────────────── <BR>&nbsp; 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. <BR>&nbsp; 1. 通用数据传送指令. <BR>&nbsp; &nbsp; MOV &nbsp; 传送字或字节. <BR>&nbsp; &nbsp; MOVSX 先符号扩展,再传送. <BR>&nbsp; &nbsp; MOVZX 先零扩展,再传送. <BR>&nbsp; &nbsp; PUSH &nbsp; 把字压入堆栈. <BR>&nbsp; &nbsp; POP &nbsp; 把字弹出堆栈. <BR>&nbsp; &nbsp; PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. <BR>&nbsp; &nbsp; POPA &nbsp; 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. <BR>&nbsp; &nbsp; PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. <BR>&nbsp; &nbsp; POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. <BR>&nbsp; &nbsp; BSWAP 交换32位寄存器里字节的顺序 <BR>&nbsp; &nbsp; XCHG &nbsp; 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) <BR>&nbsp; &nbsp; CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) <BR>&nbsp; &nbsp; XADD &nbsp; 先交换再累加.( 结果在第一个操作数里 ) <BR>&nbsp; &nbsp; XLAT &nbsp; 字节查表转换. <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0-FFH); 返回 AL 为查表结果. ( [BX+AL]-&gt;AL ) <BR>&nbsp; 2. 输入输出端口传送指令. <BR>&nbsp; &nbsp; IN &nbsp; &nbsp; I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) <BR>&nbsp; &nbsp; OUT &nbsp; I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) <BR>&nbsp; &nbsp; &nbsp; 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, <BR>&nbsp; &nbsp; &nbsp; 其范围是 0-65535. <BR>&nbsp; 3. 目的地址传送指令. <BR>&nbsp; &nbsp; LEA &nbsp; 装入有效地址. <BR>&nbsp; &nbsp; &nbsp; 例: LEA DX,string ;把偏移地址存到DX. <BR>&nbsp; &nbsp; LDS &nbsp; 传送目标指针,把指针内容装入DS. <BR>&nbsp; &nbsp; &nbsp; 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. <BR>&nbsp; &nbsp; LES &nbsp; 传送目标指针,把指针内容装入ES. <BR>&nbsp; &nbsp; &nbsp; 例: LES DI,string ;把段地址:偏移地址存到ES:DI. <BR>&nbsp; &nbsp; LFS &nbsp; 传送目标指针,把指针内容装入FS. <BR>&nbsp; &nbsp; &nbsp; 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. <BR>&nbsp; &nbsp; LGS &nbsp; 传送目标指针,把指针内容装入GS. <BR>&nbsp; &nbsp; &nbsp; 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. <BR>&nbsp; &nbsp; LSS &nbsp; 传送目标指针,把指针内容装入SS. <BR>&nbsp; &nbsp; &nbsp; 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. <BR>&nbsp; 4. 标志传送指令. <BR>&nbsp; &nbsp; LAHF &nbsp; 标志寄存器传送,把标志装入AH. <BR>&nbsp; &nbsp; SAHF &nbsp; 标志寄存器传送,把AH内容装入标志寄存器. <BR>&nbsp; &nbsp; PUSHF 标志入栈. <BR>&nbsp; &nbsp; POPF &nbsp; 标志出栈. <BR>&nbsp; &nbsp; PUSHD 32位标志入栈. <BR>&nbsp; &nbsp; POPD &nbsp; 32位标志出栈. <BR>二、算术运算指令 <BR>─────────────────────────────────────── <BR>&nbsp; &nbsp; 　　ADD &nbsp; 加法. <BR>&nbsp; &nbsp; ADC &nbsp; 带进位加法. <BR>&nbsp; &nbsp; INC &nbsp; 加 1. <BR>&nbsp; &nbsp; AAA &nbsp; 加法的ASCII码调整. <BR>&nbsp; &nbsp; DAA &nbsp; 加法的十进制调整. <BR>&nbsp; &nbsp; SUB &nbsp; 减法. <BR>&nbsp; &nbsp; SBB &nbsp; 带借位减法. <BR>&nbsp; &nbsp; DEC &nbsp; 减 1. <BR>&nbsp; &nbsp; NEC &nbsp; 求反(以 0 减之). <BR>&nbsp; &nbsp; CMP &nbsp; 比较.(两操作数作减法,仅修改标志位,不回送结果). <BR>&nbsp; &nbsp; AAS &nbsp; 减法的ASCII码调整. <BR>&nbsp; &nbsp; DAS &nbsp; 减法的十进制调整. <BR>&nbsp; &nbsp; MUL &nbsp; 无符号乘法. <BR>&nbsp; &nbsp; IMUL &nbsp; 整数乘法. <BR>&nbsp; &nbsp; &nbsp; 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), <BR>&nbsp; &nbsp; AAM &nbsp; 乘法的ASCII码调整. <BR>&nbsp; &nbsp; DIV &nbsp; 无符号除法. <BR>&nbsp; &nbsp; IDIV &nbsp; 整数除法. <BR>&nbsp; &nbsp; &nbsp; 以上两条,结果回送: <BR>&nbsp; &nbsp; &nbsp; &nbsp; 商回送AL,余数回送AH, (字节运算); <BR>&nbsp; &nbsp; &nbsp; 或 商回送AX,余数回送DX, (字运算). <BR>&nbsp; &nbsp; AAD &nbsp; 除法的ASCII码调整. <BR>&nbsp; &nbsp; CBW &nbsp; 字节转换为字. (把AL中字节的符号扩展到AH中去) <BR>&nbsp; &nbsp; CWD &nbsp; 字转换为双字. (把AX中的字的符号扩展到DX中去) <BR>&nbsp; &nbsp; CWDE &nbsp; 字转换为双字. (把AX中的字符号扩展到EAX中去) <BR>&nbsp; &nbsp; CDQ &nbsp; 双字扩展. &nbsp; (把EAX中的字的符号扩展到EDX中去) <BR><BR>三、逻辑运算指令 <BR>─────────────────────────────────────── <BR>&nbsp; &nbsp; 　　AND &nbsp; 与运算. <BR>&nbsp; &nbsp; OR &nbsp; &nbsp; 或运算. <BR>&nbsp; &nbsp; XOR &nbsp; 异或运算. <BR>&nbsp; &nbsp; NOT &nbsp; 取反. <BR>&nbsp; &nbsp; TEST &nbsp; 测试.(两操作数作与运算,仅修改标志位,不回送结果). <BR>&nbsp; &nbsp; SHL &nbsp; 逻辑左移. <BR>&nbsp; &nbsp; SAL &nbsp; 算术左移.(=SHL) <BR>&nbsp; &nbsp; SHR &nbsp; 逻辑右移. <BR>&nbsp; &nbsp; SAR &nbsp; 算术右移.(=SHR) <BR>&nbsp; &nbsp; ROL &nbsp; 循环左移. <BR>&nbsp; &nbsp; ROR &nbsp; 循环右移. <BR>&nbsp; &nbsp; RCL &nbsp; 通过进位的循环左移. <BR>&nbsp; &nbsp; RCR &nbsp; 通过进位的循环右移. <BR>&nbsp; &nbsp; &nbsp; 以上八种移位指令,其移位次数可达255次. <BR>&nbsp; &nbsp; &nbsp; &nbsp; 移位一次时, 可直接用操作码. 如 SHL AX,1. <BR>&nbsp; &nbsp; &nbsp; &nbsp; 移位&gt;1次时, 则由寄存器CL给出移位次数. <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如 MOV CL,04 <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SHL AX,CL <BR><BR>四、串指令 <BR>─────────────────────────────────────── <BR>&nbsp; &nbsp; &nbsp; &nbsp; 　DS:SI 源串段寄存器 :源串变址. <BR>&nbsp; &nbsp; &nbsp; &nbsp; ES:DI 目标串段寄存器:目标串变址. <BR>&nbsp; &nbsp; &nbsp; &nbsp; CX &nbsp; &nbsp; 重复次数计数器. <BR>&nbsp; &nbsp; &nbsp; &nbsp; AL/AX 扫描值. <BR>&nbsp; &nbsp; &nbsp; &nbsp; D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. <BR>&nbsp; &nbsp; &nbsp; &nbsp; Z标志 用来控制扫描或比较操作的结束. <BR>&nbsp; &nbsp; MOVS &nbsp; 串传送. <BR>&nbsp; &nbsp; &nbsp; &nbsp; ( MOVSB 传送字符. &nbsp; MOVSW 传送字. &nbsp; MOVSD 传送双字. ) <BR>&nbsp; &nbsp; CMPS &nbsp; 串比较. <BR>&nbsp; &nbsp; &nbsp; &nbsp; ( CMPSB 比较字符. &nbsp; CMPSW 比较字. ) <BR>&nbsp; &nbsp; SCAS &nbsp; 串扫描. <BR>&nbsp; &nbsp; &nbsp; &nbsp; 把AL或AX的内容与目标串作比较,比较结果反映在标志位. <BR>&nbsp; &nbsp; LODS &nbsp; 装入串. <BR>&nbsp; &nbsp; &nbsp; &nbsp; 把源串中的元素(字或字节)逐一装入AL或AX中. <BR>&nbsp; &nbsp; &nbsp; &nbsp; ( LODSB 传送字符. &nbsp; LODSW 传送字. &nbsp; LODSD 传送双字. ) <BR>&nbsp; &nbsp; STOS &nbsp; 保存串. <BR>&nbsp; &nbsp; &nbsp; &nbsp; 是LODS的逆过程. <BR>&nbsp; &nbsp; REP &nbsp; &nbsp; &nbsp; &nbsp; 当CX/ECX&lt;&gt;0时重复. <BR>&nbsp; &nbsp; REPE/REPZ &nbsp; &nbsp; 当ZF=1或比较结果相等,且CX/ECX&lt;&gt;0时重复. <BR>&nbsp; &nbsp; REPNE/REPNZ &nbsp; 当ZF=0或比较结果不相等,且CX/ECX&lt;&gt;0时重复. <BR>&nbsp; &nbsp; REPC &nbsp; &nbsp; &nbsp; 当CF=1且CX/ECX&lt;&gt;0时重复. <BR>&nbsp; &nbsp; REPNC &nbsp; &nbsp; &nbsp; 当CF=0且CX/ECX&lt;&gt;0时重复. <BR>五、程序转移指令 <BR>─────────────────────────────────────── <BR>&nbsp; 　1&gt;无条件转移指令 (长转移) <BR>&nbsp; &nbsp; JMP &nbsp; 无条件转移指令 <BR>&nbsp; &nbsp; CALL &nbsp; 过程调用 <BR>&nbsp; &nbsp; RET/RETF过程返回. <BR>&nbsp; 2&gt;条件转移指令 (短转移,-128到+127的距离内) <BR>&nbsp; &nbsp; ( 当且仅当(SF XOR OF)=1时,OP1&lt;OP2 ) <BR>&nbsp; &nbsp; JA/JNBE 不小于或不等于时转移. <BR>&nbsp; &nbsp; JAE/JNB 大于或等于转移. <BR>&nbsp; &nbsp; JB/JNAE 小于转移. <BR>&nbsp; &nbsp; JBE/JNA 小于或等于转移. <BR>&nbsp; &nbsp; &nbsp; 以上四条,测试无符号整数运算的结果(标志C和Z). <BR>&nbsp; &nbsp; JG/JNLE 大于转移. <BR>&nbsp; &nbsp; JGE/JNL 大于或等于转移. <BR>&nbsp; &nbsp; JL/JNGE 小于转移. <BR>&nbsp; &nbsp; JLE/JNG 小于或等于转移. <BR>&nbsp; &nbsp; &nbsp; 以上四条,测试带符号整数运算的结果(标志S,O和Z). <BR>&nbsp; &nbsp; JE/JZ 等于转移. <BR>&nbsp; &nbsp; JNE/JNZ 不等于时转移. <BR>&nbsp; &nbsp; JC &nbsp; &nbsp; 有进位时转移. <BR>&nbsp; &nbsp; JNC &nbsp; 无进位时转移. <BR>&nbsp; &nbsp; JNO &nbsp; 不溢出时转移. <BR>&nbsp; &nbsp; JNP/JPO 奇偶性为奇数时转移. <BR>&nbsp; &nbsp; JNS &nbsp; 符号位为 "0" 时转移. <BR>&nbsp; &nbsp; JO &nbsp; &nbsp; 溢出转移. <BR>&nbsp; &nbsp; JP/JPE 奇偶性为偶数时转移. <BR>&nbsp; &nbsp; JS &nbsp; &nbsp; 符号位为 "1" 时转移. <BR>&nbsp; 3&gt;循环控制指令(短转移) <BR>&nbsp; &nbsp; LOOP &nbsp; &nbsp; &nbsp; &nbsp; CX不为零时循环. <BR>&nbsp; &nbsp; LOOPE/LOOPZ &nbsp; CX不为零且标志Z=1时循环. <BR>&nbsp; &nbsp; LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. <BR>&nbsp; &nbsp; JCXZ &nbsp; &nbsp; &nbsp; &nbsp; CX为零时转移. <BR>&nbsp; &nbsp; JECXZ &nbsp; &nbsp; &nbsp; ECX为零时转移. <BR>&nbsp; 4&gt;中断指令 <BR>&nbsp; &nbsp; INT &nbsp; 中断指令 <BR>&nbsp; &nbsp; INTO &nbsp; 溢出中断 <BR>&nbsp; &nbsp; IRET &nbsp; 中断返回 <BR>&nbsp; 5&gt;处理器控制指令 <BR>&nbsp; &nbsp; HLT &nbsp; 处理器暂停, 直到出现中断或复位信号才继续. <BR>&nbsp; &nbsp; WAIT &nbsp; 当芯片引线TEST为高电平时使CPU进入等待状态. <BR>&nbsp; &nbsp; ESC &nbsp; 转换到外处理器. <BR>&nbsp; &nbsp; LOCK &nbsp; 封锁总线. <BR>&nbsp; &nbsp; NOP &nbsp; 空操作. <BR>&nbsp; &nbsp; STC &nbsp; 置进位标志位. <BR>&nbsp; &nbsp; CLC &nbsp; 清进位标志位. <BR>&nbsp; &nbsp; CMC &nbsp; 进位标志取反. <BR>&nbsp; &nbsp; STD &nbsp; 置方向标志位. <BR>&nbsp; &nbsp; CLD &nbsp; 清方向标志位. <BR>&nbsp; &nbsp; STI &nbsp; 置中断允许位. <BR>&nbsp; &nbsp; CLI &nbsp; 清中断允许位. <BR><BR>六、伪指令 <BR>─────────────────────────────────────── <BR>&nbsp; &nbsp; 　　DW &nbsp; &nbsp; 定义字(2字节). <BR>&nbsp; &nbsp; PROC &nbsp; 定义过程. <BR>&nbsp; &nbsp; ENDP &nbsp; 过程结束. <BR>&nbsp; &nbsp; SEGMENT 定义段. <BR>&nbsp; &nbsp; ASSUME 建立段寄存器寻址. <BR>&nbsp; &nbsp; ENDS &nbsp; 段结束. <BR>&nbsp; &nbsp; END &nbsp; 程序结束.<BR></SPAN><BR><BR><SPAN class=tpc_content>中断号 功能、触发条件或属性 <BR>8088中断向量 <BR>0H 除以零 <BR>1H 单步（用于DEBUG） <BR>2H 非屏蔽中断 <BR>3H 断点指令（用于DEBUG） <BR>4H 溢出 <BR>5H 打印屏幕 <BR>6H 保留 <BR>7H 保留 <BR>8259中断向量 <BR>8H 定时器 <BR>9H 键盘 <BR>AH 彩色/图形 <BR>BH 异步通讯（secondary） <BR>CH 异步通讯（primary） <BR>DH 硬磁盘 <BR>EH 软磁盘 <BR>FH 并行打印机 <BR>BIOS中断 <BR>10H 屏幕显示 <BR>11H 设备检验 <BR>12H 测定存储器容量 <BR>13H 磁盘I/O <BR>14H 串行通讯口I/O <BR>15H 盒式磁带I/O <BR>16H 键盘输入 <BR>17H 打印机输出 <BR>18H BASIC入口代码 <BR>19H 引导装入程序 <BR>1AH 日时钟 <BR>提供给用户的中断 <BR>1BH Ctrl-Break控制的软中断 <BR>1CH 定时器控制器的软中断 <BR>数据表指针 <BR>1DH 显示器参量表 <BR>1EH 软盘参量表 <BR>1FH 图形表 <BR>DOS中断 <BR>20H 程序结束 <BR>21H 系统功能调用 <BR>22H 结束退出 <BR>23H Ctrl-Break退出 <BR>24H 严重错误处理 <BR>25H 绝对磁盘读功能 <BR>26H 绝对磁盘写功能 <BR>27H 驻留退出 <BR>28H-2EH DOS保留 <BR>2FH 打印机 <BR>30H-3FH DOS保留 <BR><BR>BASIC中断<BR><BR>40H-5FH 保留 <BR>60H-67H 用户软中断 <BR>68H-7FH 保留 <BR>80H-85H 由BASIC保留 <BR>86H-F0H BASIC中断 <BR>F1H-FFH 保留</SPAN><BR><!----><BR><!----></P><img src ="http://www.cnitblog.com/ffan/aggbug/2340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ffan/" target="_blank">ffan</a> 2005-08-25 15:16 <a href="http://www.cnitblog.com/ffan/archive/2005/08/25/2340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DEBUG主要命令</title><link>http://www.cnitblog.com/ffan/archive/2005/08/20/2221.html</link><dc:creator>ffan</dc:creator><author>ffan</author><pubDate>Sat, 20 Aug 2005 11:21:00 GMT</pubDate><guid>http://www.cnitblog.com/ffan/archive/2005/08/20/2221.html</guid><wfw:comment>http://www.cnitblog.com/ffan/comments/2221.html</wfw:comment><comments>http://www.cnitblog.com/ffan/archive/2005/08/20/2221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ffan/comments/commentRss/2221.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ffan/services/trackbacks/2221.html</trackback:ping><description><![CDATA[<DIV class=art>
<P><FONT size=2>DEBUG是DOS中的一个外部命令，从DOS 1.0起就带有此命令，因此可见此命令的重要性了。虽然此命令的功能非常强大，可以解决许多问题，可是对许多人来说，尤其是初学者来说，却非常不易掌握。因此，现将DEBUG的命令详细介绍一番，以让大家知道它的使用。 </FONT></P>
<P><FONT size=2>Debug:A（汇编）</FONT></P>
<P><BR><FONT size=2>直接将 8086/8087/8088 记忆码合并到内存。</FONT></P>
<P><FONT size=2>该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式，必须按一到四个字符输入这些数值。在引用的操作代码（操作码）前指定前缀记忆码。</FONT></P>
<P><BR><FONT size=2>a [address]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>address</FONT></P>
<P><FONT size=2>指定键入汇编语言指令的位置。对 address 使用十六进制值，并键入不以“h”字符结尾的每个值。如果不指定地址，a 将在它上次停止处开始汇编。</FONT></P>
<P><FONT size=2>有关将数据输入到指定字节中的信息，请单击“相关主题”列表中的 Debug E（键入）。</FONT></P>
<P><FONT size=2>有关反汇编字节的信息，请单击“相关主题”列表中的 Debug U（反汇编）。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>使用记忆码</FONT></P>
<P><FONT size=2>段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如，使用 movsw 可以移动 16 位的字串，使用 movsb 可以移动 8 位字节串。</FONT></P>
<P><BR><FONT size=2>汇编跳转和调用</FONT></P>
<P><FONT size=2>汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用，如下例所示：</FONT></P>
<P><FONT size=2>-a0100:0500<BR>0100:0500 jmp 502 ; a 2-byte short jump<BR>0100:0502 jmp near 505 ; a 3-byte near jump<BR>0100:0505 jmp far 50a ; a 5-byte far jump</FONT></P>
<P><FONT size=2>可以将 near 前缀缩写为 ne。</FONT></P>
<P><BR><FONT size=2>区分字和字节内存位置</FONT></P>
<P><FONT size=2>当某个操作数可以引用某个字内存位置或者字节内存位置时，必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式：</FONT></P>
<P><FONT size=2>dec wo [si]<BR>neg byte ptr [128]</FONT></P>
<P><BR><FONT size=2>指定操作数</FONT></P>
<P><FONT size=2>Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式：</FONT></P>
<P><FONT size=2>mov ax,21 ; load AX with 21h<BR>mov ax,[21] ; load AX with the<BR>; contents of<BR>; memory location 21h</FONT></P>
<P><BR><FONT size=2>使用伪指令</FONT></P>
<P><FONT size=2>使用 a 命令提供两个常用的伪指令：db 操作码，将字节值直接汇编到内存，dw 操作码，将字值直接汇编到内存。以下是两个伪指令的范例：</FONT></P>
<P><FONT size=2>db 1,2,3,4,"THIS IS AN EXAMPLE"<BR>db 'THIS IS A QUOTATION MARK:"'<BR>db "THIS IS A QUOTATION MARK:'"<BR>dw 1000,2000,3000,"BACH"</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>a 命令支持所有形式的间接注册命令，如下例所示：</FONT></P>
<P><FONT size=2>add bx,34[bp+2].[si-1]<BR>pop [bp+di]<BR>push [si] )</FONT></P>
<P><FONT size=2>还支持所有操作码同义词，如下例所示：</FONT></P>
<P><FONT size=2>loopz 100<BR>loope 100<BR>ja 200<BR>jnbe 200</FONT></P>
<P><FONT size=2>对于 8087 操作码，必须指定 wait 或 fwait 前缀，如下例所示：</FONT></P>
<P><FONT size=2>fwait fadd st,st(3) ; this line assembles<BR>; an fwait prefix</FONT></P>
<P><BR><FONT size=2>Debug:C（比较）</FONT></P>
<P><BR><FONT size=2>比较内存的两个部分。</FONT></P>
<P><BR><FONT size=2>c range address</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>range</FONT></P>
<P><FONT size=2>指定要比较的内存第一个区域的起始和结束地址，或起始地址和长度。有关有效的 range 值的信息，请单击“相关主题”列表中的“Debug 说明”。</FONT></P>
<P><FONT size=2>address</FONT></P>
<P><FONT size=2>指定要比较的第二个内存区域的起始地址。有关有效 address 值的信息，请单击“相关主题”列表中的“Debug 说明”。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>如果 range 和 address 内存区域相同，Debug 将不显示任何内容而直接返回到 Debug 提示符。如果有差异，Debug 将按如下格式显示：<BR>address1 byte1 byte2 addess2</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2>以下命令具有相同效果：</FONT></P>
<P><FONT size=2>c100,10f 300<BR>c100l10 300</FONT></P>
<P><FONT size=2>每个命令都对 100h 到 10Fh 的内存数据块与 300h 到 30Fh 的内存数据块进行比较。</FONT></P>
<P><FONT size=2>Debug 响应前面的命令并显示如下信息（假定 DS = 197F）：</FONT></P>
<P><FONT size=2>197F:0100 4D E4 197F:0300<BR>197F:0101 67 99 197F:0301<BR>197F:0102 A3 27 197F:0302<BR>197F:0103 35 F3 197F:0303<BR>197F:0104 97 BD 197F:0304<BR>197F:0105 04 35 197F:0305<BR>197F:0107 76 71 197F:0307<BR>197F:0108 E6 11 197F:0308<BR>197F:0109 19 2C 197F:0309<BR>197F:010A 80 0A 197F:030A<BR>197F:010B 36 7F 197F:030B<BR>197F:010C BE 22 197F:030C<BR>197F:010D 83 93 197F:030D<BR>197F:010E 49 77 197F:030E<BR>197F:010F 4F 8A 197F:030F</FONT></P>
<P><FONT size=2>注意列表中缺少地址 197F:0106 和 197F:0306。这表明那些地址中的值是相同的。</FONT></P>
<P><BR><FONT size=2>Debug:D（转储）</FONT></P>
<P><BR><FONT size=2>显示一定范围内存地址的内容。</FONT></P>
<P><BR><FONT size=2>d [range]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>range</FONT></P>
<P><FONT size=2>指定要显示其内容的内存区域的起始和结束地址，或起始地址和长度。有关有效的 range 值的信息，请单击“相关主题”列表中的“Debug 说明”。如果不指定 range，Debug 程序将从以前 d 命令中所指定的地址范围的末尾开始显示 128 个字节的内容。</FONT></P>
<P><FONT size=2>有关显示寄存器内容的信息，请单击“相关主题”列表中的 Debug R（寄存器）。</FONT></P>
<P><BR><FONT size=2>说明<BR>当使用 d 命令时，Debug 以两个部分显示内存内容：十六进制部分（每个字节的值都用十六进制格式表示）和 ASCII 码部分（每个字节的值都用 ASCII 码字符表示)。每个非打印字符在显示的 ASCII 部分由句号 (.) 表示。每个显示行显示 16 字节的内容，第 8 字节和第 9 字节之间有一个连字符。每个显示行从 16 字节的边界上开始。</FONT></P>
<P><FONT size=2>范例<BR>假定键入以下命令：<BR>dcs:100 10f<BR>Debug 按以下格式显示范围中的内容：<BR>04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00 TOM.SAWYER......<BR>如果在没有参数的情况下键入 d 命令，Debug 按以前范例中所描述的内容来编排显示格式。显示的每行以比前一行的地址大 16 个字节（如果是显示 40 列的屏幕，则为 8 个字节）的地址开头。<BR>对于后面键入的每个不带参数的 d 命令，Debug 将紧接在最后显示的命令后立即显示字节内容。<BR>如果键入以下命令，Debug 将从 CS:100 开始显示 20h 个字节的内容：<BR>dcs:100 l 20<BR>如果键入以下命令，Debug 将显示范围从 CS 段的 100h 到 115h 中所有字节的内容：<BR>dcs:100 115</FONT></P>
<P><FONT size=2>Debug:E（键入）</FONT></P>
<P><FONT size=2>将数据输入到内存中指定的地址。<BR>可以按十六进制或 ASCII 格式键入数据。以前存储在指定位置的任何数据全部丢失。</FONT></P>
<P><FONT size=2>e address [list]</FONT></P>
<P><FONT size=2>参数<BR>address<BR>指定输入数据的第一个内存位置。<BR>list<BR>指定要输入到内存的连续字节中的数据。<BR>有关集成记忆码的信息，请单击“相关主题”列表中的 Debug A（汇编）。<BR>有关显示内存部分内容的信息，请单击“相关主题”列表中的 Debug D （转储）。</FONT></P>
<P><FONT size=2>说明</FONT></P>
<P><FONT size=2>使用 address 参数</FONT></P>
<P><FONT size=2>如果在没有指定可选的 list 参数的值情况下指定 address 的值，Debug 将显示地址和内容，在下一行重复地址，并等待您的输入。此时，您可以执行下列操作之一：</FONT></P>
<P><FONT size=2>替换字节值。为此，请在当前值后键入新值。如果您键入的值不是有效的十六进制值，或该值包含两个以上的数字，则 Debug 不会回显无效或额外的字符。<BR>进入下一个字节。为此，请按 SPACEBAR（空格键）。要更改该字节中的值，请在当前值后键入新值。如果按 SPACEBAR（空格键）时，移动超过了 8 位界限，Debug 程序将显示新的一行并在行首显示新地址。<BR>返回到前一个字节。为此，请按 HYPHEN 键 (-)。可以反复按 HYPHEN 键 (-) 向后移动超过多个字节。在按 HYPHEN 时，Debug 开始新行并显示当前地址和字节值。<BR>停止执行 e 命令。为此，请按 ENTER 键。在任何字节位置都可以按 ENTER。<BR>使用 list 参数</FONT></P>
<P><FONT size=2>如果指定 list 参数的值，随后的 e 命令将使用列表中的值替换现有的字节值。如果发生错误，将不更改任何字节值。</FONT></P>
<P><FONT size=2>List 值可以是十六进制字节或字符串。使用空格、逗号或制表符来分隔值。必须将字符串包括在单或双引号中。</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定键入以下命令：</FONT></P>
<P><FONT size=2>ecs:100</FONT></P>
<P><FONT size=2>Debug 按下面的格式显示第一个字节的内容：</FONT></P>
<P><FONT size=2>04BA:0100 EB.</FONT></P>
<P><FONT size=2>要将该值更改为 41，请在插入点键入 41，如下所示：</FONT></P>
<P><FONT size=2>04BA:0100 EB.41_</FONT></P>
<P><FONT size=2>可以用一个 e 命令键入连续的字节值。在键入新值后按 SPACEBAR（空格键），而不是按 ENTER 键。Debug 显示下一个值。在此范例中，如果按三次 SPACEBAR（空格键），Debug 将显示下面的值：</FONT></P>
<P><FONT size=2>04BA:0100 EB.41 10. 00. BC._</FONT></P>
<P><FONT size=2>要将十六进制值 BC 更改为 42，请在插入点键入 42，如下所示：</FONT></P>
<P><FONT size=2>04BA:0100 EB.41 10. 00. BC.42_</FONT></P>
<P><FONT size=2>假定决定值 10 应该是 6F。要纠正该值，请按 HYPHEN 键两次以返回到地址 0101（值 10）。Debug 显示以下内容：</FONT></P>
<P><FONT size=2>04BA:0100 EB.41 10. 00. BC.42-<BR>04BA:0102 00.-<BR>04BA:0101 10._</FONT></P>
<P><FONT size=2>在插入点键入 6f 更改值，如下所示：</FONT></P>
<P><FONT size=2>04BA:0101 10.6f_</FONT></P>
<P><FONT size=2>按 ENTER 停止 e 命令并返回到 Debug 提示符下。</FONT></P>
<P><FONT size=2>以下是字符串项的范例：</FONT></P>
<P><FONT size=2>eds:100 "This is the text example"</FONT></P>
<P><FONT size=2>该字符串将从 DS:100 开始填充 24 个字节</FONT></P>
<P><FONT size=2>Debug:F（填充）</FONT></P>
<P><FONT size=2>使用指定的值填充指定内存区域中的地址。</FONT></P>
<P><FONT size=2>可以指定十六进制或 ASCII 格式表示的数据。任何以前存储在指定位置的数据将会丢失。</FONT></P>
<P><BR><FONT size=2>f range list</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>range</FONT></P>
<P><FONT size=2>指定要填充内存区域的起始和结束地址，或起始地址和长度。关于有效的 range 值的信息，请单击“相关主题”列表中的“Debug 说明”。</FONT></P>
<P><FONT size=2>list</FONT></P>
<P><FONT size=2>指定要输入的数据。List 可以由十六进制数或引号包括起来的字符串组成。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>使用 range 参数</FONT></P>
<P><FONT size=2>如果 range 包含的字节数比 list 中的数值大，Debug 将在 list 中反复指派值，直到 range 中的所有字节全部填充。</FONT></P>
<P><FONT size=2>如果在 range 中的任何内存损坏或不存在，Debug 将显示错误消息并停止 f 命令。</FONT></P>
<P><BR><FONT size=2>使用 list 参数</FONT></P>
<P><FONT size=2>如果 list 包含的数值多于 range 中的字节数，Debug 将忽略 list 中额外的值。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定键入以下命令：</FONT></P>
<P><FONT size=2>f04ba:100l100 42 45 52 54 41</FONT></P>
<P><FONT size=2>作为响应，Debug 使用指定的值填充从 04BA:100 到 04BA:1FF 的内存位置。Debug 重复这五个值直到 100h 个字节全部填满为止。</FONT></P>
<P><BR><FONT size=2>Debug:G（转向）</FONT></P>
<P><BR><FONT size=2>运行当前在内存中的程序。</FONT></P>
<P><BR><FONT size=2>g [=address] [breakpoints]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>=address</FONT></P>
<P><FONT size=2>指定当前在内存中要开始执行的程序地址。如果不指定 address，Windows 2000 将从 CS:IP 寄存器中的当前地址开始执行程序。</FONT></P>
<P><FONT size=2>breakpoints</FONT></P>
<P><FONT size=2>指定可以设置为 g 命令的部分的 1 到 10 个临时断点。</FONT></P>
<P><FONT size=2>有关执行循环、重复的字符串指令、软件中断或子程序的信息，请单击“相关主题”列表中的 Debug P（执行）。</FONT></P>
<P><FONT size=2>有关执行指令的信息，请单击“相关主题”列表中的 Debug T（跟踪）。</FONT></P>
<P><FONT size=2>Debug:H（十六进制）</FONT></P>
<P><FONT size=2>对指定的两个参数执行十六进制运算。</FONT></P>
<P><BR><FONT size=2>h value1 value2</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>value1</FONT></P>
<P><FONT size=2>代表从 0 到 FFFFh 范围内的任何十六进制数字。</FONT></P>
<P><FONT size=2>value2</FONT></P>
<P><FONT size=2>代表从 0 到 FFFFh 范围内第二个十六进制数字。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>Debug 首先将指定的两个参数相加，然后从第一个参数中减去第二个参数。这些计算的结果显示在一行中：先计算和，然后计算差。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定键入以下命令：</FONT></P>
<P><FONT size=2>h19f 10a</FONT></P>
<P><FONT size=2>Debug 执行运算并显示以下结果。<BR>02A9 0095</FONT></P>
<P><FONT size=2>Debug:I（输入）</FONT></P>
<P><BR><FONT size=2>从指定的端口读取并显示一个字节值。</FONT></P>
<P><FONT size=2>i port</FONT></P>
<P><FONT size=2>参数</FONT></P>
<P><FONT size=2>port</FONT></P>
<P><FONT size=2>按地址指定输入端口。地址可以是 16 位的值。</FONT></P>
<P><FONT size=2>有关将字节值发送到输出端口的信息，请单击“相关主题”列表中的 Debug O（输出）。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定键入以下命令：</FONT></P>
<P><FONT size=2>i2f8</FONT></P>
<P><FONT size=2>同时假定端口的字节值是 42h。Debug 读取该字节，并将其值显示如下：<BR>42</FONT></P>
<P><BR><FONT size=2>Debug:L（加载）</FONT></P>
<P><FONT size=2>将某个文件或特定磁盘扇区的内容加载到内存。</FONT></P>
<P><FONT size=2>要从磁盘文件加载 BX:CX 寄存器中指定的字节数内容，请使用以下语法：</FONT></P>
<P><FONT size=2>l [address]</FONT></P>
<P><FONT size=2>要略过 Windows 2000 文件系统并直接加载特定的扇区，请使用以下语法：</FONT></P>
<P><FONT size=2>l address drive start number</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>address</FONT></P>
<P><FONT size=2>指定要在其中加载文件或扇区内容的内存位置。如果不指定 address，Debug 将使用 CS 寄存器中的当前地址。</FONT></P>
<P><FONT size=2>drive</FONT></P>
<P><FONT size=2>指定包含读取指定扇区的磁盘的驱动器。该值是数值型：0 = A, 1 = B, 2 = C 等。</FONT></P>
<P><FONT size=2>start</FONT></P>
<P><FONT size=2>指定要加载其内容的第一个扇区的十六进制数。</FONT></P>
<P><FONT size=2>number</FONT></P>
<P><FONT size=2>指定要加载其内容的连续扇区的十六进制数。只有要加载特定扇区的内容而不是加载 debug 命令行或最近的 Debug n（名称）命令中指定的文件时，才能使用 drive、start 和 number 参数。</FONT></P>
<P><FONT size=2>有关指定用于 l 命令的文件的信息，请单击“相关主题”列表中的 Debug n（名称）。</FONT></P>
<P><FONT size=2>有关写入调试到磁盘的文件的信息，请单击“相关主题”列表中的 Debug w（写入）。</FONT></P>
<P><BR><FONT size=2>注意</FONT></P>
<P><FONT size=2>使用不带参数的 l 命令</FONT></P>
<P><FONT size=2>当使用不带参数的 l 命令时，在 debug 命令行上指定的文件将加载到内存中，从地址 CS:100 开始。Debug 同时将 BX 和 CX 寄存器设置为加载的字节数。如果不在 debug 命令行指定文件，所装入的文件将是最近使用 n 命令经常指定的文件。</FONT></P>
<P><BR><FONT size=2>使用具有 address 参数的 1 命令</FONT></P>
<P><FONT size=2>如果使用带 address 参数的 l 命令，Debug 将从内存位置 address 开始加载文件或指定扇区的内容。</FONT></P>
<P><BR><FONT size=2>使用带全部参数的 l 命令</FONT></P>
<P><FONT size=2>如果使用带所有参数的 l 命令，Debug 将加载指定磁盘扇区的内容而不是加载文件。</FONT></P>
<P><BR><FONT size=2>加载特定扇区的内容</FONT></P>
<P><FONT size=2>指定范围内的每个扇区均从 drive 读取。Debug 从 start 开始加载，直到在 number 中指定的扇区数中的内容全部被加载。</FONT></P>
<P><BR><FONT size=2>加载 .exe 文件</FONT></P>
<P><FONT size=2>Debug 忽略 .exe 文件的地址 address 参数。如果指定 .exe 文件，Debug 将文件重新定位到 .exe 文件的标题中指定的加载地址。在 .exe 文件被加载到内存前，标题自身从 .exe 文件脱离，因此磁盘上的 .exe 文件大小与内存中的不同。如果要检查整个 .exe 文件，请使用不同的扩展名重命名文件。</FONT></P>
<P><BR><FONT size=2>打开十六进制文件</FONT></P>
<P><FONT size=2>Debug 将具有 .hex 扩展名的文件认为十六进制格式文件。键入不带参数的 l 命令，可以加载从十六进制文件中指定的地址处开始的十六进制文件。如果键入的 l 命令包含 address 参数，Debug 将把指定的地址加到在十六进制文件中找到的地址上，以确定起始地址。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定启动 Debug 并键入以下命令：</FONT></P>
<P><FONT size=2>nfile.com</FONT></P>
<P><FONT size=2>现在可以键入 l 命令以加载 File.com。Debug 将加载文件并显示 Debug 提示符。</FONT></P>
<P><FONT size=2>假定需要从驱动器 C 将起始逻辑扇区为 15 (0Fh) 的 109 (6Dh) 个扇区的内容加载到起始地址为 04BA:0100 的内存中。为此，请键入以下命令：<BR>l04ba:100 2 0f 6d</FONT></P>
<P><BR><FONT size=2>Debug:M（移动）</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>将一个内存块中的内容复制到另一个内存块中。</FONT></P>
<P><FONT size=2>m range address</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>range</FONT></P>
<P><FONT size=2>指定要复制内容的内存区域的起始和结束地址，或起始地址和长度。</FONT></P>
<P><FONT size=2>address</FONT></P>
<P><FONT size=2>指定要将 range 内容复制到该位置的起始地址。</FONT></P>
<P><FONT size=2>说明</FONT></P>
<P><FONT size=2>复制操作对现有数据的影响</FONT></P>
<P><FONT size=2>如果新数据没有写入正在被复制的数据块中的地址，则源数据将保持不变。但是，如果目标块已经包含数据(就象它在覆盖副本操作中一样)，则将改写该数据。（覆盖复制操作是指那些目标数据块部分内容覆盖原数据块部分内容的操作。）</FONT></P>
<P><BR><FONT size=2>执行覆盖复制操作</FONT></P>
<P><FONT size=2>m 命令执行目标地址的覆盖复制操作，而不丢失数据。将改写的地址内容首先复制。因此，如果将较高位地址的数据复制到较低位地址，则复制操作从原块的最低位地址开始并向最高位地址进行。反之，如果要将数据从低地址复制到高地址，复制操作从原块的最高地址开始，向最低地址进行。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定键入以下命令：</FONT></P>
<P><FONT size=2>mcs:100 110 cs:500<BR>Debug 首先将 CS:110 地址中的内容复制到地址 CS:510 中，然后将 CS:10F 地址中的内容复制到 CS:50F 中，如此操作直至将 CS:100 地址中的内容复制到地址 CS:500 中。要查看结果，请使用 Debug d（转储）命令，并使用 m 命令指定目标地址</FONT></P>
<P><FONT size=2>Debug:N（名称）</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>指定 Debug l（加载）或 w（写入）命令的可执行文件的名称，或者指定正在调试的可执行文件的参数。</FONT></P>
<P><BR><FONT size=2>n [drive:][path] filename</FONT></P>
<P><BR><FONT size=2>要指定测试的可执行文件的参数，请使用以下语法：</FONT></P>
<P><FONT size=2>n file-parameters</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>如果在没有参数的情况下使用，则 n 命令清除当前规范。<BR>[drive:][path] filename</FONT></P>
<P><FONT size=2>指定要测试的可执行文件的位置和名称。</FONT></P>
<P><FONT size=2>file-parameters</FONT></P>
<P><FONT size=2>为正在测试的可执行文件指定参数和开关。</FONT></P>
<P><FONT size=2>有关将文件或指定磁盘扇区的内容加载到内存中的信息，请单击“相关主题”列表中的 Debug L（加载）。</FONT></P>
<P><FONT size=2>有关写入调试到磁盘的文件的信息，请单击“相关主题”列表中的 Debug W（写入）。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>n 命令的两个用途</FONT></P>
<P><FONT size=2>可以按两种方式使用 n 命令。首先，您可以使用它以指定后面的 l（加载）或 w（写入）命令所使用的文件。如果在没有命名所调试文件的情况下启动 Debug，必须在使用 l 命令加载文件之前使用命令 nfilename。在 CS:5C 为文件控制块 (FCB) 正确编排文件名的格式。其次，可以使用 n 命令指定被调试文件的命令行参数和开关。</FONT></P>
<P><BR><FONT size=2>内存区域</FONT></P>
<P><FONT size=2>以下四个内存区域都会受到 n 命令的影响：</FONT></P>
<P><FONT size=2>内存位置<BR>内容</FONT></P>
<P><FONT size=2>CS:5C<BR>文件 1 的文件控制数据块 (FCB)</FONT></P>
<P><FONT size=2>CS:6C<BR>文件 2 的文件控制数据块 (FCB)</FONT></P>
<P><FONT size=2>CS:80<BR>n 命令行的长度（以字符表示）</FONT></P>
<P><FONT size=2>CS:81<BR>n 命令行字符的开头</FONT></P>
<P><BR><FONT size=2>为 n 命令指定的第一个文件名被放在 CS:5C 的 FCB 中。如果指定第二个文件名，此名称将放置到 CS:6C 的 FCB 中。n 命令行上键入的字符数（除第一个字符之外，n）存储在位置 CS:80。n 命令行上的实际字符（再次，除了字母 n 之外）存储在以 CS:81 开头的位置。注意这些字符可以是在 Windows 2000 命令提示符下键入的命令中有效的任何开关和分隔符。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定已经启动 Debug，并加载了正在调试的程序 Prog.com。接着您决定为 Prog.com 指定两个参数并运行此程序。以下是此范例的命令序列：</FONT></P>
<P><FONT size=2>debug prog.com<BR>nparam1 param2<BR>g</FONT></P>
<P><FONT size=2>在这种情况下，Debug g（转向）命令会运行该程序，就好像您已在 Windows 2000 命令提示符后键入了如下命令：</FONT></P>
<P><FONT size=2>prog param1 param2</FONT></P>
<P><FONT size=2>所以，测试和调试反映 Prog.com 通常的运行时间环境。</FONT></P>
<P><FONT size=2>在下面的命令序列中，第一个 n 命令将 File1.exe 指定为后接的 l（加载）命令的文件，该命令将 File1.exe 加载到内存。第二个 n 命令指定 File1.exe 将使用的参数。最后，g 命令将运行 File1.exe 文件，就好像您在 Windows 2000 命令行中键入了 File1 File2.dat File2.dat 一样。</FONT></P>
<P><FONT size=2>nfile1.exe<BR>l<BR>nfile2.dat file3.dat<BR>g</FONT></P>
<P><FONT size=2>注意<BR>不要在 n 命令的第二种形式后使用 l 命令。还要注意，如果现在使用 w（写入）命令，Windows 2000 将使用名称 File2.dat 保存正在调试的文件 File1.exe。为避免出现此结果，应该总是在 l 或 w 命令之前立即使用 n 命令的第一种形式。</FONT></P>
<P><FONT size=2>Debug:O（输出）</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>将字节值发送到输出端口。</FONT></P>
<P><BR><FONT size=2>o port byte-value</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>port</FONT></P>
<P><FONT size=2>通过地址指定输出端口。端口地址可以是 16 位值。</FONT></P>
<P><FONT size=2>byte-value</FONT></P>
<P><FONT size=2>指定要指向 port 的字节值。</FONT></P>
<P><FONT size=2>有关从输入端口读取字节值的信息，请单击“相关主题”列表中的 Debug I（输入）。</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2>要将字节值 4Fh 发送到地址为 2F8h 的输出端口，请键入以下命令：<BR>o2f8 4f</FONT></P>
<P><FONT size=2>Debug:P（执行）</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>执行循环、重复的字符串指令、软件中断或子例程；或通过任何其他指令跟踪。</FONT></P>
<P><BR><FONT size=2>p [= address] [number]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>=address</FONT></P>
<P><FONT size=2>指定第一个要执行指令的位置。如果不指定地址，则默认地址是在 CS:IP 寄存器中指定的当前地址。</FONT></P>
<P><FONT size=2>number</FONT></P>
<P><FONT size=2>指定在将控制返回给 Debug 之前要执行的指令数。默认值为 1。</FONT></P>
<P><FONT size=2>有关运行当前在内存中程序的信息，请单击“相关主题”列表中的 Debug G（转向）。</FONT></P>
<P><FONT size=2>有关执行指令的信息，请单击“相关主题”列表中的 Debug T（跟踪）。</FONT></P>
<P><BR><FONT size=2>说明<BR>控制传送到要测试的程序</FONT></P>
<P><FONT size=2>当 p 命令将控制从 Debug 传送到要测试的程序时，该程序不间断运行，直到循环、重复字符串指令、软件中断或者完成了指定地址的子例程为止，或者直到执行了指定数量的机器指令为止。控制返回到 Debug。</FONT></P>
<P><FONT size=2>地址参数的限制</FONT></P>
<P><FONT size=2>如果 address 参数没有指定段，Debug 将使用被测试程序的 CS 寄存器。如果省略 address，程序将从 CS:IP 寄存器所指定的地址开始执行。必须在 address 参数之前使用等号 (=) 以便将它与 number 参数区分。如果在指定地址处的指令不是循环、重复的字符串指令、软件中断或子例程，则 p 命令与 Debug t（跟踪）命令的作用相同。</FONT></P>
<P><FONT size=2>使用 p 命令显示的邮件</FONT></P>
<P><FONT size=2>当 p 执行完一段说明后，Debug 显示出程序的寄存器内容、标志的状态以及下一段将要被执行的指令的解码形式。</FONT></P>
<P><BR><FONT size=2>警告</FONT></P>
<P><FONT size=2>不能使用 p 命令跟踪只读内存 (ROM)。</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定正在测试的程序在地址 CS:143F 处包含一个 call 指令。要运行 call 目标位置的子程序然后将控制返回到 Debug，请键入以下命令：</FONT></P>
<P><FONT size=2>p=143f</FONT></P>
<P><FONT size=2>Debug 按以下格式显示结果：<BR>AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000<BR>DS=2246 ES=2246 SS=2246 CS=2246 IP=1443 NV UP EI PL NZ AC PO NC<BR>2246:1442 7505 JNZ 144A</FONT></P>
<P><FONT size=2>Debug:Q（退出）</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>停止 Debug 会话，不保存当前测试的文件。</FONT></P>
<P><FONT size=2>当您键入 q 以后，控制返回到 Windows 2000 的命令提示符。</FONT></P>
<P><BR><FONT size=2>q</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>该命令不带参数。<BR>有关保存文件的信息，请单击“相关主题”列表中的 Debug W（写入）。</FONT></P>
<P><FONT size=2>Debug:R（寄存器）</FONT></P>
<P><BR><FONT size=2>显示或改变一个或多个 CPU 寄存器的内容。</FONT></P>
<P><BR><FONT size=2>r [register-name]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>无</FONT></P>
<P><FONT size=2>如果在没有参数的情况下使用，则 r 命令显示所有寄存器的内容以及寄存器存储区域中的标志。</FONT></P>
<P><FONT size=2>register-name</FONT></P>
<P><FONT size=2>指定要显示其内容的寄存器名。</FONT></P>
<P><FONT size=2>有关显示内存部分内容的信息，请单击“相关主题”列表中的 Debug D（转储）。</FONT></P>
<P><FONT size=2>有关反汇编字节的信息，请单击“相关主题”列表中的 Debug U（反汇编）。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>使用 r 命令</FONT></P>
<P><FONT size=2>如果指定了寄存器名称，Windows 2000 将显示以十六进制标记表示的寄存器的 16 位值，并将冒号显示为提示符。如果要更改包含在寄存器中的值，除非键入新值并按 ENTER 键；否则，请按 ENTER 键返回 Debug 提示符。</FONT></P>
<P><FONT size=2>有效寄存器名</FONT></P>
<P><FONT size=2>以下是 register-name 的有效值：ax、bx、cx、dx、sp、bp、si、di、ds、es、ss、cs、ip、pc 及 f。ip 和 pc 都引用指令指针。</FONT></P>
<P><FONT size=2>如果指定寄存器名称，而不是从前面的列表中指定，Windows 2000 将显示以下消息：</FONT></P>
<P><FONT size=2>br error</FONT></P>
<P><FONT size=2>使用 f 字符而不是寄存器名</FONT></P>
<P><FONT size=2>如果键入 f 字符代替寄存器名，Debug 将每个标记的当前设置显示为两字母代码，然后显示 Debug 提示符。要更改标志的设置，请从下表中键入适当的两字母代码：</FONT></P>
<P><FONT size=2>标志名<BR>设置<BR>清除</FONT></P>
<P><FONT size=2>溢出<BR>ov<BR>nv</FONT></P>
<P><FONT size=2>方向<BR>dn（减）<BR>up（增）</FONT></P>
<P><FONT size=2>中断<BR>ei（启用）<BR>di（禁用）</FONT></P>
<P><FONT size=2>正负<BR>ng（负）<BR>pl（正）</FONT></P>
<P><FONT size=2>零<BR>zr<BR>nz</FONT></P>
<P><FONT size=2>辅助进位<BR>ac<BR>na</FONT></P>
<P><FONT size=2>奇偶校验<BR>pe（偶校验）<BR>po（奇校验）</FONT></P>
<P><FONT size=2>进位<BR>cy<BR>nc</FONT></P>
<P><BR><FONT size=2>可以按任何顺序键入新的标志值。不需要在这些值之间留出空格。要停止 r 命令，请按 ENTER 键。任何没有指定新值的标志保持不变。</FONT></P>
<P><FONT size=2>用 r 命令显示的邮件</FONT></P>
<P><FONT size=2>如果为标记指定了多个值，Debug 将显示以下消息：</FONT></P>
<P><FONT size=2>df error</FONT></P>
<P><FONT size=2>如果指定没有在前面的表中列出的标志代码，Debug 将显示以下消息：</FONT></P>
<P><FONT size=2>bf error</FONT></P>
<P><FONT size=2>在这两种情况下，Debug 将忽略所有在无效项目之后指定的设置。</FONT></P>
<P><FONT size=2>Debug 的默认设置</FONT></P>
<P><FONT size=2>在启动 Debug 时，会将段寄存器设置到空闲内存的低端，指令指针设置为 0100h，清除所有标志，并且将其余寄存器设置为零，除了被设置为 FFEEh 的 sp 之外。</FONT></P>
<P><FONT size=2>Debug:R</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>要查看所有寄存器的内容、所有标记的状态和当前位置的指令解码表，请键入以下命令：</FONT></P>
<P><FONT size=2>r</FONT></P>
<P><FONT size=2>如果当前位置是 CS:11A，显示外观将类似于以下内容：</FONT></P>
<P><FONT size=2>AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000<BR>DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC<BR>04BA:011A CD21 INT 21</FONT></P>
<P><FONT size=2>要只查看标志的状态，请键入以下命令：</FONT></P>
<P><FONT size=2>rf</FONT></P>
<P><FONT size=2>Debug 按以下格式显示信息：</FONT></P>
<P><FONT size=2>NV UP DI NG NZ AC PE NC - _</FONT></P>
<P><FONT size=2>现在，您可以按任意顺序键入一个或多个有效的标志值，其中可以有或没有空格，如下所示：</FONT></P>
<P><FONT size=2>nv up di ng nz ac pe nc - pleicy</FONT></P>
<P><FONT size=2>Debug 结束 r 命令并显示 Debug 提示符。要查看更改，请键入 r 或 rf 命令。Debug 将显示以下内容：</FONT></P>
<P><FONT size=2>NV UP EI PL NZ AC PE CY - _<BR>按 ENTER 返回到 Debug 提示符。</FONT></P>
<P><FONT size=2>Debug:S（搜索）</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>在某个地址范围搜索一个或多个字节值的模式。</FONT></P>
<P><BR><FONT size=2>s range list</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>range</FONT></P>
<P><FONT size=2>指定要搜索范围的开始和结束地址。有关 range 参数有效值的信息，请单击“相关主题”列表中的 Debug。</FONT></P>
<P><FONT size=2>list</FONT></P>
<P><FONT size=2>指定一个或多个字节值的模式，或要搜索的字符串。用空格或逗号分隔每个字节值和下一个字节值。将字符串值包括在引号中。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>如果 list 参数包含多个字节值，Debug 将只显示出现字节值的第一个地址。如果 list 只包含一个字节值，Debug 将显示指定范围内出现该值的所有地址。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定需要查找包含值 41 并且范围从 CS:100 到 CS:110 的所有地址。为此，请键入以下命令：</FONT></P>
<P><FONT size=2>scs:100 110 41</FONT></P>
<P><FONT size=2>Debug 按以下格式显示结果：</FONT></P>
<P><FONT size=2>04BA:0104<BR>04BA:010D<BR>-</FONT></P>
<P><FONT size=2>以下命令在 CS:100 到 CS:1A0 的范围内搜索字符串“Ph”。<BR>scs:100 1a0 "Ph"</FONT></P>
<P><FONT size=2>Debug:U（反汇编）</FONT></P>
<P><BR><FONT size=2>反汇编字节并显示相应的原语句，其中包括地址和字节值。反汇编代码看起来象已汇编文件的列表。</FONT></P>
<P><BR><FONT size=2>u [range]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>无</FONT></P>
<P><FONT size=2>如果在没有参数的情况下使用，则 u 命令分解 20h 字节（默认值），从前面 u 命令所显示地址后的第一个地址开始。</FONT></P>
<P><FONT size=2>range</FONT></P>
<P><FONT size=2>指定要反汇编代码的起始地址和结束地址，或起始地址和长度。有关 range 参数有效值的信息，请单击“相关主题”列表中的 Debug。</FONT></P>
<P><FONT size=2>有关集成记忆码的信息，请单击“相关主题”列表中的 Debug A（汇编）。</FONT></P>
<P><FONT size=2>有关显示内存部分内容的信息，请单击“相关主题”列表中的 Debug D（转储）。</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>要反汇编 16 (10h) 字节，从地址 04BA:0100 开始，请键入以下命令：</FONT></P>
<P><FONT size=2>u04ba:100l10</FONT></P>
<P><FONT size=2>Debug 按以下格式显示结果：</FONT></P>
<P><FONT size=2>04BA:0100 206472 AND [SI+72],AH<BR>04BA:0103 69 DB 69<BR>04BA:0104 7665 JBE 016B<BR>04BA:0106 207370 AND [BP+DI+70],DH<BR>04BA:0109 65 DB 65<BR>04BA:010A 63 DB 63<BR>04BA:010B 69 DB 69<BR>04BA:010C 66 DB 66<BR>04BA:010D 69 DB 69<BR>04BA:010E 63 DB 63<BR>04BA:010F 61 DB 61</FONT></P>
<P><FONT size=2>如果只显示从 04BA:0100 到 04BA:0108 特定地址的信息，请键入以下命令：</FONT></P>
<P><FONT size=2>u04ba:0100 0108</FONT></P>
<P><FONT size=2>Debug 显示以下内容：</FONT></P>
<P><FONT size=2>04BA:0100 206472 AND [SI+72],AH<BR>04BA:0103 69 DB 69<BR>04BA:0104 7665 JBE 016B<BR>04BA:0106 207370 AND [BP+DI+70],DH</FONT></P>
<P><FONT size=2>Debug:W（写入）</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>将文件或特定分区写入磁盘。</FONT></P>
<P><FONT size=2>要将在 BX:CX 寄存器中指定字节数的内容写入磁盘文件，请使用以下语法：</FONT></P>
<P><BR><FONT size=2>w [address]</FONT></P>
<P><BR><FONT size=2>要略过 Windows 2000 文件系统并直接写入特定的扇区，请使用以下语法：</FONT></P>
<P><FONT size=2>w address drive start number</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>address</FONT></P>
<P><FONT size=2>指定要写到磁盘文件的文件或部分文件的起始内存地址。如果不指定 address，Debug 程序将从 CS:100 开始。关于 address 参数有效值的信息，请在“相关主题”列表中单击 Debug。</FONT></P>
<P><FONT size=2>drive</FONT></P>
<P><FONT size=2>指定包含目标盘的驱动器。该值是数值型：0 = A, 1 = B, 2 = C,等等。</FONT></P>
<P><FONT size=2>start</FONT></P>
<P><FONT size=2>指定要写入第一个扇区的十六进制数。</FONT></P>
<P><FONT size=2>number</FONT></P>
<P><FONT size=2>指定要写入的扇区数。</FONT></P>
<P><FONT size=2>有关指定用于 w 命令的文件的信息，请单击“相关主题”列表中的 Debug N（名称）。</FONT></P>
<P><FONT size=2>有关将文件或文件扇区内容加载到内存中的信息，请单击“相关主题”列表中的 Debug L（加载）。</FONT></P>
<P><FONT size=2>说明</FONT></P>
<P><FONT size=2>必须在启动 Debug 时或者在最近的 Debug n（名称）命令中指定磁盘文件的名字。这两种方法都可以将地址 CS:5C 处文件控制块的文件名正确地编排格式。</FONT></P>
<P><BR><FONT size=2>在使用不带参数的 w 命令之前重新设置 BX:CX</FONT></P>
<P><FONT size=2>如果使用了 Debug g（转向）、t（跟踪）、p（执行）或 r（寄存器）命令，必须在使用无参数的 w 命令之前，将 BX:CX 寄存器复位。</FONT></P>
<P><FONT size=2>将修改后的文件写入磁盘</FONT></P>
<P><FONT size=2>如果修改文件但不更改文件名、长度或起始地址，Debug 仍然可以正确地将文件写入源磁盘位置。</FONT></P>
<P><FONT size=2>w 命令的限制</FONT></P>
<P><FONT size=2>不能用该命令写入 .exe 或 .hex 文件。</FONT></P>
<P><FONT size=2>警告</FONT></P>
<P><FONT size=2>因为略过 Windows 2000 文件句柄，所以写入特定的分区非常危险。如果键入错误的值，则磁盘文件结构很容易被损坏。</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2>假定要将起始地址为 CS:100 的内存内容写入到驱动器 B 的磁盘中。需要将数据从磁盘的逻辑扇区号 37h 开始并持续 2Bh 个扇区。为此，键入以下命令：</FONT></P>
<P><FONT size=2>wcs:100 1 37 2b</FONT></P>
<P><FONT size=2>当写操作完成时，Debug 再次显示 Debug 提示符。</FONT></P>
<P><FONT size=2>Debug:XA（分配扩展内存）</FONT></P>
<P><FONT size=2>分配扩展内存的指定页面数。</FONT></P>
<P><FONT size=2>要使用扩展内存，必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。</FONT></P>
<P><BR><FONT size=2>xa [count]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>count</FONT></P>
<P><FONT size=2>指定要分配的扩展内存的 16KB 页数。</FONT></P>
<P><FONT size=2>有关使用扩展内存的其他 Debug 命令的信息，请单击“相关主题”列表中的 XD（释放扩展内存）、XM（映射扩展内存页）或 XS（显示扩展内存状态）。</FONT></P>
<P><FONT size=2>说明</FONT></P>
<P><FONT size=2>如果指定的页面数可用，则 Debug 将显示消息，此消息表明所创建的句柄的十六进制数；否则，Debug 将显示错误消息。</FONT></P>
<P><FONT size=2></FONT>&nbsp;</P>
<P><FONT size=2>Debug:XA</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2>要分配扩展内存的 8 个页面，请键入以下命令：</FONT></P>
<P><FONT size=2>xa8</FONT></P>
<P><FONT size=2>如果命令成功，Debug 将显示类似的以下消息：<BR>Handle created=0003</FONT></P>
<P><FONT size=2>Debug:XD（释放扩展内存）</FONT></P>
<P><BR><FONT size=2>释放指向扩展内存的句柄。</FONT></P>
<P><FONT size=2>要使用扩展内存，必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。</FONT></P>
<P><BR><FONT size=2>xd [handle]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>handle</FONT></P>
<P><FONT size=2>指定要释放的句柄。</FONT></P>
<P><FONT size=2>有关使用扩展内存的其他 Debug 命令的信息，请单击“相关主题”列表中 XA（分配扩展内存）、XM（映射扩展内存页） 或 XS（显示扩展内存状态）。</FONT></P>
<P><FONT size=2>范例</FONT></P>
<P><FONT size=2>要释放句柄 0003，请键入以下命令：</FONT></P>
<P><FONT size=2>xd 0003</FONT></P>
<P><FONT size=2>如果命令成功，Debug 将显示下列消息：<BR>Hdle 0003 deallocated</FONT></P>
<P><FONT size=2>Debug:XM（映射扩展内存页）</FONT></P>
<P><BR><FONT size=2>将属于指定句柄的扩展内存逻辑页映射到扩展内存的物理页。</FONT></P>
<P><FONT size=2>要使用扩展内存，必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。</FONT></P>
<P><BR><FONT size=2>xm [lpage] [ppage] [handle]</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>lpage</FONT></P>
<P><FONT size=2>指定要映射到物理页 ppage 的扩展内存的逻辑页面号。</FONT></P>
<P><FONT size=2>ppage</FONT></P>
<P><FONT size=2>指定将 lpage 映射到的物理页面号。</FONT></P>
<P><FONT size=2>handle</FONT></P>
<P><FONT size=2>指定句柄。</FONT></P>
<P><FONT size=2>有关使用扩展内存的其他 Debug 命令的信息，请单击“相关主题”列表中的 XA（分配扩展内存）、XD（释放扩展内存）或 XS（显示扩展内存）。</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>要将句柄 0003 的逻辑页 5 映射到物理页 2，请键入以下命令：</FONT></P>
<P><FONT size=2>xm 5 2 0003</FONT></P>
<P><FONT size=2>如果命令成功，Debug 将显示下列消息：</FONT></P>
<P><FONT size=2>Logical page 05 mapped to physical page 02</FONT></P>
<P><FONT size=2>Debug:XS（显示扩展内存状态）</FONT></P>
<P><BR><FONT size=2>显示有关扩展内存状态的信息。</FONT></P>
<P><FONT size=2>要使用扩展内存，必须安装符合 4.0 版的 Lotus/Intel/Microsoft 扩展内存规范 (LIM EMS) 的扩展内存设备驱动程序。</FONT></P>
<P><BR><FONT size=2>xs</FONT></P>
<P><BR><FONT size=2>参数</FONT></P>
<P><FONT size=2>该命令不带参数。</FONT></P>
<P><FONT size=2>有关使用扩展内存的其他 Debug 命令的信息，请单击“相关主题”列表中的 XA（分配扩展内存）、XD（释放扩展内存）或 XM（映射扩展内存页）。</FONT></P>
<P><BR><FONT size=2>说明</FONT></P>
<P><FONT size=2>Debug 显示的信息有如下格式：</FONT></P>
<P><FONT size=2>Handle xx has xx pages allocated<BR>Physical page xx = Frame segment xx<BR>xx of a total xx EMS pages have been allocated<BR>xx of a total xx EMS handles have been allocated</FONT></P>
<P><BR><FONT size=2>范例</FONT></P>
<P><FONT size=2>要显示扩展内存信息，请键入以下命令：</FONT></P>
<P><FONT size=2>xs</FONT></P>
<P><FONT size=2>Debug 显示与以下类似的信息：</FONT></P>
<P><FONT size=2>Handle 0000 has 0000 pages allocated<BR>Handle 0001 has 0002 pages allocated<BR>Physical page 00 = Frame segment C000<BR>Physical page 01 = Frame segment C400<BR>Physical page 02 = Frame segment C800<BR>Physical page 03 = Frame segment CC00<BR>2 of a total 80 EMS pages have been allocated<BR>2 of a total FF EMS handles have been allocated</FONT></P></DIV><img src ="http://www.cnitblog.com/ffan/aggbug/2221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ffan/" target="_blank">ffan</a> 2005-08-20 19:21 <a href="http://www.cnitblog.com/ffan/archive/2005/08/20/2221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>