<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[落叶树的森林]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[http://blog.csdn.net/hkbyest]]></description>
<link>http://hi.baidu.com/hkbyest</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[回复起点中文网的旗木薰mm（起点垃圾回复系统故障大全）]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/8234f8c389aa4d56b319a8c6.html]]></link>
        <description><![CDATA[
		
		<p><a target="_blank" href="http://www.cmfu.com/bookreview/bookreview_read.asp?bl_id=68223&amp;aid=27216351&amp;name=盗墓笔记">http://www.cmfu.com/bookreview/bookreview_read.asp?bl_id=68223&amp;aid=27216351&amp;name=盗墓笔记</a></p>
<p>呵呵，首先对旗木薰（mm?）的认真回复表示感谢。<br>
一码归一码，感谢并不表示我同意其中的内容。</p>
<p>你的回复中错误和矛盾之多...似乎三叔的文风和你比较合拍，所以你的气愤我是可以理解的，呵呵。</p>
<p>首先，楼顶的表述是一个读者对作品的评价，这种对事不对人的态度难道有错，难道非要痛骂“三叔”其人才合你的胃口吗？<br>
所以你一句严重矛盾的“光凭这种本就只是个对事不对人的话就来评判别人……阁下未免也太高估自己了吧？”就让我笑开了老怀。</p>
<p>其次，虽然我看书不是很仔细，常常是走马观花，但就算这样也能看出问题，不知道你是怎么阅读的，不好说不好说啊。<br>
实体书我没看过，但在别的论坛看了以前转载的未修改版本觉得不对劲又来起点看了修改后的版本，结果越改越乱，先不说修改后版本以闷油瓶的性格为什么要扮成张秃子这种严重不合逻辑的情节，单说怒海潜沙卷 修改后的第十三章 海猴子中，前后只有三个人上了鬼船，莫名多了个“乃明”出来踩着“我”把“宁”背上去，估计这位mm没看过未修改版本，不知道这之后的乃明才是闷油瓶带了人皮面具扮的吧，问题在于通篇查阅也没见这个乃明的出场，烦请旗mm发现后指出来，谢谢。</p>
<p>至于“请问，您有见过一本小说尤其是长篇小说，从开头到结尾、或者说从开头到后面发展一直都只有最初登场的几个人物么？还是说因为小妹我实在看书太少，而看到的书‘恰好’都不是您说的那种的只有最初登场人物的小说，再或者是……您说的那位‘猫腻大’的小说？ ”这句话现在我想您应该明白什么叫蹦出来了吧，如果还不明白我建议你还是重修下语文的阅读理解吧，另外估计你也看不懂猫腻大大的新作《庆余年》，所以不提也罢。<br>
其实未修改前的版本比修改后的好看多了，不过还是bug太多了...</p>
<p>还有，关于神树情节啥的不想说了，也是情节上的逻辑问题，前后矛盾。不过我倒是没有看到作者公告哪里有提过，您叹完气后还望指点一下。</p>
<p>最后，如果要说考究的，我倒是发现一位叫刘凯生的《盗墓笔记》读后感：<a href="http://www.liukaisheng.cn/show_hdr.php?xname=V07QF21&amp;dname=TEDEAU0&amp;xpos=17">http://www.liukaisheng.cn/show_hdr.php?xname=V07QF21&amp;dname=TEDEAU0&amp;xpos=17</a> 虽然觉得这位仁兄所评还是有不够准确的地方，不过要说做学问，我想这也够敬业了吧。<br>
好的好看的小说有许多，请旗mm多看几年再冷笑，恕在下没有那么多时间精力奉陪了。</p>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br>
</p>
<p>接下来BS一下起点的垃圾系统，回复回到吐血。</p>
<p>不论你是否刚发了一贴，接下来多打些字数都提示登录已失效：</p>
<div forimg="1"><img border="0" small="0" class="blogimg" src="http://hiphotos.baidu.com/hkbyest/pic/item/afb61ded15ee98dfb31cb1cf.jpg"></div>
<div forimg="1"></div>
<div forimg="1">要不就是主题类别出错？：</div>
<div forimg="1">
<div forimg="1"><img border="0" small="0" class="blogimg" src="http://hiphotos.baidu.com/hkbyest/pic/item/8201c68ffa711bf1513d92cf.jpg"></div>
<div class="tmpDiv"> </div>
</div>
<div forimg="1"></div>
<p>当你发新主题的时候会反复提示你输入那正确得不能再正确的验证码，然后如果再发一次的话就来一个“你发表时间间隔太短，请等候xx秒”：</p>
<div forimg="1"><img border="0" small="0" class="blogimg" src="http://hiphotos.baidu.com/hkbyest/pic/item/871de9091afee52f6b60fbcf.jpg"></div>
<p>最后一招最干脆：</p>
<div forimg="1"><img border="0" small="0" class="blogimg" src="http://hiphotos.baidu.com/hkbyest/pic/item/3c565e2310c94545925807cf.jpg"></div>
<p> </p>
<div class="tmpDiv"> 干！</div> <a href="http://hi.baidu.com/hkbyest/blog/item/8234f8c389aa4d56b319a8c6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D0%C4%C7%E9%CB%E6%B1%CA">心情随笔</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/8234f8c389aa4d56b319a8c6.html#comment">查看评论</a>]]></description>
        <pubDate>2007-10-04  17:49</pubDate>
        <category><![CDATA[心情随笔]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/8234f8c389aa4d56b319a8c6.html</guid>
</item>

<item>
        <title><![CDATA[【原创】软件破解－从菜鸟到高手进阶三步曲]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/c61bbcc405becaab8326ac65.html]]></link>
        <description><![CDATA[
		
		<p><strong><font size="3"></font></strong></p>
<p><strong><font size="3">内容简介：用一个软件为例介绍破解的三个阶段，从爆破到动态跟踪算法再到写注册机。</font></strong></p>
<p><strong><font size="3"></font></strong></p>
<p><font color="#3366ff" size="4">文章已发表于2007年8月份的《黑客防线》，版权归杂志所有，这里就不发出来了。</font> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D4%AD%B4%B4%D7%F7%C6%B7">原创作品</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/c61bbcc405becaab8326ac65.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-26  13:17</pubDate>
        <category><![CDATA[原创作品]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/c61bbcc405becaab8326ac65.html</guid>
</item>

<item>
        <title><![CDATA[【原创】《The Art of Assembly Language》中文名：《汇编语言编程艺术》 中英文正式版本下载]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/0eee03e7002aa62cb8382064.html]]></link>
        <description><![CDATA[
		
		<p><strong>辛苦弄了半天，尤其是中文版本，真的是很难找啊～</strong></p>
<p><strong>英文版:</strong><font color="#800080"><strong>http://forum.eviloctal.com/read-htm-tid-29934.html</strong></font><strong> </strong></p>
<p><strong>中文版:http://forum.eviloctal.com/read-htm-tid-29933.html</strong></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D1%A7%CF%B0%CF%E0%B9%D8">学习相关</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/0eee03e7002aa62cb8382064.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-26  13:16</pubDate>
        <category><![CDATA[学习相关]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/0eee03e7002aa62cb8382064.html</guid>
</item>

<item>
        <title><![CDATA[8086/8088指令详解]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/ee5218c295520137e5dd3b51.html]]></link>
        <description><![CDATA[
		
		<p><strong><font color="#000000">8086/8088指令详解</font></strong></p>
<p><font color="#ed92c6">一、数据传送指令<br>
</font><font color="#800080">1.通用数据传送指令</font><font color="#0080c0"><br>
</font><font color="#ff8000">MOV（Move）传送<br>
PUSH（Push onto the stack）进栈<br>
POP（Pop from the stack）出栈<br>
XCHG（Exchange）交换</font><font color="#0080c0"><br>
</font><font color="#008000">.MOV指令</font><font color="#0080c0"><br>
格式为: MOV&nbsp;&nbsp;&nbsp; DST,SRC<br>
执行的操作:(DST)&lt;-(SRC)<br>
</font><font color="#008000">.PUSH进栈指令</font><font color="#0080c0"><br>
格式为:PUSH&nbsp;&nbsp;&nbsp; SRC<br>
执行的操作:(SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(SRC)<br>
</font><font color="#008000">.POP出栈指令</font><font color="#0080c0"><br>
格式为:POP&nbsp;&nbsp;&nbsp; DST<br>
执行的操作:(DST)&lt;-((SP+1),(SP))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)+2<br>
</font><font color="#008000">.XCHG 交换指令</font><font color="#0080c0"><br>
格式为:XCHG&nbsp;&nbsp;&nbsp; OPR1,OPR2<br>
执行的操作:(OPR1)&lt;--&gt;(OPR2)<br>
<br>
</font><font color="#800080">2.累加器专用传送指令</font><font color="#0080c0"><br>
</font><font color="#ff8000">IN(Input)&nbsp;&nbsp;&nbsp; 输入<br>
OUT(Output)&nbsp;&nbsp;&nbsp; 输出<br>
XLAT(Translate)&nbsp;&nbsp;&nbsp; 换码<br>
这组指令只限于使用累加器AX或AL传送信息.</font><font color="#0080c0"><br>
</font><font color="#008000">.IN 输入指令</font><br>
<font color="#0080c0">长格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp; AL,PORT(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp; AX,PORT(字)<br>
执行的操作:&nbsp;&nbsp;&nbsp; (AL)&lt;-(PORT)(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (AX)&lt;-(PORT+1,PORT)(字)<br>
短格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp; AL,DX(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp; AX,DX(字)<br>
执行的操作:&nbsp;&nbsp;&nbsp; AL&lt;-((DX))(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AX&lt;-((DX)+1,DX)(字)<br>
</font><font color="#008000">.OUT 输出指令</font><font color="#0080c0"><br>
长格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUT&nbsp;&nbsp;&nbsp; PORT,AL(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUT&nbsp;&nbsp;&nbsp;&nbsp; PORT,AX(字)<br>
执行的操作:&nbsp;&nbsp;&nbsp; (PORT)&lt;-(AL)(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PORT+1,PORT)&lt;-(AX)(字)<br>
短格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUT&nbsp;&nbsp;&nbsp; DX,AL(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUT&nbsp;&nbsp;&nbsp; DX,AX(字)<br>
执行的操作:&nbsp;&nbsp;&nbsp; ((DX))&lt;-(AL)(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((DX)+1,(DX))&lt;-AX(字)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在IBM-PC机里,外部设备最多可有65536个I/O端口,</font><br>
<font color="#0080c0">端口(即外设的端口地址)为0000~FFFFH.其中前256个端</font><br>
<font color="#0080c0">口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,</font><br>
<font color="#0080c0">此时机器指令用二个字节表示,第二个字节就是端口号.所以</font><br>
<font color="#0080c0">用长格式时可以在指定中直接指定端口号,但只限于前256个</font><br>
<font color="#0080c0">端口.当端口号&gt;=256时,只能使用短格式,此时,必须先把端</font><br>
<font color="#0080c0">口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后</font><br>
<font color="#0080c0">再用IN或OUT指令来 传送信息. <br>
</font><font color="#008000">.XLAT&nbsp;&nbsp;&nbsp; 换码指令</font><font color="#0080c0"><br>
格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XLAT&nbsp;&nbsp;&nbsp; OPR<br>
或:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XLAT<br>
执行的操作:(AL)&lt;-((BX)+(AL))<br>
<br>
</font><font color="#800080">3.有效地址送寄存器指令</font><font color="#0080c0"><br>
</font><font color="#ff8000">LEA(Load effective address)有效地址送寄存器<br>
LDS(Load DS with Pointer)指针送寄存器和DS<br>
LES(Load ES with Pointer)指针送寄存器和ES<br>
</font><font color="#008000">.LEA 有效地址送寄存器</font><font color="#0080c0"><br>
格式为:&nbsp;&nbsp;&nbsp; LEA&nbsp;&nbsp;&nbsp;&nbsp; REG,SRC<br>
执行的操作:(REG)&lt;-SRC<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指令把源操作数的有效地址送到指定的寄存器中.<br>
</font><font color="#008000">.LDS 指针送寄存器和DS指令</font><font color="#0080c0"><br>
格式为:&nbsp;&nbsp;&nbsp; LDS&nbsp;&nbsp;&nbsp; REG,SRC<br>
执行的操作:(REG)&lt;-(SRC)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DS)&lt;-(SRC+2)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把源操作数指定的4个相继字节送到由指令指定的寄存器</font><br>
<font color="#0080c0">及DS寄存器中.该指令常指定SI寄存器.<br>
</font><font color="#008000">.LES 指针送寄存器和ES指令</font><font color="#0080c0"><br>
格式为:&nbsp;&nbsp;&nbsp; LES&nbsp;&nbsp;&nbsp; REG,SRC<br>
执行的操作: (REG)&lt;-(SRC)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ES)&lt;-(SRC+2)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把源操作数指定的4个相继字节送到由指令指定的寄存器</font><br>
<font color="#0080c0">及ES寄存器中.该指令常指定DI寄存器.<br>
<br>
</font><font color="#800080">4.标志寄存器传送指令</font><font color="#0080c0"><br>
</font><font color="#ff8000">LAHF(Load AH with flags)标志送AH<br>
SAHF(store AH into flags)AH送标志寄存器<br>
PUSHF(push the flags) 标志进栈<br>
POPF(pop the flags) 标志出栈<br>
</font><font color="#008000">.LAHF 标志送AH<br>
</font><font color="#0080c0">格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LAHF<br>
执行的操作:(AH)&lt;-(PWS的低字节)</font><br>
<font color="#008000">.SAHF AH送标志寄存器<br>
</font><font color="#0080c0">格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAHF<br>
执行的操作:(PWS的低字节)&lt;-(AH)<br>
</font><font color="#008000">.PUSHF 标志进栈<br>
</font><font color="#0080c0">格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSHF<br>
执行的操作:(SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(PSW)<br>
</font><font color="#008000">.POPF 标志出栈<br>
</font><font color="#0080c0">格式为:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POPF<br>
执行的操作:(PWS)&lt;-((SP)+1,(SP))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP+2)</font></p>
<p><font color="#ed92c6">二、算术指令<br>
</font><font color="#800080">1.加法指令</font><font color="#ed92c6"><br>
</font><font color="#ff8000">ADD(add)加法<br>
ADC(add with carry)带进位加法<br>
INC(increment)加1</font><font color="#ed92c6"><br>
</font><font color="#008000">.ADD&nbsp;&nbsp;&nbsp; 加法指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADD&nbsp;&nbsp;&nbsp;&nbsp; DST,SRC<br>
执行的操作:(DST)&lt;-(SRC)+(DST)<br>
</font><font color="#008000">.ADC&nbsp;&nbsp;&nbsp; 带进位加法指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADC&nbsp;&nbsp;&nbsp;&nbsp; DST,SRC<br>
执行的操作:(DST)&lt;-(SRC)+(DST)+CF<br>
</font><font color="#008000">.ADD&nbsp;&nbsp;&nbsp; 加1指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INC&nbsp;&nbsp;&nbsp;&nbsp; OPR<br>
执行的操作:(OPR)&lt;-(OPR)+1<br>
</font><br>
<font color="#800080">2.减法指令</font><font color="#ed92c6"><br>
</font><font color="#ff8000">SUB(subtract)减法<br>
SBB(subtract with borrow)带借位减法<br>
DEC(Decrement)减1<br>
NEG(Negate)求补<br>
CMP(Compare)比较</font><font color="#ed92c6"><br>
</font><font color="#008000">.SUB&nbsp;&nbsp;&nbsp; 减法指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp; SUB&nbsp;&nbsp;&nbsp; DST,SRC<br>
执行的操作:(DST)&lt;-(DST)-(SRC)<br>
</font><font color="#008000">.SBB&nbsp;&nbsp;&nbsp; 带借位减法指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp; SBB&nbsp;&nbsp;&nbsp; DST,SRC<br>
执行的操作:(DST)&lt;-(DST)-(SRC)-CF<br>
</font><font color="#008000">.DEC&nbsp;&nbsp;&nbsp; 减1指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp; OPR<br>
执行的操作:(OPR)&lt;-(OPR)-1<br>
</font><font color="#008000">.NEG&nbsp;&nbsp;&nbsp; 求补指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp; NEG&nbsp;&nbsp;&nbsp; OPR<br>
执行的操作:(OPR)&lt;- -(OPR)<br>
</font><font color="#008000">.CMP&nbsp;&nbsp;&nbsp; 比较指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp; CMP&nbsp;&nbsp;&nbsp; OPR1,OPR2<br>
执行的操作:(OPR1)-(OPR2)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该指令与SUB指令一样执行减法操作,但不保存结果,</font><br>
<font color="#0080c0">只是根据结果设置条件标志西半球.<br>
</font><br>
<font color="#800080">3.乘法指令</font><font color="#ed92c6"><br>
</font><font color="#ff8000">MUL(Unsigned Multiple)无符号数乘法<br>
IMUL(Signed Multiple)带符号数乘法</font><font color="#ed92c6"><br>
</font><font color="#008000">.MUL 无符号数乘法指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; MUL&nbsp;&nbsp;&nbsp; SRC<br>
执行的操作:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字节操作数:(AX)&lt;-(AL)*(SRC)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字操作数:(DX,AX)&lt;-(AX)*(SRC)<br>
</font><font color="#008000">.IMUL 带符号数乘法指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; IMUL&nbsp;&nbsp;&nbsp; SRC<br>
执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.<br>
<br>
</font><font color="#800080">4.除法指令</font><font color="#ed92c6"><br>
</font><font color="#ff8000">DIV(Unsigned divide)无符号数除法<br>
IDIV(Signed divide)带符号数除法<br>
CBW(Convert byte to word)字节转换为字<br>
CWD(Contert word to double word)字转换为双字</font><font color="#ed92c6"><br>
</font><font color="#008000">.DIV&nbsp;&nbsp;&nbsp; 无符号数除法指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; DIV&nbsp;&nbsp;&nbsp; SRC<br>
执行的操作:</font><br>
<font color="#ed92c6"></font><font color="#0080c0">字节操作:(AL)&lt;-(AX)/(SRC)的商<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (AH)&lt;-(AX)/(SRC)的余数<br>
&nbsp;&nbsp;&nbsp; 字操作:&nbsp;&nbsp;&nbsp; (AX)&lt;-(DX,AX)/(SRC)的商<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (AX)&lt;-(DX,AX)/(SRC)的余数<br>
</font><font color="#008000">.IDIV&nbsp;&nbsp;&nbsp; 带符号数除法指令</font><font color="#0080c0"><br>
格式:&nbsp;&nbsp;&nbsp;&nbsp; DIV&nbsp;&nbsp;&nbsp; SRC<br>
执行的操作:与DIV相同,但操作数必须是带符号数,商和余数</font><br>
<font color="#0080c0">也均为带符号数,且余数的符号与被除数的符号相同.<br>
</font><font color="#008000">.CBW 字节转换为字指令</font><font color="#0080c0"><br>
格式:&nbsp;&nbsp;&nbsp;&nbsp; CBW<br>
执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效</font><br>
<font color="#0080c0">位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH<br>
</font><font color="#008000">.CWD 字转换为双字指令</font><font color="#0080c0"><br>
格式:&nbsp;&nbsp;&nbsp; CWD<br>
执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位</font><br>
<font color="#0080c0">为0,则(DX)=0;否则(DX)=0FFFFH.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两条指令都不影响条件码.</font></p>
<p><font color="#ed92c6">三、逻辑指令<br>
</font><font color="#800080">1.逻辑运算指令<br>
</font><font color="#ff8000">AND(and)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逻辑与<br>
OR(or)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逻辑或<br>
NOT(not)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逻辑非<br>
XOR(exclusive or)异或<br>
TEST(test)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试<br>
</font><font color="#008000">.AND&nbsp;&nbsp;&nbsp; 逻辑与指令</font><font color="#ff8000"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND&nbsp;&nbsp;&nbsp;&nbsp; DST,SRC<br>
执行的操作:(DST)&lt;-(DST)^(SRC)<br>
</font><font color="#008000">.OR&nbsp;&nbsp;&nbsp; 逻辑或指令</font><font color="#ff8000"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR&nbsp;&nbsp;&nbsp;&nbsp; DST,SRC<br>
执行的操作:(DST)&lt;-(DST)V(SRC)<br>
</font><font color="#008000">.NOT&nbsp;&nbsp;&nbsp; 逻辑非指令</font><font color="#ff8000"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT&nbsp;&nbsp;&nbsp;&nbsp; OPR<br>
执行的操作:(OPR)&lt;-<u>(OPR)</u><br>
</font><font color="#008000">.XOR&nbsp;&nbsp;&nbsp; 异或指令</font><font color="#ff8000"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XOR&nbsp;&nbsp;&nbsp;&nbsp; DST,<blink>SRC</blink><br>
执行的操作:(DST)&lt;-(DST)<strike>V</strike>(SRC)<br>
</font><font color="#008000">.TEST&nbsp;&nbsp;&nbsp; 测试指令</font><font color="#ff8000"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEST&nbsp;&nbsp;&nbsp;&nbsp; OPR1,OPR2<br>
执行的操作:(DST)^(SRC)<br>
两个操作数相</font><font color="#ff0000">与</font><font color="#0080c0">的结果不保存,只根据其特征置条件码<br>
</font><font color="#ff8000"><br>
</font><font color="#800080">2.移位指令<br>
</font><font color="#ff8000">SHL(shift logical left)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逻辑左移<br>
SAL(shift arithmetic left)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 算术左移<br>
SHR(shift logical right)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逻辑右移<br>
SAR(shift arithmetic right)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 算术右移<br>
ROL(Rotate left)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 循环左移<br>
ROR(Rotate right)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 循环右移<br>
RCL(Rotate left through carry)&nbsp;&nbsp;&nbsp; 带进位循环左移<br>
RCR(Rotate right through carry) 带进位循环右移<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHL&nbsp;&nbsp;&nbsp; OPR,CNT(其余的类似)<br>
其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,</font><br>
<font color="#0080c0">CNT可以是</font><font color="#ff0000">1</font><font color="#0080c0">或</font><font color="#ff0000">CL</font><font color="#0080c0">.</font><font color="#0080c0">循环移位指令可以改变操作数中所有位的位置;移</font><br>
<font color="#0080c0">位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符</font><br>
<font color="#0080c0">号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符</font><br>
<font color="#0080c0">号数运算,SHL用来乘2,SHR用来除以2.</font></p>
<p><font color="#ed92c6">四、串处理指令<br>
</font><font color="#800080">1.与REP相配合工作的MOVS,STOS和LODS指令<br>
</font><font color="#008000">.REP重复串操作直到(CX)=0为上</font><font color="#800080"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp; REP&nbsp;&nbsp;&nbsp;&nbsp; string primitive<br>
其中String Primitive可为MOVS,LODS或STOS指令<br>
执行的操作:<br>
1)如(CX)=0则退出REP,否则往下执行.<br>
2)(CX)&lt;-(CX)-1<br>
3)执行其中的串操作<br>
4)重复1)~3)<br>
</font><font color="#008000">.MOVS&nbsp;&nbsp;&nbsp; 串传送指令</font><font color="#0080c0"><br>
格式:可有三种<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVS&nbsp;&nbsp;&nbsp; DST,SRC<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVSB(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVSW(字)</font><br>
<font color="#0080c0">其中第二、三种格式明确地注明是传送字节或字，第一种格式则应</font><br>
<font color="#0080c0">在操作数中表明是字还是字节操作，例如：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ES:BYTE PTR[DI],DS:[SI]<br>
执行的操作:<br>
1)((DI))&lt;-((SI))<br>
2)字节操作:<br>
&nbsp;&nbsp;&nbsp;&nbsp; (SI)&lt;-(SI)+(或-)1,(DI)&lt;-(DI)+(或-)1<br>
&nbsp;&nbsp;&nbsp;&nbsp; 当方向标志DF=0时用+,当方向标志DF=1时用-<br>
3)字操作:<br>
&nbsp;&nbsp;&nbsp;&nbsp; (SI)&lt;-(SI)+(或-)2,(DI)&lt;-(DI)+(或-)2<br>
&nbsp;&nbsp;&nbsp;&nbsp; 当方向标志DF=0时用+,当方向标志DF=1时用-<br>
该指令不影响条件码.<br>
</font><font color="#008000">.CLD(Clear direction flag)该指令使DF=0,在执行串操作</font><br>
<font color="#008000">指令时可使地址自动增量;<br>
.STD(Set direction flag)该指令使DF=1,在执行串操作指</font><br>
<font color="#008000">令时可使地址自动减量.</font><br>
<font color="#008000">.STOS&nbsp;&nbsp;&nbsp; 存入串指令</font><font color="#0080c0"><br>
格式:&nbsp;&nbsp;&nbsp;&nbsp; STOS&nbsp;&nbsp;&nbsp; DST<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STOSB(字节)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STOSW(字)<br>
执行的操作:<br>
&nbsp;&nbsp;&nbsp;&nbsp; 字节操作:((DI))&lt;-(AL),(DI)&lt;-(DI)+-1 <br>
&nbsp;&nbsp;&nbsp;&nbsp; 字操作:&nbsp;&nbsp;&nbsp; ((DI))&lt;-(AX),(DI)&lt;-(DI)+-2<br>
该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根</font><br>
<font color="#0080c0">据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX</font><br>
<font color="#0080c0">的内容存入一个长度为(CX)的缓冲区中.<br>
</font><font color="#008000">.LODS&nbsp;&nbsp;&nbsp; 从串取指令</font><font color="#0080c0"><br>
格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LODS&nbsp;&nbsp;&nbsp; SRC<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LODSB<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LODSW<br>
执行的操作:<br>
&nbsp;&nbsp;&nbsp;&nbsp; 字节操作:(AL)&lt;-((SI)),(SI)&lt;-(SI)+-1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字操作: (AX)&lt;-((SI)),(SI)&lt;-(SI)+-2<br>
该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据</font><br>
<font color="#0080c0">方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非</font><br>
<font color="#0080c0">数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP联</font><br>
<font color="#0080c0">用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.<br>
&nbsp;&nbsp;&nbsp;</font><font color="#800080"><br>
2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令<br>
</font><font color="#008000">.REPE/REPZ&nbsp;&nbsp;&nbsp; 当相等/为零时重复串操作</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REPE(或REPZ)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String Primitive</font><br>
<font color="#0080c0">其中String Primitive可为CMPS或SCAS指令.</font><br>
<font color="#0080c0">执行的操作:</font><br>
<font color="#0080c0">1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,</font><br>
<font color="#0080c0">否则往下执行</font><br>
<font color="#0080c0">2)(CX)&lt;-(CX)-1</font><br>
<font color="#0080c0">3)执行其后的串指令</font><br>
<font color="#0080c0">4)重复1)~3)</font><br>
<font color="#008000">.REPNE/REPNZ&nbsp;&nbsp;&nbsp; 当不相等/不为零时重复串操作</font><br>
<font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REPNE(或REPNZ)&nbsp;&nbsp;&nbsp;&nbsp; String Primitive</font><br>
<font color="#0080c0">其中String Primitive可为CMPS或SCAS指令</font><br>
<font color="#0080c0">执行的操作:</font><br>
<font color="#0080c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同.</font><br>
<font color="#008000">.CMPS&nbsp;&nbsp;&nbsp; 串比较指令</font><br>
<font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMP&nbsp;&nbsp;&nbsp;&nbsp; SRC,DST</font><br>
<font color="#0080c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMPSB</font><br>
<font color="#0080c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMPSW</font><br>
<font color="#0080c0">执行的操作:</font><br>
<font color="#0080c0">1)((SI))-((DI))</font><br>
<font color="#0080c0">2)字节操作:(SI)&lt;-(SI)+-1,(DI)&lt;-(DI)+-1</font><br>
<font color="#0080c0">&nbsp;&nbsp;&nbsp; 字操作:&nbsp;&nbsp;&nbsp; (SI)&lt;-(SI)+-2,(DI)&lt;-(DI)+-2</font><font color="#ed92c6"> <br>
</font><font color="#0080c0">指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的</font><br>
<font color="#0080c0">附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条</font><br>
<font color="#0080c0">件码,指令的其它特性和MOVS指令的规定相同.</font><font color="#ed92c6"><br>
</font><font color="#008000">.SCAS&nbsp;&nbsp;&nbsp; 串扫描指令<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; SCAS&nbsp;&nbsp;&nbsp;&nbsp; DST<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCASB<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCASW<br>
执行的操作:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字节操作:(AL)-((DI)),(DI)&lt;-(DI)+-1</font><br>
<font color="#0080c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字操作:&nbsp;&nbsp;&nbsp; (AL)-((DI)),(DI)&lt;-(DI)+-2</font><br>
<font color="#0080c0">该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)</font><font color="#0080c0">进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的</font><font color="#0080c0">规定相同.</font><font color="#ed92c6"> </font></p>
<p><font color="#ed92c6">五、控制转移指令<br>
&nbsp;&nbsp;</font><font color="#ff80ff">1.无条件转移指令<br>
</font><font color="#008000">.JMP(jmp)&nbsp;&nbsp;&nbsp; 跳转指令</font><font color="#ff80ff"><br>
</font><font color="#8080c0">1)段内直接短转移<br>
</font><font color="#0080c0">格式:JMP&nbsp;&nbsp;&nbsp; SHORT OPR<br>
执行的操作:(IP)&lt;-(IP)+8位位移量</font><font color="#8080c0"><br>
2)段内直接近转移<br>
</font><font color="#0080c0">格式:JMP&nbsp;&nbsp;&nbsp; NEAR PTR OPR<br>
执行的操作:(IP)&lt;-(IP)+16位位移量</font><font color="#8080c0"><br>
3)段内间接转移<br>
</font><font color="#0080c0">格式:JMP&nbsp;&nbsp;&nbsp; WORD PTR OPR<br>
执行的操作:(IP)&lt;-(EA)</font><font color="#8080c0"><br>
4)段间直接(远)转移<br>
</font><font color="#0080c0">格式:JMP&nbsp;&nbsp;&nbsp; FAR PTR OPR<br>
执行的操作:(IP)&lt;-OPR的段内偏移地址<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CS)&lt;-OPR所在段的段地址</font><font color="#8080c0"><br>
5)段间间接转移</font><br>
<font color="#0080c0">格式:JMP&nbsp;&nbsp;&nbsp; DWORD PTR OPR<br>
执行的操作:(IP)&lt;-(EA)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CS)&lt;-(EA+2)</font><font color="#ff80ff"><br>
2.条件转移指令<br>
</font><font color="#8080c0">1)根据单个条件标志的设置情况转移<br>
</font><font color="#008000">.JZ(或JE)(Jump if zero,or equal)&nbsp;&nbsp;&nbsp; 结果为零(或相等)则转移</font><font color="#8080c0"><br>
</font><font color="#0080c0">格式:JE(或JZ)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:ZF=1</font><br>
<font color="#008000">.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零</font><br>
<font color="#008000">(或不相等)则转移<br>
</font><font color="#0080c0">格式:JNZ(或JNE)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:ZF=0</font><br>
<font color="#008000">.JS(Jump if sign)&nbsp;&nbsp;&nbsp; 结果为负则转移<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp; JS&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:SF=1</font><br>
<font color="#008000">.JNS(Jump if not sign)&nbsp;&nbsp;&nbsp; 结果为正则转移<br>
</font><font color="#0080c0">格式:JNS&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:SF=0</font><br>
<font color="#008000">.JO(Jump if overflow)&nbsp;&nbsp;&nbsp; 溢出则转移<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; JO&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:OF=1</font><br>
<font color="#008000">.JNO(Jump if not overflow)</font><br>
<font color="#008000">不溢出则转移<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; JNO OPR<br>
测试条件:OF=0</font><br>
<font color="#008000">.JP(或JPE)(Jump if parity,or parity even)</font><br>
<font color="#008000">奇偶位为1则转移<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; JP&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:PF=1</font><br>
<font color="#008000">.JNP(或JPO)(Jump if not parity,or parity odd)</font><br>
<font color="#008000">奇偶位为0则转移<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp; JNP(或JPO)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:PF=0</font><br>
<font color="#008000">.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry)</font><br>
<font color="#008000">低于,或者不高于或等于,或进位位为1则转移<br>
</font><font color="#0080c0">格式:JB(或JNAE,JC)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:CF=1</font><br>
<font color="#008000">.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry)</font><br>
<font color="#008000">不低于,或者高于或者等于,或进位位为0则转移<br>
</font><font color="#0080c0">格式:JNB(或JAE,JNC)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:CF=0</font><font color="#8080c0"><br>
2)比较两个无符号数,并根据比较的结果转移<br>
</font><font color="#008000">.JB(或JNAE,JC)<br>
</font><font color="#0080c0">格式:同上</font><br>
<font color="#008000">.JNB(或JAE,JNC)<br>
</font><font color="#0080c0">格式:同上</font><br>
<font color="#008000">.JBE(或JNA)(Jump if below or equal,or not above)</font><br>
<font color="#008000">低于或等于,或不高于则转移<br>
</font><font color="#0080c0">格式:JBE(或JNA)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:CFVZF=1</font><br>
<font color="#008000">.JNBE(或JA)(Jump if not below or equal,or above)</font><br>
<font color="#008000">不低于或等于,或者高于则转移<br>
</font><font color="#0080c0">格式:JNBE(或JA)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:CFVZF=0</font><font color="#8080c0"><br>
3)比较两个带符号数,并根据比较的结果转移</font><br>
<font color="#008000">.JL(或LNGE)(Jump if less,or not greater or equal)</font><br>
<font color="#008000">小于,或者不大于或者等于则转移<br>
</font><font color="#0080c0">格式:JL(或JNGE)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:SF<strike>V</strike>OF=1</font><br>
<font color="#008000">.JNL(或JGE)(Jump if not less,or greater or equal)</font><br>
<font color="#008000">不小于,或者大于或者等于则转移<br>
</font><font color="#0080c0">格式:JNL(或JGE)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:SF<strike>V</strike>OF=0</font><br>
<font color="#008000">.JLE(或JNG)(Jump if less or equal,or not greater)</font><br>
<font color="#008000">小于或等于,或者不大于则转移<br>
</font><font color="#0080c0">格式:JLE(或JNG)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:(SF<strike>V</strike>OF)VZF=1</font><br>
<font color="#008000">.JNLE(或JG)(Jump if not less or equal,or greater)</font><br>
<font color="#008000">不小于或等于,或者大于则转移<br>
</font><font color="#0080c0">格式:JNLE(或JG)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:(SF<strike>V</strike>OF)VZF=0</font><br>
<font color="#8080c0">4)测试CX的值为0则转移指令</font><font color="#0080c0"><br>
</font><font color="#008000">.JCXZ(Jump if CX register is zero)</font><br>
<font color="#008000">CX寄存器的内容为零则转移</font><font color="#0080c0"><br>
格式:JCXZ&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:(CX)=0<br>
</font><font color="#ff0000">注:条件转移全为8位短跳!</font><br>
<font color="#ff80ff"><br>
3.循环指令<br>
</font><font color="#008000">.LOOP 循环指令</font><font color="#0080c0"><br>
格式: LOOP&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:(CX)&lt;&gt;0</font><br>
<font color="#008000">.LOOPZ/LOOPE 当为零或相等时循环指令</font><font color="#0080c0"><br>
格式: LOOPZ(或LOOPE)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:(CX)&lt;&gt;0且ZF=1</font><font color="#ff80ff"><br>
</font><font color="#008000">.LOOPNZ/LOOPNE 当不为零或不相等时循环指令</font><font color="#0080c0"><br>
格式: LOOPNZ(或LOOPNE)&nbsp;&nbsp;&nbsp; OPR<br>
测试条件:(CX)&lt;&gt;0且ZF=0<br>
</font>这三条指令的步骤是:<br>
1)(CX)&lt;-(CX)-1<br>
2)检查是否满足测试条件,如满足则(IP)&lt;-(IP)+D8的符号扩充.<font color="#ff80ff"><br>
<br>
4.子程序<br>
</font><font color="#008000">.CALL调用指令<br>
.RET返回指令</font><font color="#ff80ff"><br>
5.中断</font><br>
<font color="#008000">.INT指令</font><font color="#ed92c6"><br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp; TYPE<br>
或&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT<br>
执行的操作:(SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(PSW)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(CS)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(IP)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (IP)&lt;-(TYPE*4)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CS)&lt;-(TYPE*4+2)<br>
</font><font color="#008000">.INTO&nbsp;&nbsp;&nbsp; 若溢出则中断</font><font color="#ed92c6"><br>
</font><font color="#0080c0">执行的操作:若OF=1则:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(PSW)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(CS)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)-2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((SP)+1,(SP))&lt;-(IP)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (IP)&lt;-(10H)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CS)&lt;-(12H)<br>
</font><font color="#008000">.IRET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从中断返回指令<br>
</font><font color="#0080c0">格式:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IRET<br>
执行的操作:(IP)&lt;-((SP)+1,(SP))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)+2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CS)&lt;-((SP)+1,(SP))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)+2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PSW)&lt;-((SP)+1,(SP))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SP)&lt;-(SP)+2</font><br>
<font color="#ed92c6">六、处理机控制指令<br>
</font><font color="#ff00ff">1.标志处理指令<br>
</font><font color="#008000">.CLC进位位置0指令(Clear carry)CF&lt;-0<br>
.CMC进位位求反指令(Complement carry)CF&lt;-<u>CF</u></font><br>
<font color="#008000">.STC进位位置1指令(Set carry)CF&lt;-1<br>
.CLD方向标志置0指令(Clear direction)DF&lt;-0</font><br>
<font color="#008000">.STD方向标志置1指令(Set direction)DF&lt;-1</font><br>
<font color="#008000">.CLI中断标志置0指令(Clear interrupt)IF&lt;-0</font><br>
<font color="#008000">.STI中断标志置1指令(Set interrupt)IF&lt;-0</font><font color="#ff00ff"><br>
2.其他处理机控制指令<br>
</font><font color="#ff8000">NOP(No Opreation)&nbsp;&nbsp;&nbsp;&nbsp; 无操作<br>
HLT(Halt)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 停机<br>
WAIT(Wait)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等待<br>
ESC(Escape)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 换码<br>
LOCK(Lock)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 封锁<br>
</font><font color="#0080c0">这些指令可以控制处理机状态.这们都不影响条件码.</font><font color="#ff00ff"><br>
</font><font color="#008000">.NOP 无操作指令<br>
</font><font color="#0080c0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往</font><br>
<font color="#0080c0">用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.<br>
</font><font color="#008000">.HLT停机指令</font><font color="#0080c0"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部</font><font color="#0080c0">中断到来,中断结束后可继续执行下面的程序.<br>
</font><font color="#008000">.WAIT等待指令</font><font color="#0080c0"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,</font><br>
<font color="#0080c0">但</font><font color="#0080c0">中断结束后仍返回WAIT指令继续德行.<br>
</font><font color="#008000">.ESC换码指令</font><font color="#0080c0"><br>
&nbsp;&nbsp;&nbsp;&nbsp; 格式ESC&nbsp;&nbsp;&nbsp; mem<br>
其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.</font><br>
<font color="#0080c0">当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理</font><font color="#0080c0">机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处</font><font color="#0080c0">理机(如8087)则是为了提高速度而可以选配的硬件.<br>
</font><font color="#008000">.LOCK封锁指令</font><font color="#0080c0"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直</font><font color="#0080c0">到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避</font><font color="#0080c0">免破坏有用信息.</font></p>
<p><font color="#ed92c6"></font></p> <a href="http://hi.baidu.com/hkbyest/blog/item/ee5218c295520137e5dd3b51.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D1%A7%CF%B0%CF%E0%B9%D8">学习相关</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/ee5218c295520137e5dd3b51.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-24  19:56</pubDate>
        <category><![CDATA[学习相关]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/ee5218c295520137e5dd3b51.html</guid>
</item>

<item>
        <title><![CDATA[【原创】汇编学习从入门到精通Step By Step]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/7cf5c7529aef080c0cf3e3b6.html]]></link>
        <description><![CDATA[
		
		<p>Cracker，一个充满诱惑的词。别误会，我这里说的是软件破解，想做骇客的一边去，这年头没人说骇客，都是“黑客”了，嘎嘎～</p>
<p><br>
公元1999年的炎热夏季，我捧起我哥留在家的清华黄皮本《IBM-PC汇编语言程序设计》，苦读。一个星期后我那脆弱的小心灵如玻璃般碎裂了，为了弥补伤痛我哭爹求妈弄了8k大洋配了台当时算是主流的PC，要知道那是64M内存！8.4G硬盘啊！还有传说中的Celeon 300A CPU。不过很可惜的是在当时那32k小猫当道的时代，没有宽带网络，没有软件，没有资料，没有论坛，理所当然我对伟大的计算机科学体系的第一步探索就此夭折，此时陪伴我的是那些盗版光盘中的游戏，把CRACK_XXX文件从光盘复制到硬盘成了时常的工作，偶尔看到光盘中的nfo文件，心里也闪过一丝对破解的憧憬。</p>
<p>上了大学后有网可用了，慢慢地接触到了一些黑客入侵的知识，想当黑客是每一个充满好奇的小青年的神圣愿望，整天看这看那，偷偷改了下别人的网页就欢喜得好像第一次偷到鸡的黄鼠狼。</p>
<p>大一开设的汇编教材就是那不知版了多少次的《IBM-PC汇编语言程序设计》，凭着之前的那星期苦读，考试混了个80分。可惜当时头脑发热，大学60分万岁思想无疑更为主流，现在想想真是可惜了宝贵的学习时间。</p>
<p>不知不觉快毕业了，这时手头上的《黑客防线》，《黑客X档案》积了一大摞，整天注来注去的也厌烦了，校园网上的肉鸡一打一打更不知道拿来干什么。这时兴趣自然转向了crack，看着杂志上天书般的汇编代码，望望手头还算崭新的汇编课本，叹了口气，重新学那已经忘光了的汇编语言吧。咬牙再咬牙，看完寻址方式那章后我还是认输，不认不行啊，头快裂了，第三次努力终告失败。虽然此时也可以爆破一些简单的软件，虽然也知道搞破解不需要很多的汇编知识，但我还是固执地希望能学好这门基础中的基础课程。</p>
<p>毕业了，进入社会了，找工作，上班，换工作成了主流旋律，每天精疲力尽的哪有时间呢？在最初的中国移动到考公务员再到深圳再到家里希望的金融机构，一系列的曲折失败等待耗光了我的热情，我失业了，赋闲在家无所事事，唯一陪伴我的是那些杂志，课本，以及过时的第二台电脑。我不想工作，我对找工作有一种恐惧，我靠酒精麻醉自己，颓废一段日子后也觉得生活太过无聊了，努力看书考了个CCNA想出去，结果还是被现实的就业环境所打败。三年时间，一无所获。</p>
<p>再之后来到女朋友处陪伴她度过刚毕业踏入社会工作的适应时期，这段时间随便找了个电脑技术工作，每月赚那么个几百块做生活费。不过这半年让我收获比较大的就是时间充裕，接触到了不少新东西，我下定决心要把汇编学好，这时我在网上看到了别人推荐的王爽《汇编语言》，没抱什么希望在当当网购了人生中的第一次物，19块6毛，我记得很清楚，呵呵。</p>
<p>废话终于完了，感谢各位能看到这里，下面进入正题吧。</p>
<p><br>
<strong><font color="#ff0000">16位汇编</font></strong></p>
<p><strong>对于一个汇编初学者，首先必看的就是王爽老师的这本《汇编语言》，虽然它不是很完整，虽然它有一些错漏，虽然它需要一些前置知识（详见书籍前言部分，前言一定要仔细看！），但是王爽老师独特的教学理念构造了这本循序渐进的书，我们从中可以抛开对汇编语言的畏惧心态，一步一步的深入进去，更可喜的是在这本书里我们可以学到宝贵的底层编程意识和思想，这对于初学者来说是最为重要的，掌握了意识思想，进一步学习下去也不会再艰难。大家学习的时候一定要严格按照“前言”的要求去做，这样才能有最好的效果。</strong></p>
<p><br>
<strong>半个月，就半个月，我已经看完了书，我可以自信地宣布：我掌握汇编语言了。虽然比较基础，但想想我那六年半时间，想想我那几次痛苦的尝试，心中无端生出一丝怨恨，为什么当年没有这本书呢，否则我的成就绝不会是现在这样。我的学习过程是先看完一遍书，做了一些习题（当时没电脑上机操作），现在有了新的电脑了，便重新看一遍，把所有的上机操作和编程练习都完成了（除了最后的磁盘操作外）。</strong></p>
<p> </p>
<p>好书推荐：<br>
1.《80x86汇编语言程序设计教程》杨季文编著，清华黑皮本。本书可以当作进一步深入学习的教材。</p>
<p>2.《The Art of Assembly Language》 [英文版]，经典著作。</p>
<p> </p>
<p> </p>
<p><strong><font color="#ff0000">32位汇编</font></strong></p>
<p><strong>虽然上面学到的知识已经可以应付大学要求，但是16位汇编始终还是落后于时代了，所以我们要学习32位汇编，这里首推的是《Intel汇编语言程序设计（第4版）》，可以这样说，有了这本书，你就可以不必看别的32位汇编教材了。不过这本书的内容比较压缩，信息量大，需要时常翻阅复习。本书适合初学者及从16位转向32位汇编的人们。本书光盘中带有例子程序和作者Kip Irvine写的几个链接库，极大地简化了一些烦琐的基本操作，同时附带的Masm 6.15和编译链接批处理程序也可以用在王爽老师的《汇编语言》学习里，不过我建议不要安装光盘里的TextPad来编写源代码，个人推荐使用EditPlus。<br>
认真学完这本书，应该可以对付一般的破解工作了，起码我是能进行一般的算法分析推出注册码咯。</strong></p>
<p>好书推荐：</p>
<p>80x86保护模式系列教程 [中文版] 作者：李彦昌。本书可以可以当作进一步深入学习的教材。</p>
<p><br>
<strong><font color="#ff0000">64位汇编</font></strong></p>
<p><strong>虽然现在我们的系统主要还是WinNT系列，但是64位的CPU已经普及市场，64位的操作系统Vista也在不少电脑里安家落户，64位汇编语言学习不再是前沿研究。可惜我手头上的资料太少，无法作进一步介绍，各位高手看到这里还请指点。</strong></p>
<p>相关资料：《Intel 64位CPU指令集及编程方法》电子文档。</p>
<p>相关链接：<br>
1.<br>
开始进行 64 位 Windows 系统编程之前需要了解的所有信息<br>
<a href="http://www.microsoft.com/china/MSDN/library/Windev/64bit/issuesx64.mspx?mfr=true">http://www.microsoft.com/china/MSDN/library/Windev/64bit/issuesx64.mspx?mfr=true</a></p>
<p>2.<br>
Moving to Windows x64<br>
<a href="http://www.ntcore.com/Files/vista_x64.htm">http://www.ntcore.com/Files/vista_x64.htm</a></p>
<p> </p>
<p> </p>
<p><br>
<font color="#ff0000" size="4"><strong>Win32汇编</strong></font></p>
<p><strong>单纯的汇编似乎除了在底层开发，嵌入式开发以及高级语言内嵌汇编外没有多少地方使用了。为了在实际应用中更大地发挥，我们必须学习Win32汇编。这方面的资料比较少，国内的当然就是罗云彬的《Windows环境下32位汇编语言程序设计 第二版》了。hoho，大部头著作啊，可以当成防身行暴武器哦。</strong></p>
<p>好书推荐：<br>
1.<br>
《Iczelion的Win32汇编教程》，网络上最初的系统Win32教程，罗云彬那书大部分内容都是从里面编著出来的，呵呵。</p>
<p>2.《Kernel Mode Drivers教程中文版》，Four-F的驱动开发教程，不论开不开发驱动还是得看看。</p>
<p> </p>
<p> </p>
<p><strong>如果你已经精通上面罗列的东西，觉得有点不胜寒了，建议还是进行一下流行的哲学研究吧。</strong></p>
<p>好书推荐：<br>
1.<br>
朱邦复的《组合语言之艺术》，作者的经验可以让我们的效率变得更高。</p>
<p>2.<br>
《汇编语言与禅-Zen Of Assembly Language》，我还没看，哪位有空慢慢研究吧。</p>
<p> </p>
<p> </p>
<p><font color="#993300">个人建议，虽然上面的书籍都能找到电子书，但是我认为上面列出的主要的三本书最好还是买纸质实体书吧，主要便于阅读和翻查，而且这么好的书，你能不支持一下作者吗？正版系统买不起而已，正版书籍我们还是扛得住的，小小一百几十块钱，少抽几包烟就够了。况且实体书读起来的感觉就是比电子书要好。如果您更喜欢阅读电子版本，那么当这段是废话略过也罢。</font></p>
<p> </p>
<p> </p>
<p><font face="宋体" size="4"><strong>学习难免遇到一时难于解决的问题，网络交流也是必须的，介绍一下我认为不错的几个网站：</strong></font></p>
<p>汇编语言学习论坛：<br>
<a href="http://www.asmedu.net/forum.jsp">http://www.asmedu.net/forum.jsp</a><br>
这里有王爽《汇编语言》讨论区，好像网站没开多久，大家凑合看看吧。</p>
<p><br>
《Intel汇编语言程序设计（第4版）》作者的网站：<br>
<a href="http://kipirvine.com/asm/4th/index.html">http://kipirvine.com/asm/4th/index.html</a><br>
这个链接是关于书本的，更多内容请自己看首页。</p>
<p><br>
罗云彬的编程乐园：<br>
<a href="http://asm.yeah.net">http://asm.yeah.net</a><br>
上面有不少好东西下载哦。</p>
<p><br>
AoGo汇编小站<br>
<a href="http://www.aogosoft.com/">http://www.aogosoft.com/</a><br>
东西不少，论坛也还可以。</p>
<p><br>
80x86汇编小站<br>
<a href="http://www.x86asm.com/">http://www.x86asm.com/</a></p>
<p><br>
CSDN论坛汇编板块：<br>
<a href="http://community.csdn.net/Expert/ForumList.asp?typenum=1&amp;roomid=1703">http://community.csdn.net/Expert/ForumList.asp?typenum=1&amp;roomid=1703</a></p>
<p><br>
国外的著名汇编论坛：<br>
<a href="http://www.asmcommunity.net/board/index.php">http://www.asmcommunity.net/board/index.php</a><br>
<a href="http://masm32.com/board/">http://masm32.com/board/</a></p>
<p><br>
MSDN当然也不能少：<br>
<a href="http://msdn2.microsoft.com/zh-cn/default.aspx">http://msdn2.microsoft.com/zh-cn/default.aspx</a></p>
<p>顺便广告广告：<br>
我的博客<a href="http://hi.baidu.com/hkbyest">http://hi.baidu.com/hkbyest</a>和<a href="http://blog.csdn.net/hkbyest/">http://blog.csdn.net/hkbyest/</a>里也有我平时收集的一些资料和代码，有空捧捧场交流一下。</p>
<p> </p>
<p><br>
<strong><font color="#ff0000">总结</font></strong></p>
<p><strong>学习汇编或许不容易，而且很枯燥，但是作为计算机科学体系中的重要基础，掌握汇编除了进行破解外还有许多优点，最简单地说，这么底层这么枯燥这么难的你都能学好，那些高级的人性化的还在话下吗？希望本文能给广大汇编学习者一些帮助，谢谢～</strong></p> <a href="http://hi.baidu.com/hkbyest/blog/item/7cf5c7529aef080c0cf3e3b6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D4%AD%B4%B4%D7%F7%C6%B7">原创作品</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/7cf5c7529aef080c0cf3e3b6.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-22  03:24</pubDate>
        <category><![CDATA[原创作品]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/7cf5c7529aef080c0cf3e3b6.html</guid>
</item>

<item>
        <title><![CDATA[下面那IBM几何题的答案]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/17dba5d3bc546bdda9ec9a1a.html]]></link>
        <description><![CDATA[
		
		<p>答案,的确挺复杂的: <br>
<br>
Fuxiang&nbsp;&nbsp;&nbsp; Yu&nbsp;&nbsp;&nbsp; sent&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp; much&nbsp;&nbsp;&nbsp; improved&nbsp;&nbsp;&nbsp; solution&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; puzzle:&nbsp;&nbsp;&nbsp; Link&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; pdf <br>
<br>
Most&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; submited&nbsp;&nbsp;&nbsp; solutions&nbsp;&nbsp;&nbsp; demonstrated&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; fundamental&nbsp;&nbsp;&nbsp; challenge&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; problem:&nbsp;&nbsp;&nbsp; How&nbsp;&nbsp;&nbsp; do&nbsp;&nbsp;&nbsp; you&nbsp;&nbsp;&nbsp; prove&nbsp;&nbsp;&nbsp; something&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; seems&nbsp;&nbsp;&nbsp; obviously&nbsp;&nbsp;&nbsp; true?&nbsp;&nbsp;&nbsp; The&nbsp;&nbsp;&nbsp; problem’s&nbsp;&nbsp;&nbsp; simplicity&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; intuitive&nbsp;&nbsp;&nbsp; “obviousness”&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; conclusion&nbsp;&nbsp;&nbsp; lead&nbsp;&nbsp;&nbsp; many&nbsp;&nbsp;&nbsp; responders&nbsp;&nbsp;&nbsp; down&nbsp;&nbsp;&nbsp; dead&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;&nbsp; paths.&nbsp;&nbsp;&nbsp; Some&nbsp;&nbsp;&nbsp; suggested&nbsp;&nbsp;&nbsp; using&nbsp;&nbsp;&nbsp; trigonometric&nbsp;&nbsp;&nbsp; functions&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; prove&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp;<strong>ABC</strong>&nbsp;&nbsp;&nbsp; equilateral,&nbsp;&nbsp;&nbsp; but&nbsp;&nbsp;&nbsp; none&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; other&nbsp;&nbsp;&nbsp; triangles&nbsp;&nbsp;&nbsp; present&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; implicitly&nbsp;&nbsp;&nbsp; “right”&nbsp;&nbsp;&nbsp; triangles.&nbsp;&nbsp;&nbsp; Others&nbsp;&nbsp;&nbsp; began&nbsp;&nbsp;&nbsp; with&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; assumption&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; triangles&nbsp;&nbsp;&nbsp;<strong>ADF</strong>,&nbsp;&nbsp;&nbsp;<strong>BED</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>CFE</strong>&nbsp;&nbsp;&nbsp; were&nbsp;&nbsp;&nbsp; congruent,&nbsp;&nbsp;&nbsp; which&nbsp;&nbsp;&nbsp; cannot&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; assumed,&nbsp;&nbsp;&nbsp; but&nbsp;&nbsp;&nbsp; rather&nbsp;&nbsp;&nbsp; needs&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; proved.&nbsp;&nbsp;&nbsp;<br>
Here&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; our&nbsp;&nbsp;&nbsp; solution.&nbsp;&nbsp;&nbsp; Click&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; IBM&nbsp;&nbsp;&nbsp; techexplorer&nbsp;&nbsp;&nbsp; version.&nbsp;&nbsp;&nbsp;<br>
<br>
Our&nbsp;&nbsp;&nbsp; earlier&nbsp;&nbsp;&nbsp; posted&nbsp;&nbsp;&nbsp; solution&nbsp;&nbsp;&nbsp; follows.&nbsp;&nbsp;&nbsp; We&nbsp;&nbsp;&nbsp; proceed&nbsp;&nbsp;&nbsp; by&nbsp;&nbsp;&nbsp; breaking&nbsp;&nbsp;&nbsp; into&nbsp;&nbsp;&nbsp; cases.&nbsp;&nbsp;&nbsp; Let&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; sides&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp;<strong>DEF</strong>&nbsp;&nbsp;&nbsp; have&nbsp;&nbsp;&nbsp; length&nbsp;&nbsp;&nbsp;<strong>x</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; line&nbsp;&nbsp;&nbsp; segments&nbsp;&nbsp;&nbsp;<strong>AD</strong>,&nbsp;&nbsp;&nbsp;<strong>BE</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>CF</strong>&nbsp;&nbsp;&nbsp; have&nbsp;&nbsp;&nbsp; length&nbsp;&nbsp;&nbsp;<strong>y</strong>.&nbsp;&nbsp;&nbsp; The&nbsp;&nbsp;&nbsp; form&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; our&nbsp;&nbsp;&nbsp; solution&nbsp;&nbsp;&nbsp; will&nbsp;&nbsp;&nbsp; depend&nbsp;&nbsp;&nbsp; on&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; value&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; y/x.&nbsp;&nbsp;&nbsp; We&nbsp;&nbsp;&nbsp; begin&nbsp;&nbsp;&nbsp; with&nbsp;&nbsp;&nbsp; some&nbsp;&nbsp;&nbsp; special&nbsp;&nbsp;&nbsp; cases.&nbsp;&nbsp;&nbsp; The&nbsp;&nbsp;&nbsp; following&nbsp;&nbsp;&nbsp; Diagram&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; referenced&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp; Case&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; &amp;&nbsp;&nbsp;&nbsp; 2. <br>
<br>
<img src="http://domino.research.ibm.com/Comm/wwwr_ponder.nsf/adb20e05aa0a2930852568a900582629/81ceb9e7c0ebb18188256a110004a9e8/PonderSolutionContent/0.2F00?OpenElement&amp;FieldElemFormat=gif"> <br>
<br>
<strong>Case&nbsp;&nbsp;&nbsp; 1,&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; y/x&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 2/SQR3&nbsp;&nbsp;&nbsp;</strong><br>
<br>
In&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; largest&nbsp;&nbsp;&nbsp; value&nbsp;&nbsp;&nbsp; possible&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp; angle&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; would&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; --when&nbsp;&nbsp;&nbsp; angle&nbsp;&nbsp;&nbsp;<strong>ADF&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 90°</strong>&nbsp;&nbsp;&nbsp; (see&nbsp;&nbsp;&nbsp; diagram).&nbsp;&nbsp;&nbsp; Since&nbsp;&nbsp;&nbsp;<strong>AD&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; BE&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; CF</strong>,&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; holds&nbsp;&nbsp;&nbsp; true&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp; triangles&nbsp;&nbsp;&nbsp;<strong>BED</strong>&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>CFE</strong>&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; well.&nbsp;&nbsp;&nbsp; In&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp;&nbsp; then,&nbsp;&nbsp;&nbsp; since&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp;<strong>A</strong>,&nbsp;&nbsp;&nbsp;<strong>B</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>C</strong>&nbsp;&nbsp;&nbsp; must&nbsp;&nbsp;&nbsp; sum&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; ,&nbsp;&nbsp;&nbsp; they&nbsp;&nbsp;&nbsp; must&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; 60°,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>ABC</strong>&nbsp;&nbsp;&nbsp; equilateral.&nbsp;&nbsp;&nbsp;<br>
<br>
<strong>Case&nbsp;&nbsp;&nbsp; 2,&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; y/x&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp; 2/&nbsp;&nbsp;&nbsp; SQR3&nbsp;&nbsp;&nbsp;</strong><br>
<br>
In&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; case,&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; x&nbsp;&nbsp;&nbsp; grows&nbsp;&nbsp;&nbsp; smaller&nbsp;&nbsp;&nbsp; (or&nbsp;&nbsp;&nbsp; y&nbsp;&nbsp;&nbsp; larger,&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp;&nbsp; both)&nbsp;&nbsp;&nbsp; Angle&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; only&nbsp;&nbsp;&nbsp; grows&nbsp;&nbsp;&nbsp; smaller&nbsp;&nbsp;&nbsp; (see&nbsp;&nbsp;&nbsp; diagram).&nbsp;&nbsp;&nbsp; Again,&nbsp;&nbsp;&nbsp; since&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; occuring&nbsp;&nbsp;&nbsp; equally&nbsp;&nbsp;&nbsp; throughout&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp;<strong>ABC&nbsp;&nbsp;&nbsp; (AD&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; BE&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; CF</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp;<strong>DEF</strong>&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; equilateral),&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp;<strong>A</strong>,&nbsp;&nbsp;&nbsp;<strong>B</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp; must&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; under&nbsp;&nbsp;&nbsp; 60°,&nbsp;&nbsp;&nbsp; which&nbsp;&nbsp;&nbsp; makes&nbsp;&nbsp;&nbsp; it&nbsp;&nbsp;&nbsp; very&nbsp;&nbsp;&nbsp; difficult&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp; them&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; sum&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 180°.&nbsp;&nbsp;&nbsp; So&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; not&nbsp;&nbsp;&nbsp; possible.&nbsp;&nbsp;&nbsp;<br>
<br>
<strong>Case&nbsp;&nbsp;&nbsp; 3,&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; y/x&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 1,&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp; ADF&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; isosceles.&nbsp;&nbsp;&nbsp;</strong><br>
<br>
For&nbsp;&nbsp;&nbsp; convenience,&nbsp;&nbsp;&nbsp; lable&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; follows:&nbsp;&nbsp;&nbsp;<strong>ADF&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; beta,&nbsp;&nbsp;&nbsp; FAD&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; A,&nbsp;&nbsp;&nbsp; DFA&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; gamma,&nbsp;&nbsp;&nbsp; CFE&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; delta</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>BED&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; epsilon</strong>.&nbsp;&nbsp;&nbsp; We&nbsp;&nbsp;&nbsp; know&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; gamma&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 90°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; 2.&nbsp;&nbsp;&nbsp; This&nbsp;&nbsp;&nbsp; implies&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; delta&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; (gamma&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp; 60°).&nbsp;&nbsp;&nbsp; Substituting&nbsp;&nbsp;&nbsp; (90°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; (beta&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; 2))&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;&nbsp; gamma,&nbsp;&nbsp;&nbsp; we&nbsp;&nbsp;&nbsp; get&nbsp;&nbsp;&nbsp; delta&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; (beta&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; 2)&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp; 30°.&nbsp;&nbsp;&nbsp; Similarly,&nbsp;&nbsp;&nbsp; epsilon&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; (delta&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; 2)&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp; 30°,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; (epsilon&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; 2)&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp; 30°.&nbsp;&nbsp;&nbsp; The&nbsp;&nbsp;&nbsp; system&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; linear&nbsp;&nbsp;&nbsp; equations&nbsp;&nbsp;&nbsp; has&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; unique&nbsp;&nbsp;&nbsp; solution&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; &gt;<strong>A</strong>&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; gamma&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; delta&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; epsilon&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 60°.&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; particular&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; ,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; same&nbsp;&nbsp;&nbsp; argument&nbsp;&nbsp;&nbsp; implies&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; three&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; large&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; it&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; therefore&nbsp;&nbsp;&nbsp; equilateral.&nbsp;&nbsp;&nbsp;<br>
<br>
<strong>Case&nbsp;&nbsp;&nbsp; 4,&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; (y/x)&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;</strong><br>
<br>
Consider&nbsp;&nbsp;&nbsp; fixed&nbsp;&nbsp;&nbsp; values&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp;<strong>x</strong>,&nbsp;&nbsp;&nbsp;<strong>y</strong>&nbsp;&nbsp;&nbsp; with&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp;<strong>y</strong>&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp;<strong>x</strong>.&nbsp;&nbsp;&nbsp; Concentrate&nbsp;&nbsp;&nbsp; first&nbsp;&nbsp;&nbsp; on&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; triangel&nbsp;&nbsp;&nbsp;<strong>DAF</strong>,&nbsp;&nbsp;&nbsp; where&nbsp;&nbsp;&nbsp; we&nbsp;&nbsp;&nbsp; label&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp; above&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; two&nbsp;&nbsp;&nbsp; sides&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; fixed&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp;&nbsp;<strong>FD&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; x,&nbsp;&nbsp;&nbsp; DA&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; y</strong>.&nbsp;&nbsp;&nbsp; Let&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; range&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp;&nbsp; 0°&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; notice&nbsp;&nbsp;&nbsp; what&nbsp;&nbsp;&nbsp; happens&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; gamma.&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp;<strong>increases</strong>,&nbsp;&nbsp;&nbsp; AF&nbsp;&nbsp;&nbsp;<strong>increases</strong>&nbsp;&nbsp;&nbsp; (by&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; law&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; cosines),&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; decreases&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 0°.&nbsp;&nbsp;&nbsp; By&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; law&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; sines,&nbsp;&nbsp;&nbsp; gamma&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp;&nbsp; first&nbsp;&nbsp;&nbsp; increases&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp;&nbsp; 0°,&nbsp;&nbsp;&nbsp; but&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; hits&nbsp;&nbsp;&nbsp; 90°,&nbsp;&nbsp;&nbsp; gamma&nbsp;&nbsp;&nbsp; starts&nbsp;&nbsp;&nbsp; decreasing&nbsp;&nbsp;&nbsp; (if&nbsp;&nbsp;&nbsp; plotted&nbsp;&nbsp;&nbsp; on&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp; graph,&nbsp;&nbsp;&nbsp; gamma’s&nbsp;&nbsp;&nbsp; range&nbsp;&nbsp;&nbsp; would&nbsp;&nbsp;&nbsp; describe&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp; parabola). <br>
So&nbsp;&nbsp;&nbsp; there&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; exactly&nbsp;&nbsp;&nbsp; one&nbsp;&nbsp;&nbsp; value&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; beta,&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp; it&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp; which&nbsp;&nbsp;&nbsp; makes&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 60°.&nbsp;&nbsp;&nbsp; Let&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; called&nbsp;&nbsp;&nbsp;<strong>A</strong>0&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; gamma0&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;<strong>A</strong>0.&nbsp;&nbsp;&nbsp; We&nbsp;&nbsp;&nbsp; would&nbsp;&nbsp;&nbsp; have&nbsp;&nbsp;&nbsp; delta0&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; gamma0&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; beta0.&nbsp;&nbsp;&nbsp; Then&nbsp;&nbsp;&nbsp; each&nbsp;&nbsp;&nbsp; angle&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; large&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; it&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; equilateral.&nbsp;&nbsp;&nbsp;<br>
Suppose&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; three&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp; beta,&nbsp;&nbsp;&nbsp; delta,&nbsp;&nbsp;&nbsp; epsilon,&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; smaller&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; beta0.&nbsp;&nbsp;&nbsp; Then&nbsp;&nbsp;&nbsp; each&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; three&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp;<strong>A</strong>,&nbsp;&nbsp;&nbsp;<strong>B</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>C</strong>&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; larger&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; 60°,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; so&nbsp;&nbsp;&nbsp; can’t&nbsp;&nbsp;&nbsp; sum&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 180°.&nbsp;&nbsp;&nbsp;<br>
The&nbsp;&nbsp;&nbsp; only&nbsp;&nbsp;&nbsp; other&nbsp;&nbsp;&nbsp; possibility&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; largest&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; three,&nbsp;&nbsp;&nbsp; say&nbsp;&nbsp;&nbsp; beta,&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; larger&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; beta0.&nbsp;&nbsp;&nbsp; Then&nbsp;&nbsp;&nbsp;<strong>A</strong>&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp;<strong>A</strong>0&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; 90°&nbsp;&nbsp;&nbsp; so&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; gamma&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; gamma0&nbsp;&nbsp;&nbsp; ,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; delta&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp; gamma&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; also&nbsp;&nbsp;&nbsp; larger&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; beta0&nbsp;&nbsp;&nbsp; .&nbsp;&nbsp;&nbsp; By&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; same&nbsp;&nbsp;&nbsp; argument,&nbsp;&nbsp;&nbsp; epsilon&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp; beta0&nbsp;&nbsp;&nbsp; .&nbsp;&nbsp;&nbsp; Then&nbsp;&nbsp;&nbsp; each&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; three&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp;<strong>A</strong>,&nbsp;&nbsp;&nbsp;<strong>B</strong>&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>C</strong>&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; smaller&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; 60°&nbsp;&nbsp;&nbsp; ,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; again&nbsp;&nbsp;&nbsp; they&nbsp;&nbsp;&nbsp; can’t&nbsp;&nbsp;&nbsp; sum&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 180°.&nbsp;&nbsp;&nbsp;<br>
So,&nbsp;&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; this&nbsp;&nbsp;&nbsp; case,&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; only&nbsp;&nbsp;&nbsp; consistent&nbsp;&nbsp;&nbsp; conclusion&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; beta0&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; large&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; equilateral.&nbsp;&nbsp;&nbsp;<br>
<br>
<strong>Case&nbsp;&nbsp;&nbsp; 5,&nbsp;&nbsp;&nbsp; when&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; (y/x)&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; SQR3&nbsp;&nbsp;&nbsp;</strong><br>
<br>
This&nbsp;&nbsp;&nbsp; last&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; somewhat&nbsp;&nbsp;&nbsp; easier&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; above.&nbsp;&nbsp;&nbsp; Consider&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp; movable&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; before,&nbsp;&nbsp;&nbsp; but&nbsp;&nbsp;&nbsp; remember&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp;<strong>y</strong>&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp;<strong>x</strong>&nbsp;&nbsp;&nbsp; .&nbsp;&nbsp;&nbsp; So&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; grows&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp;&nbsp; 0°&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 180°,&nbsp;&nbsp;&nbsp; we&nbsp;&nbsp;&nbsp; notice&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; gamma&nbsp;&nbsp;&nbsp; shrinks&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp;&nbsp; 180°&nbsp;&nbsp;&nbsp; to&nbsp;&nbsp;&nbsp; 0°,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; delta&nbsp;&nbsp;&nbsp; grows.&nbsp;&nbsp;&nbsp; This&nbsp;&nbsp;&nbsp; means&nbsp;&nbsp;&nbsp; that&nbsp;&nbsp;&nbsp; beta,&nbsp;&nbsp;&nbsp; delta,&nbsp;&nbsp;&nbsp; epsilon&nbsp;&nbsp;&nbsp; must&nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; same;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;&nbsp; delta&nbsp;&nbsp;&nbsp; were&nbsp;&nbsp;&nbsp; larger&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; beta,&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; (by&nbsp;&nbsp;&nbsp; monotonicity)&nbsp;&nbsp;&nbsp; epsilon&nbsp;&nbsp;&nbsp; would&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; larger&nbsp;&nbsp;&nbsp; than&nbsp;&nbsp;&nbsp; delta,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; beta&nbsp;&nbsp;&nbsp; would&nbsp;&nbsp;&nbsp; be&nbsp;&nbsp;&nbsp; larger&nbsp;&nbsp;&nbsp; still,&nbsp;&nbsp;&nbsp; which&nbsp;&nbsp;&nbsp; would&nbsp;&nbsp;&nbsp; yield&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp; contradiction.&nbsp;&nbsp;&nbsp; If&nbsp;&nbsp;&nbsp; beta,&nbsp;&nbsp;&nbsp; delta,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; epsilon&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; same,&nbsp;&nbsp;&nbsp; then&nbsp;&nbsp;&nbsp; by&nbsp;&nbsp;&nbsp; side-angle-side,&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; three&nbsp;&nbsp;&nbsp; triangles&nbsp;&nbsp;&nbsp;<strong>ADF</strong>,&nbsp;&nbsp;&nbsp;<strong>CFE</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>BED</strong>&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; congruent,&nbsp;&nbsp;&nbsp; so&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; outer&nbsp;&nbsp;&nbsp; angles&nbsp;&nbsp;&nbsp;<strong>A</strong>,&nbsp;&nbsp;&nbsp;<strong>B</strong>,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;<strong>C</strong>&nbsp;&nbsp;&nbsp; are&nbsp;&nbsp;&nbsp; equal,&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp;&nbsp; large&nbsp;&nbsp;&nbsp; triangle&nbsp;&nbsp;&nbsp; is&nbsp;&nbsp;&nbsp; equilateral.&nbsp;&nbsp;&nbsp;<br>
</p>
<p> </p>
<p><font color="#000080">意思是： <br>
从我们有这题开始，很多兄弟提交了他们的答案。这个几何题看上去大的三角形显然就是等边三角形，以为很简单，不行的，告诉你不行的，这样是不行的。也有一些弟兄假设△ADF，△BED和△CFE全等，但这些假设都是没有根据的，哎，没办法下面我们只能给出一下比较差劲的证明。 <br>
我们这个早前（差劲）的证明是这样的，假设△DEF的边为x，这条边分割AD、BE和CF。AD=BE=CF的长度y。我们解决问题的方向主要是根据y/x的值的情况来穷举的。共有下面几种情况，第一，第二种情况请参照图解。 <br>
（这是我作的说明，第一、二种情况的y不是AD的长度，而是AF的长度参照图，第三种情况后，y所指长度才为AD。让我费解。） <br>
<img src="http://domino.research.ibm.com/Comm/wwwr_ponder.nsf/adb20e05aa0a2930852568a900582629/81ceb9e7c0ebb18188256a110004a9e8/PonderSolutionContent/0.2F00?OpenElement&amp;FieldElemFormat=gif"> <br>
第一种情况：y/x=2/SQR3&nbsp;&nbsp;&nbsp; (2除以根号3) <br>
这种情况的出现，最大的可能是∠A=60°、∠ADF=90°；又因为AD=BE=CF，所以△BED全等于△CFE,三角形的内角和为180°，所以△ABC的每个角都为60°，这种情况下是△ABC等边三角形。 <br>
第二种情况：y/x &gt;2/SQR3 <br>
这种情况的引起为：x变小或y变大，或同时x变小和y变大。由此可推出∠A变小，（看图，不明的再看图，再看图。哈哈）又因为△EDF为等边三角形且AD=BE=CF，那么∠A和∠B与∠C都小于60°（三角形的内角和等于180°），这种情况可能吗？。故这种情况是不可能出现的。 <br>
第三种情况：y/x=1或都可以说△ADF为等腰三角形 <br>
为方便起见，我们先来些标记∠ADF=∠β、∠FAD=∠α、∠DFA=∠γ、∠CFE=∠δ、∠BED=∠ε这样我们得到∠γ=∠α=(180°-∠β)/2=90°-∠β/2;∠δ=180°-(∠γ+60°),将∠γ代入得到∠δ=(∠β/2)+30°,同样的得到∠ε=(∠β/2)+30°&nbsp;&nbsp;&nbsp; 和∠β=(∠ε/2)+30° <br>
由这些方程式可以得到∠β= &gt;∠α=∠γ=∠δ&nbsp;&nbsp;&nbsp; =∠ε=&nbsp;&nbsp;&nbsp; 60°.&nbsp;&nbsp;&nbsp; 从而求证到∠α=60°,同理可证其它二个角也为60°因此这个△ABC大三角形是全等三角形。 <br>
后两情况兄弟们自己看着办吧。。。。。 <br>
第四种情况：0&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; (y/x)&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。。。。 <br>
第五种情况：1&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; (y/x)&nbsp;&nbsp;&nbsp; &lt;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; /&nbsp;&nbsp;&nbsp; SQR3&nbsp;&nbsp;&nbsp;<br>
</font>&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://domino.research.ibm.com/Comm/wwwr_ponder.nsf/images/1998/$FILE/triangles.GIF"> </p> <a href="http://hi.baidu.com/hkbyest/blog/item/17dba5d3bc546bdda9ec9a1a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D0%C4%C7%E9%CB%E6%B1%CA">心情随笔</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/17dba5d3bc546bdda9ec9a1a.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-22  00:02</pubDate>
        <category><![CDATA[心情随笔]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/17dba5d3bc546bdda9ec9a1a.html</guid>
</item>

<item>
        <title><![CDATA[IBM几年前的一道几何证明题]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/502f832a3f434e99033bf618.html]]></link>
        <description><![CDATA[
		
		<a target="_blank" href="http://hiphotos.baidu.com/hkbyest/abpic/item/162535d096559b87a0ec9c05.jpg">
<div forimg="1">
<div forimg="1"><img border="0" small="0" class="blogimg" src="http://hiphotos.baidu.com/hkbyest/pic/item/90dfb01105e445cea7ef3f72.jpg"></div>
</div>
</a>
<p>能答出来的人不多哦～</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D0%C4%C7%E9%CB%E6%B1%CA">心情随笔</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/502f832a3f434e99033bf618.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-22  00:00</pubDate>
        <category><![CDATA[心情随笔]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/502f832a3f434e99033bf618.html</guid>
</item>

<item>
        <title><![CDATA[【原创】菜鸟PEDIY之打造“连连看”高手]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/2bdddab1afe030560923029c.html]]></link>
        <description><![CDATA[
		
		<p>内容简介：</p>
<p>修改“水晶连连看”游戏的“提示”功能，使其提示不减少时间。</p>
<p> </p>
<p><font color="#3366ff">本文已发表于《黑客防线》2007年7月刊，版权归杂志所有，这里就不发出来了。</font></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D4%AD%B4%B4%D7%F7%C6%B7">原创作品</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/2bdddab1afe030560923029c.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:26</pubDate>
        <category><![CDATA[原创作品]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/2bdddab1afe030560923029c.html</guid>
</item>

<item>
        <title><![CDATA[终于收到黑客防线7月份样刊了]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/a03be1001b034385e950cd91.html]]></link>
        <description><![CDATA[
		
		<p>第一次投稿，第一次发表文章，第一次看到自己的文字变成铅字，那感觉...</p>
<p>不过平邮还真慢啊，南宁的朋友7月初都拿到样刊了，到百色这里居然就19号了，鄙视一下广西的邮政系统效率。</p>
<p>郁闷的是19号早上我还问了独行者大编寄书时间，听闻挺早前就发出了，当时还伤心以为被某些不良份子吞了呢，害得独行者同志安慰俺说发8月样刊时给我补寄，呜呜～真是好人啊。不料下午就到书了，那个汗～ </p>
<p>捧着散发墨香的杂志，一看就忘了时间，所以直到现在才能写这小小的感动。</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D0%C4%C7%E9%CB%E6%B1%CA">心情随笔</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/a03be1001b034385e950cd91.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:23</pubDate>
        <category><![CDATA[心情随笔]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/a03be1001b034385e950cd91.html</guid>
</item>

<item>
        <title><![CDATA[学习汇编前你应该知道的知识4]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/243f7197a102446f55fb9696.html]]></link>
        <description><![CDATA[
		
		<p>第四讲 汇编程序</p>
<p>4.1 汇编程序框架</p>
<p>data SEGMENT '数据段，编程者可以把数据都放到这个段里<br>
....数据部分<br>
'数据格式是： 标识符 db/dw 数据。<br>
data ENDS'数据段结束处。</p>
<p>edata SEGMENT '附加数据段，编程者可以把数据都放到这个段里<br>
....附加数据部分<br>
edata ENDS'附加数据段结束处。</p>
<p>code SEGMENT'代码段，实际的程序都是放这个段里。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSUME CS:code,DS:data,ES:edata '告诉编译程序，data段是数据段DS，code段是代码段CS<br>
start:MOV AX,data '前面的start表示一个标识位，后面用到该位，如果用不到，就可以不加<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV DS,AX '这一句与上一行共同组成把data赋值给DS。段寄存器.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV AX,edata <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV ES,AX '与前一句共同组成edata-&gt;ES<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .......程序部分<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV AX,4C00h'程序退出，该句内存由下一行决定。退出时，要求ah必须是4c。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT 21h<br>
code ENDS'代码段结束。<br>
END start'整个程序结束，并且程序执行时由start那个位置开始执行。</p>
<p><br>
上面就是一个程序的框架结构。在这个结构中，有三个段，DS，ES，CS。这三个段分别存数据，附加数据，代码段。</p>
<p>4.2 编写我们的Hello,world思路。<br>
开始编写我们的第一个程序。<br>
程序要求：显示一个“Hello,Mr.286.”怎么样？<br>
思路：<br>
1 要显示一个字符串，根据前面我让你们记的七八个指令够吗？答案是：不仅够，而且还用不完。<br>
首先定义一下总可以吧。</p>
<p>hellostr db 'Hello,Mr.286.$'<br>
最后的$不要忘了。</p>
<p>2 首先要考虑的问题就是找中断，找到合适的中断，该中断就能帮我们完成这个显示任务。我找到（在哪找到的，怎么找到的，别问我，到网上或书上都能找到）：<br>
-------------------------------------------<br>
中断INT 21H功能09H</p>
<p>功能描述： 输出一个字符串到标准输出设备上。如果输出操作被重定向，那么，将无法判断磁盘已满 <br>
入口参数： AH＝09H<br>
DS:DX＝待输出字符的地址<br>
说明：待显示的字符串以’$’作为其结束标志 <br>
出口参数： 无 <br>
------------------------------------------- <br>
由上面看到，我们所需要作的就是把DS指向数据段，DX指向字符串的地址，AH等于9H,调用21h中断。<br>
mov ds,数据段地址<br>
lea dx,hellostr 'hellostr已在前面1中定义了。<br>
mov ah,9h<br>
int 21h。<br>
由于只要在调用int 21h之前把准备的东西准备齐就行了，所以int 21h前面三行的顺序并不重要。</p>
<p>3 退出程序，运行完总要退出呀。再查中断手册<br>
--------------------------------------------<br>
中断INT 21H功能4CH</p>
<p>功能描述： 终止程序的执行，并可返回一个代码 <br>
入口参数： AH＝4CH<br>
AL＝返回的代码 <br>
出口参数： 无 </p>
<p>--------------------------------------------<br>
mov ah,4Ch<br>
mov al,0<br>
int 21h<br>
或<br>
mov ax,4c00h<br>
int 21h<br>
这里需要说明的是返回代码有什么用，返回给谁？返回给操作系统，因为是操作系统DOS调用的这个程序，这个返回值可以通过批处理中的errorlevel得到，这里不多说明，实际上操作系统很少处理这一值，因此al你随便写什么值影响都不大。</p>
<p>4.3 程序实现<br>
data SEGMENT<br>
msg DB 'Hello, Mr.286.$'<br>
data ENDS</p>
<p>code SEGMENT<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSUME CS:code,DS:data<br>
start:MOV AX,data<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV DS,AX<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea dx,msg <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ah,9h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 21h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV AX,4C00h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT 21h<br>
code ENDS<br>
END start</p>
<p>4.4 编译运行。<br>
把上面程序保存成hello286.asm后，就可以编译运行了。进入DOS，进入汇编目录，如果还没下载，到前面找下载地址。</p>
<p>=================================================<br>
E:\Download\Masm&gt;masm hello286.asm<br>
Microsoft (R) Macro Assembler Version 5.00<br>
Copyright (C) Microsoft Corp 1981-1985, 1987.&nbsp;&nbsp; All rights reserved.</p>
<p>Object filename [hello286.OBJ]:<br>
Source listing&nbsp;&nbsp; [NUL.LST]:<br>
Cross-reference [NUL.CRF]:</p>
<p>&nbsp;&nbsp; 50408 + 415320 Bytes symbol space free</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 Warning Errors<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 Severe&nbsp;&nbsp; Errors<br>
说明：上面连续三个回车，表示我要的都是默认值。下面是零个警告，零个严重错误，（当然了，我的程序还敢错吗？）</p>
<p>E:\Download\Masm&gt;link hello286</p>
<p>Microsoft (R) Overlay Linker&nbsp;&nbsp; Version 3.60<br>
Copyright (C) Microsoft Corp 1983-1987.&nbsp;&nbsp; All rights reserved.</p>
<p>Run File [HELLO286.EXE]:<br>
List File [NUL.MAP]:<br>
Libraries [.LIB]:<br>
LINK : warning L4021: no stack segment</p>
<p>说明：三个回车仍要默认，后面有个警告，没有栈段，这个没关系，没有的话系统会自动给一个。</p>
<p>E:\Download\Masm&gt;hello286<br>
Hello, Mr.286.<br>
说明：运行成功。<br>
E:\Download\Masm&gt;<br>
4.4 深度思考<br>
4.4.1 是不是数据必须放数据段，代码必段放代码段呢？<br>
答，代码必段放代码段，否则你怎么执行呀？但数据也可以放到代码段，只是程序要作修改。<br>
code SEGMENT<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSUME CS:code,DS:data<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg DB 'Hello, Mr.286.$'<br>
start:MOV AX,data<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV DS,AX<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea dx,msg <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ah,9h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 21h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV AX,4C00h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT 21h<br>
code ENDS<br>
END start<br>
编译后仍然可以。<br>
4.4.2 我编的程序在内存中是什么样子的呢？<br>
------------------------------------------------------------------------<br>
E:\Download\Masm&gt;debug hello286.exe<br>
-u<br>
1420:0000 B81F14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; AX,141F<br>
1420:0003 8ED8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; DS,AX<br>
1420:0005 8D160000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LEA&nbsp;&nbsp;&nbsp;&nbsp; DX,[0000]<br>
1420:0009 B409&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; AH,09<br>
1420:000B CD21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp; 21<br>
1420:000D B8004C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; AX,4C00<br>
1420:0010 CD21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp; 21<br>
1420:0012 FF362421&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH&nbsp;&nbsp;&nbsp;&nbsp; [2124]<br>
1420:0016 E87763&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALL&nbsp;&nbsp;&nbsp;&nbsp; 6390<br>
1420:0019 83C406&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADD&nbsp;&nbsp;&nbsp;&nbsp; SP,+06<br>
1420:001C FF362421&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH&nbsp;&nbsp;&nbsp;&nbsp; [2124]<br>
-d 141f:0000 L20<br>
141F:0000&nbsp;&nbsp; 48 65 6C 6C 6F 2C 20 4D-72 2E 32 38 36 2E 24 00&nbsp;&nbsp; Hello, Mr.286.$.<br>
141F:0010&nbsp;&nbsp; B8 1F 14 8E D8 8D 16 00-00 B4 09 CD 21 B8 00 4C&nbsp;&nbsp; ............!..L<br>
-q</p>
<p>E:\Download\Masm&gt;<br>
------------------------------------------------------------------------------<br>
上面是什么呀？还记得前面说的吗？<br>
1420:0000 B81F14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; AX,141F<br>
&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
段址:偏址 机器语言&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov指令 把段地址的地址(141f)赋值给AX寄存器。</p>
<p>1420:0012后面的是垃圾数据，不用管它，把上面程序与源程序作一个比较，看有什么不用，差别在于把标号语言转成实际地址了。<br>
程序前两行一执行，数据段地址就变成了141f，而那个字符串偏移地址在0000，由（LEA&nbsp;&nbsp;&nbsp;&nbsp; DX,[0000]看出），所以我用-d 141f:0000 L20（后面L20表示只显示20个字节），就能把段地址显示出来了。<br>
所以刚才的程序在内存中就变成了：<br>
141f:0000 Hello, Mr.286.$&nbsp;&nbsp; -----&gt;这是段地址里的内存<br>
1420:0000 B81F14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; AX,141F&nbsp;&nbsp; ------&gt;这是代码段里的内存。data变成了实际地址<br>
1420:0003 8ED8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; DS,AX<br>
1420:0005 8D160000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LEA&nbsp;&nbsp;&nbsp;&nbsp; DX,[0000] ------&gt;偏址变成了0000，因为实际上msg也就是从头开始的。当然是0了。<br>
1420:0009 B409&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; AH,09&nbsp;&nbsp;&nbsp;&nbsp; -------&gt;注意Debug里，默认的是十六进制<br>
1420:000B CD21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp; 21<br>
1420:000D B8004C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp; AX,4C00<br>
1420:0010 CD21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp; 21</p>
<p> </p>
<p> </p>
<p><br>
 </p>
<p>刚刚学习了8086/8088汇编语言，发现寻址方式非常重要，于是做了一个小总结，请各位笑纳。<br>
概念：<br>
&nbsp;&nbsp;&nbsp;&nbsp; 1.指令集：cpu能够执行的指令的集合。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 2.指令：cpu所能够执行的操作。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 3.操作数：参加指令运算的数据。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 4.寻址方式：在指令中得到操作数的方式。<br>
现在就重点讨论寻址方式，说白了也就是cpu怎么样从指令中得到操作数的问题。另外再强调一点操作数还分种类：<br>
1）数据操作数：全都是在指令当中参加操作的数据。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 1.立即操作数：它在指令中直接给出。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 2.寄存器操作数：它被放到寄存器中。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 3.存储器操作数：当然在存储器也就是内存中。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 4.i/o操作数：它在你给出的i/o端口中。<br>
2）转移地址操作数：在指令当中不是参加运算或被处理的数据了，而是转移地址。<br>
还可以按照下面分类方式：<br>
1）源操作数src<br>
2）目的操作数dst<br>
源操作数都是指令当中的第2个操作数，在执行完指令后操作数不变。而目的操作数是指令当中的第1个操作数，在执行完操作指令后被新的数据替代。<br>
我们就围绕这几种操作数，也就是操作数所在的位置展开讨论。<br>
先说数据操作数，它分3大类共7种。<br>
1）立即数寻址方式：是针对立即操作数的寻址方式。在指令当中直接给出，它根本就不用寻址。<br>
例1：mov ax,1234h<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov [bx],5678h<br>
在这里1234h和5678h都是立即操作数，在指令当中直接给出。<br>
2）寄存器寻址方式：是针对寄存器操作数的寻址方式，它在寄存器中我们就用这中方式来找到它。<br>
例2：mov&nbsp;&nbsp; bx,ax<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; bp,[si]<br>
在这里ax，bx，ds都算是寄存器寻址，例1中的ax也是寄存器寻址方式。<br>
3）存储器寻址方式：针对在内存中的数据（存储器操作数）都用这种方式来寻找，一共有5种（这是我自己的说法，便于记忆）。<br>
不得不提及以下的概念：由于8086/8088的字长是16bit，能够直接寻址2的16次方也就是64kb，而地址总线是20bit，能够直接寻址2的20次方也就是1M空间，所以把内存分为若干个段，每个段最小16byte（被称为小节），最大64kb，它们之间可以相互重叠，这样一来内存就被分成以16byte为单元的64k小节，cpu就以1小节为单位寻址：在段寄存器中给出段地址（16bit），在指令当中给出段内偏移地址（16bit），然后把段地址左移4bit再与偏移地址求和就得到数据在内存当中的实际物理地址了，因而可以找到数据。<br>
1.存储器直接寻址方式：在指令当中以&nbsp;&nbsp; [地址]&nbsp;&nbsp; 的方式直接给出数据所在内存段的偏移地址。<br>
例3：mov&nbsp;&nbsp; ax,es:[1234h]<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dx,VALUE<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dx,[VALUE]<br>
在这里[1234h]和VALUE就是在指令中直接给出的数据所在内存段的偏移地址（16bit）。<br>
VALUE是符号地址，是用伪指令来定义的，它代表一个在内存中的数据（也就是它的名字）。es:是段前缀符，用来指出段地址，在这之前应该将段地址添入段中，本例中是es，默认是ds，也就是不需给出。应该注意&nbsp;&nbsp; [地址]&nbsp;&nbsp; 与立即寻址的区别，在直接给出的数据两边加&nbsp;&nbsp; []&nbsp;&nbsp; 表示存储器直接寻址，以区别立即寻址。另外&nbsp;&nbsp; VALUE=[VALUE]。<br>
2.寄存器间接寻址：不是在指令中直接给出数据在内存中的偏移地址，而是把偏移地址放到了寄存器中。<br>
例4：mov&nbsp;&nbsp; ax，[bx]<br>
这里[bx]就是寄存器间接寻址，bx中应方入段内偏移地址。其中：若使用bx,si,di默认段地址为ds，若使用bp则默认段地址为ss，并且允许段跨越，也就是加段前缀符。注意：在寄存器两边加&nbsp;&nbsp; []&nbsp;&nbsp; 以与寄存器寻址区别。<br>
3.寄存器间接相对寻址：偏移地址是bx,bp,si,di中的内容再与一个8bit或16bit 的位移量之和。<br>
例5：mov&nbsp;&nbsp; ax,[bx]+12h<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ax,[si]+5678h<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ax,[bp]+1234h<br>
在这里[bx]+12h，[si]+5678h，[bp]+1234h都是寄存器间接相对寻址。12h是8bit位移量，1234h和5678h是16bit位移量。若使用bx,si,di则默认段寄存器是ds，若使用bp则默认段寄存器是ss，并且允许段跨越。<br>
4.基址变址寻址：偏移地址是一个基址寄存器和一个变址寄存器内容的和，既：bx或bp中的一个与si或di中的一个求和而得到。<br>
例6：mov&nbsp;&nbsp; ax,[bx+si]<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ax,[bp+di]<br>
上面[bx+si]和[bp+di]都是基址变址寻址。若使用bx做基址寄存器则默认段地址为ds，若使用bp为基址寄存器则默认段为ss，允许段跨越。<br>
5.基址变址相对寻址：偏移量是一个基址寄存器一个变址寄存器只和再与一个8bit或一个16bit位移量只和得到。<br>
例7：mov&nbsp;&nbsp; ax,[bx+si]+12h<br>
&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ax,[bp+di]+1234h<br>
[bx+si]+12h和[bp+di]+1234h就是基址变址相对寻址。若使用bx做基址寄存器则默认段是ds，若使用bp做基址寄存器则默认段为ss。允许段跨越。</p>
<p>下面是转移地址操作数的寻址方式：<br>
1）段内直接转移<br>
&nbsp;&nbsp;&nbsp;&nbsp; 1.段内直接短转移：cs（代码段）内容不变，而ip（指令指针寄存器）内容由当前ip内容+（-127～127），在指令中直接给出。<br>
例8：jmp&nbsp;&nbsp; short&nbsp;&nbsp; SHORT_NEW_ADDR<br>
其中，short是段内短转移的操作符，用以指出是转移到当前位置前后不超过±127字节的地方。而NEW_ADDR是要转移到的符号地址，它的位置应该在当前ip指针所在偏移地址不超过<br>
±127的地方。否则语法出错。<br>
&nbsp;&nbsp;&nbsp;&nbsp; 2.段内直接近转移：cs内容不变，而ip内容由当前ip内容+（-32767～32767），在指令中直接给出。<br>
例9：jmp&nbsp;&nbsp; near&nbsp;&nbsp; ptr&nbsp;&nbsp; NEAR_NEW_ADDR<br>
其中near ptr是段内近转移的操作符，用以指出转移到当前位置前后不超过±32767的地方。NEAR_NEW_ADDR是要转移到的符号地址。<br>
2）段内间接转移：cs的内容不变，而ip的内容放在寄存器中或者存储器中给出。<br>
例10：jmp&nbsp;&nbsp; bx<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; word&nbsp;&nbsp; ptr&nbsp;&nbsp; [bx]+1234h<br>
这种寻址方式是在寄存器或存储器中找到要转移到的地址，而地址是16bit的，因而寄存器必须为16bit，如：bx，我们用word&nbsp;&nbsp; ptr来指定存储器单元也是16bit的。注意：它是间接的给出，只能使用类似于数据操作数中的除立即寻址以外的6种寻址方式（就在上面）。<br>
3）段间直接寻址：cs和ip的内容全都变化，由指令当中直接给出要转移到的某一个段内的某一个偏移地址处。<br>
例11：jmp&nbsp;&nbsp; 1234h：5678h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; far&nbsp;&nbsp; ptr&nbsp;&nbsp; NEW_ADDR<br>
1234h送入cs中作为新的段地址，5678h送入ip中作为新的偏移地址。far&nbsp;&nbsp; ptr是段间直接转移操作符，NEW_ADDR是另外一个段内的偏移地址，在这个指令中把NEW_ADDR的段地址送入cs（不用你给出），把它的段内偏移地址送入ip中作为新的偏移地址。<br>
4）段间间接寻址：cs和ip的内容全变化，由指令当中给出的一个4字节连续存储单元，其中低2字节送入ip作为偏移地址，高2字节送入cs作为段地址。<br>
例12：jmp&nbsp;&nbsp; dword&nbsp;&nbsp; ptr&nbsp;&nbsp; [bx][si]+1234h<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; dword&nbsp;&nbsp; ptr&nbsp;&nbsp; [1234h]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; dword&nbsp;&nbsp; ptr&nbsp;&nbsp; [si]<br>
dword&nbsp;&nbsp; ptr是双字（4个字节连续存储单元）操作符，用来指出下面的存储单元是4个字节的。由于它是4个字节的，所以只能使用类似于数据操作数中的存储器寻址方式（共5种，还记得吗？）。</p>
<p><br>
另外作为特殊的寻址方式还有三种：I/O寻址，串寻址，隐含寻址。它们都分别针对I/O指令，串操作指令以及无操作数的指令，而且都比较简单，读者自行总结。</p>
<p><br>
到此为止说明了8086/8088cpu中的所有寻址方式，我这里只是个总结，具体的细节还要大家自己钻研课本，才能理解。<br>
写的有些仓促可能有些遗漏或错误，还请谅解。<br>
-------------------------------------------------------------------------------------</p>
<p><br>
一定要记住寻址方式特别重要，这是我“毕生” 的总结，请笑纳，笑纳。 </p> <a href="http://hi.baidu.com/hkbyest/blog/item/243f7197a102446f55fb9696.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D1%A7%CF%B0%CF%E0%B9%D8">学习相关</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/243f7197a102446f55fb9696.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:19</pubDate>
        <category><![CDATA[学习相关]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/243f7197a102446f55fb9696.html</guid>
</item>

<item>
        <title><![CDATA[学习汇编前你应该知道的知识3]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/5a2cee38d2bc36c0d5622595.html]]></link>
        <description><![CDATA[
		
		<p>第三章 汇编指令<br>
3.1 什么是机器语言<br>
前面提到“最早的计算机采用机器语言，这种语言直接用二进制数表示，通过直接输入二进制数，插拔电路板等实现，这种“编程”很容易出错，每个命令都是通过查命令表实现”。<br>
比如要执行21号中断，需要查表，得到21号中断的指令就是CD 21。这样不管你通过什么方式，在内存指令位置，写入两个字节，一个是CD（这可不是音乐光盘，而是二进制数，转成十进制就是205），另一个是21（同样是十六进制，十进制是33）。<br>
上面就是机器语言。</p>
<p>3.2 什么是汇编语言<br>
前面也提到“既然是通过“查表”实现的，那当然也可以让计算机来代替人查表实现了。于是就产生了汇编语言”，汇编语言产生的重要目的就是用容易记的符号来代替容易出错的二进制数（或十六进制数）。<br>
比如前面的21号中断，机器语言是CD 21。而汇编语言就规定中断用int表示（interrupt的前三个字母），21号中断就成了int 21h。其中21后面的h表示是表示这个21是十六进制。由于大小写不敏感，所以int 21h写成下列方式都等价：<br>
int 33<br>
Int 21h<br>
INT 21H</p>
<p>3.3 汇编指令集<br>
一、数据传输指令 <br>
─────────────────────────────────────── <br>
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. <br>
1. 通用数据传送指令. <br>
MOV 传送字或字节. <br>
MOVSX 先符号扩展,再传送. <br>
MOVZX 先零扩展,再传送. <br>
PUSH 把字压入堆栈. <br>
POP 把字弹出堆栈. <br>
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. <br>
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. <br>
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. <br>
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. <br>
BSWAP 交换32位寄存器里字节的顺序 <br>
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) <br>
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) <br>
XADD 先交换再累加.( 结果在第一个操作数里 ) <br>
XLAT 字节查表转换. <br>
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 <br>
0-FFH); 返回 AL 为查表结果. ( [BX+AL]-&gt;AL ) <br>
2. 输入输出端口传送指令. <br>
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) <br>
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) <br>
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, <br>
其范围是 0-65535. <br>
3. 目的地址传送指令. <br>
LEA 装入有效地址. <br>
例: LEA DX,string ;把偏移地址存到DX. <br>
LDS 传送目标指针,把指针内容装入DS. <br>
例: LDS SI,string ;把段地址:偏移地址存到DS:SI. <br>
LES 传送目标指针,把指针内容装入ES. <br>
例: LES DI,string ;把段地址:偏移地址存到ES:DI. <br>
LFS 传送目标指针,把指针内容装入FS. <br>
例: LFS DI,string ;把段地址:偏移地址存到FS:DI. <br>
LGS 传送目标指针,把指针内容装入GS. <br>
例: LGS DI,string ;把段地址:偏移地址存到GS:DI. <br>
LSS 传送目标指针,把指针内容装入SS. <br>
例: LSS DI,string ;把段地址:偏移地址存到SS:DI. <br>
4. 标志传送指令. <br>
LAHF 标志寄存器传送,把标志装入AH. <br>
SAHF 标志寄存器传送,把AH内容装入标志寄存器. <br>
PUSHF 标志入栈. <br>
POPF 标志出栈. <br>
PUSHD 32位标志入栈. <br>
POPD 32位标志出栈. </p>
<p>二、算术运算指令 <br>
─────────────────────────────────────── <br>
ADD 加法. <br>
ADC 带进位加法. <br>
INC 加 1. <br>
AAA 加法的ASCII码调整. <br>
DAA 加法的十进制调整. <br>
SUB 减法. <br>
SBB 带借位减法. <br>
DEC 减 1. <br>
NEC 求反(以 0 减之). <br>
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). <br>
AAS 减法的ASCII码调整. <br>
DAS 减法的十进制调整. <br>
MUL 无符号乘法. <br>
IMUL 整数乘法. <br>
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), <br>
AAM 乘法的ASCII码调整. <br>
DIV 无符号除法. <br>
IDIV 整数除法. <br>
以上两条,结果回送: <br>
商回送AL,余数回送AH, (字节运算); <br>
或 商回送AX,余数回送DX, (字运算). <br>
AAD 除法的ASCII码调整. <br>
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) <br>
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) <br>
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) <br>
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) </p>
<p>三、逻辑运算指令 <br>
─────────────────────────────────────── <br>
AND 与运算. <br>
OR 或运算. <br>
XOR 异或运算. <br>
NOT 取反. <br>
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). <br>
SHL 逻辑左移. <br>
SAL 算术左移.(=SHL) <br>
SHR 逻辑右移. <br>
SAR 算术右移.(=SHR) <br>
ROL 循环左移. <br>
ROR 循环右移. <br>
RCL 通过进位的循环左移. <br>
RCR 通过进位的循环右移. <br>
以上八种移位指令,其移位次数可达255次. <br>
移位一次时, 可直接用操作码. 如 SHL AX,1. <br>
移位&gt;1次时, 则由寄存器CL给出移位次数. <br>
如 MOV CL,04 <br>
SHL AX,CL </p>
<p>四、串指令 <br>
─────────────────────────────────────── <br>
DS:SI 源串段寄存器 :源串变址. <br>
ES:DI 目标串段寄存器:目标串变址. <br>
CX 重复次数计数器. <br>
AL/AX 扫描值. <br>
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. <br>
Z标志 用来控制扫描或比较操作的结束. <br>
MOVS 串传送. <br>
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) <br>
CMPS 串比较. <br>
( CMPSB 比较字符. CMPSW 比较字. ) <br>
SCAS 串扫描. <br>
把AL或AX的内容与目标串作比较,比较结果反映在标志位. <br>
LODS 装入串. <br>
把源串中的元素(字或字节)逐一装入AL或AX中. <br>
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) <br>
STOS 保存串. <br>
是LODS的逆过程. <br>
REP 当CX/ECX&lt;&gt;0时重复. <br>
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX&lt;&gt;0时重复. <br>
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX&lt;&gt;0时重复. <br>
REPC 当CF=1且CX/ECX&lt;&gt;0时重复. <br>
REPNC 当CF=0且CX/ECX&lt;&gt;0时重复. </p>
<p>五、程序转移指令 <br>
─────────────────────────────────────── <br>
1&gt;无条件转移指令 (长转移) <br>
JMP 无条件转移指令 <br>
CALL 过程调用 <br>
RET/RETF过程返回. <br>
2&gt;条件转移指令 (短转移,-128到+127的距离内) <br>
( 当且仅当(SF XOR OF)=1时,OP1&lt;OP2 ) <br>
JA/JNBE 不小于或不等于时转移. <br>
JAE/JNB 大于或等于转移. <br>
JB/JNAE 小于转移. <br>
JBE/JNA 小于或等于转移. <br>
以上四条,测试无符号整数运算的结果(标志C和Z). <br>
JG/JNLE 大于转移. <br>
JGE/JNL 大于或等于转移. <br>
JL/JNGE 小于转移. <br>
JLE/JNG 小于或等于转移. <br>
以上四条,测试带符号整数运算的结果(标志S,O和Z). <br>
JE/JZ 等于转移. <br>
JNE/JNZ 不等于时转移. <br>
JC 有进位时转移. <br>
JNC 无进位时转移. <br>
JNO 不溢出时转移. <br>
JNP/JPO 奇偶性为奇数时转移. <br>
JNS 符号位为 "0" 时转移. <br>
JO 溢出转移. <br>
JP/JPE 奇偶性为偶数时转移. <br>
JS 符号位为 "1" 时转移. <br>
3&gt;循环控制指令(短转移) <br>
LOOP CX不为零时循环. <br>
LOOPE/LOOPZ CX不为零且标志Z=1时循环. <br>
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. <br>
JCXZ CX为零时转移. <br>
JECXZ ECX为零时转移. <br>
4&gt;中断指令 <br>
INT 中断指令 <br>
INTO 溢出中断 <br>
IRET 中断返回 <br>
5&gt;处理器控制指令 <br>
HLT 处理器暂停, 直到出现中断或复位信号才继续. <br>
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. <br>
ESC 转换到外处理器. <br>
LOCK 封锁总线. <br>
NOP 空操作. <br>
STC 置进位标志位. <br>
CLC 清进位标志位. <br>
CMC 进位标志取反. <br>
STD 置方向标志位. <br>
CLD 清方向标志位. <br>
STI 置中断允许位. <br>
CLI 清中断允许位. </p>
<p>六、伪指令 <br>
─────────────────────────────────────── <br>
DW 定义字(2字节). <br>
PROC 定义过程. <br>
ENDP 过程结束. <br>
SEGMENT 定义段. <br>
ASSUME 建立段寄存器寻址. <br>
ENDS 段结束. <br>
END 程序结束.<br>
3.4 再谈寄存器和内存的区别<br>
&nbsp;&nbsp; 第零讲说到“寄存器在CPU中。内存在内存条中。前者的速度比后者快100倍左右。后面的程序要求每条指定要么没有内存数据，要么在有一个寄存器的参与下有一个内存数据。（也就是说，不存在只访问内存的指令）。”<br>
&nbsp;&nbsp; 寄存器是在CPU中的存储器，而内存是在内存条中的存储器。CPU访问寄存器，只需要通过微指令直接就可以访问，而访问内存则要先经过总线，再由总线到达内存控制器，读到某单元的内存数据后放上总线，再传到CPU中，CPU才能使用。<br>
&nbsp;&nbsp; 8086系列计算机的寄存器，共有14个，每个都是十六位的。<br>
AX，BX，CX，DX，SP，BP，SI，DI，CS，DS，SS，ES，IP，FLAGS。<br>
其中前四位，每个可以单位再分成两个，AX=AH+AL，BX=BH+BL，CX=CH+CL，DX=DH+DL。这些分开的每个都是8位的。<br>
&nbsp;&nbsp; 这个分开不要理解成平时语言中的分开，你可以理解为AX是由AH和AL组合成的，你给AL付值，就意味着同时给AX的低半部付值。你给AX付值，就意味着同时改变AH和AL。这样作的好处是你可以更灵活地控制这个寄存器。</p>
<p><br>
3.5 指令说明<br>
看了3.3的指令集和3.4的寄存器，是不是已经晕了，或者了迷糊？不要急，上面的东西虽然多，我也没让你一下学会，（其实有些永远也不会似乎也不是什么大不了的事）。为了应付看的懂我后面所说的，我把其中的指令挑几个重点的，你必须要记住，其它的慢慢学吧。</p>
<p>1数据传输指令。<br>
mov A,B <br>
注意不是move，这个指令是把B中的数据复制给A，（B中仍保存原状）。这里的A和B可以是寄存器，可以是内存。但可以同时是寄存器，不能同时是内存。比如<br>
mov ax,100 ；这是对的，注意100在这里叫立即数，但这个数在编译系统编译成exe的时候保存在内存中。如果学过别的高级语言，你就可以理解为这就是赋值语句 Let ax=100/ax:=100;/ax=100。<br>
2 伪指令<br>
伪指令就是不是真的指令，但他同时又是指令。之所以说这样矛盾的话，是因为伪指令不是机器语言的一部分，而是汇编语言的一部分，是你告诉汇编的编译系统如何去作。<br>
string DB '这是我的第一个汇编语言程序$'<br>
上面一行指令中，DB就是伪指令，他的作用就是告诉编译程序，把后面一些数据或字符串放到内存中。当然对于exe来说，已在内存中了，就不用“告诉”了。（这就是为什么叫伪指令）。string是你给这段内存起的名字，如果你不需要这段内存，不起名字也可以，但如果后面要用，当然要加上这个名字。'这是我的第一个汇编语言程序$'这个就是要处理的数据，当然你也可以换成别的内容，但需要注意的是，要以'$'结尾，这是汇编的约写，即：只是到了$，就认为字符串结束，否则就一直向下找，直到找到一个$为止。所以这就要求你的字符串中不能有'$'，如果必须有，再换别的处理方式，后面再说。<br>
3 地址传送指令<br>
Lea A,string<br>
前面已经定义了string，后面要把地址找到，就要用到lea指令。lea是把字符串的地址给A这个寄存器中，A当然可以上前面提到的任意寄存器。注意地址和内容的区别。如果是内容就是把string的字符串给A了。（当然这也不成立，一个字符串有很多字节，而一个寄存器只有两个字节）。<br>
那么从上面也看到了，string代表一个地址，lea把这个地址给了A，那这个地址到底在哪里呢？事实上这不重要，就象你要把某书店买书，这个书店在哪并不是最重要的，有没有你要的书才是最重要的。所以你前面标出string，后面引用就行了，至于这个地址到底在哪是编译程序的事，不是你的事。</p>
<p>4 运算指令<br>
ADD A,N<br>
这个很容易理解吧，寄存器A加上N，把和仍存在A中。类似于高级语言中的let a=a+n/a:=a+n/a+=n。</p>
<p>5 串操作指令<br>
记住串操作指令表面很复杂，其实很简单。<br>
因为他就象一个复杂的数学公式一样简单，你所要记住的就是公式的格式，使用时具体套用即可。<br>
从一个地址到另一个地址的复制需要注意的是：<br>
*把源串段地址给DS。<br>
*把源串编址给SI。<br>
*把目的串段址给ES。<br>
*把目的串偏址给DI。<br>
*把要复制的个数给CX，这里可不考虑$了。<br>
*把FLAG中的方向标志标志你要的方向，一个是顺向，另一个是逆向。<br>
*发送loop movs,scans等命令。</p>
<p><br>
6 转移指令<br>
&nbsp;&nbsp; 记住：无条件转移指令 jmp。等于转 jz，不等于时转jnz</p>
<p>7 中断指令<br>
&nbsp;&nbsp; int 中断号，注意进制，默认是十进制，所以十六进制就加h。</p>
<p>好了，上面的指令变成七八个了，这你不能嫌多了吧，如果再嫌多就不要继续向下看了。</p> <a href="http://hi.baidu.com/hkbyest/blog/item/5a2cee38d2bc36c0d5622595.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D1%A7%CF%B0%CF%E0%B9%D8">学习相关</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/5a2cee38d2bc36c0d5622595.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:19</pubDate>
        <category><![CDATA[学习相关]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/5a2cee38d2bc36c0d5622595.html</guid>
</item>

<item>
        <title><![CDATA[学习汇编前你应该知道的知识2]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/222e46df4706f31163279894.html]]></link>
        <description><![CDATA[
		
		<p>第二讲 内存映象</p>
<p>&nbsp;&nbsp;&nbsp; 之所以把这个内存单独放一章，是为了说明它的重要性，后面的几乎很多程序都需要你对这一章的理解。这里的内存映象就是指当你把一个可执行文件（EXE或COM文件）放到内存后，整个内存“看”起来是什么样子的。<br>
&nbsp;&nbsp;&nbsp; 前面讲过，这里汇编程序只能访问1M的内存空间，所以下面就以1M内存为例。并且以DOS操作系统作为讲解对象，所以所编出来的程序也仅是DOS程序。事实上，通过winasm可以访问远远超过1M的空间，并且可以编出FOR windows的程序。但那是另外的话题。我们暂且不说那些。</p>
<p>2.1 内存映象<br>
&nbsp;&nbsp;&nbsp; 首先，这1M内存如果我们不再以二维的方式看，而是一维的，线性地看（二维和一维的转化方式参见前面章节）。但描述还是以二维的方式描述，从最底端到最高端依次是：<br>
&nbsp;&nbsp;&nbsp; 1 中断向量区：该区由0000:0000~0000:03FF。这里存着系统的所有中断的中断向量表，对于中断向量表，你现在先理解为一些程序的首地址。由这个地址你就能找到该程序。<br>
&nbsp;&nbsp;&nbsp; 2 系统数据区：该区由0040:0000~0040:XXXX（不好意思，忘了），这里存着整个系统中，DOS操作系统要用的数据，由于这个区的数据对用户是开放的，所以用户当然也可以从这里读出来用。<br>
&nbsp;&nbsp;&nbsp; 3 DOS操作系统区：操作系统常驻内存，你向计算机发的每个命令其实都是操作系统执行的。这个区的大小主要是由操作系统的版本和用户的配置大小决定，如果是驱动程序配置，就放到根目录下的config.sys里，如果是程序，就放到autoexec.bat里。这里设置在现在的windows 95/98/nt/me/2000/xp/2003中仍然有，所以我就不多说了。<br>
&nbsp;&nbsp;&nbsp; 4 用户程序，这个当然就是你执行的程序了，这种程序分两种，一种是扩展名为com文件，一种是exe文件，从程序内部看，前者程序的四个段重合（后面要讲这四个段），所以最大长度只等于一个段，用前面段地址的理解就是com文件最大只能是64K，所以com文件只适合小的程序。而exe，四个段可任何分配，并可扩充段，而且每个段的段地址可以任何改动，因此exe的访问内存能力大多了。这种格式访问能力只受地址结构的限制了。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户程序所占的内存大小完全由程序本身决定，但最大，只能到640K。这一点，怪不得别人，只能怪当前计算机软硬件设置高手高手高高手们（包括比尔盖茨）们的失误了，60年代的超级计算机只有36K的内存，所以他们就在80年代得到一个结论：640K的内存足够了。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果用户程序大于由操作系统所占内存的顶底到640K之间的内存量，就会显示：内存不够，因而程序不能执行。这种现象对于一开始就用windows的人来说，几乎没见过，但对于一开始用DOS并打汉字的人来说，再正常不过。如果小于这段内存，多余部分就空着。<br>
&nbsp;&nbsp;&nbsp; 5 从640K到1M-64K，这段内存就很难说清了。这段内存中有一部分被硬件占有，有一部分是显示缓冲区点有，还有一部分是系统ROM占有。<br>
&nbsp;&nbsp;&nbsp; 6 从1M-64K到1M之间的这段64K的内存叫作HMA。这段内存是小孩没娘，说来话长，我们先不说他。<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
2.2 验证上面的理论</p>
<p>2.2.1 中断向量表<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中断向量表就是所有中断向量首地址表，这里保存着每个中断程序的首地址，几乎所有的汇编书都把中断后面后面的章节中，并且对中断的解释也仅从字面意思解释，所以导致大学对中断的不重要和误解。没耐心的没到这个章节就不学汇编了，有耐心的到这里才豁然开朗。我现在不讲中断的原意。我直接告诉你，你把中断当成API也许更合适。也就是说，别人把很多已作好的功能放到了内存中。并且把调用这一功能的号告诉了你，你只要调用这些功能号，系统就自动从这个中断向量表中找到对应的中断，然后执行你的功能。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先让你感受一下中断的魅力一下吧。比如中断21H的2A功能调用是读取系统的日期，这个调用的规则是，调用前AH寄存器置为2A。调用后年在CX中，月在DH中，DL在日中，星期在AL中。<br>
-a<br>
139D:0100 mov ah,2a<br>
139D:0102 int 21<br>
139D:0104 int 3<br>
139D:0105<br>
-g=100</p>
<p>AX=2A05&nbsp;&nbsp;&nbsp; BX=0000&nbsp;&nbsp;&nbsp; CX=07D4&nbsp;&nbsp;&nbsp; DX=0C18&nbsp;&nbsp;&nbsp; SP=FFEE&nbsp;&nbsp;&nbsp; BP=0000&nbsp;&nbsp;&nbsp; SI=0000&nbsp;&nbsp;&nbsp; DI=0000<br>
DS=139D&nbsp;&nbsp;&nbsp; ES=139D&nbsp;&nbsp;&nbsp; SS=139D&nbsp;&nbsp;&nbsp; CS=139D&nbsp;&nbsp;&nbsp; IP=0104&nbsp;&nbsp;&nbsp; NV UP EI PL NZ NA PO NC<br>
139D:0104 CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br>
-<br>
可能上面的程序你目前还看不懂。不过没关系，“mov ah,2a”表示调用功能号是2a号。“int 21”表示调用十六进制21号中断，“int 3”表示3号中断，表示程序运行到这一句时停一下。“g=100”表示从“139D:0100 ”开始执行。<br>
AX=2A05&nbsp;&nbsp;&nbsp; BX=0000&nbsp;&nbsp;&nbsp; CX=07D4&nbsp;&nbsp;&nbsp; DX=0C18&nbsp;&nbsp;&nbsp; SP=FFEE&nbsp;&nbsp;&nbsp; BP=0000&nbsp;&nbsp;&nbsp; SI=0000&nbsp;&nbsp;&nbsp; DI=0000<br>
DS=139D&nbsp;&nbsp;&nbsp; ES=139D&nbsp;&nbsp;&nbsp; SS=139D&nbsp;&nbsp;&nbsp; CS=139D&nbsp;&nbsp;&nbsp; IP=0104&nbsp;&nbsp;&nbsp; NV UP EI PL NZ NA PO NC<br>
表示执行的结果。其中CX是年，这个年是由CX中存。07D4十进制就是2004年。DH+DL=DX，所以DH=0C，DL=18。二者转化为十进制就是DH=12,DL=24，也就是今天了。AX=AH+AL=2A05，所以AL=05。那就是今天是星期五。<br>
上面可能你们现在还看不懂，不过通过解说你应该可以知道，仅仅两行命令，就读到了现在的值。现在需要作的就是把这些值提取出来用作他用了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从中断的作来与中断向量表又有什么关系呢？原来你在汇编里运行int 21时，系统就在上面的中断向量表中找到int 21的中断地址，该中断的地址应该位于：0000:0084~0000:0087，具体算法前面已说明了。<br>
-d 0000:0084 0087<br>
0000:0080&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7C 10 A7 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |...<br>
-<br>
找到内容是：00A7:107C。然后系统就转到这个地址执行int 21。</p>
<p>2.2.2 系统数据区前面都已说明过。不再多说。系统区，很多DOS中断程序实现部分就在这个区。程序运行区依不同的程序而不用。</p>
<p>2.2.3 640K~1M之间，这期间有些地方是ROM，有些地方是硬件的BIOS区。我仅以两个例子说明这一区。<br>
&nbsp;&nbsp;&nbsp; ROM区：ROM区就是只读内存，也就是说这个区的数据只能读不能写。比如F000:0000开始的内存是ROM。我们来写一下，然后再看看效果。<br>
-d f000:0000 0005 '显示由F000:0000到F000:0005的六个字节值。<br>
F000:0000&nbsp;&nbsp;&nbsp; 04 E8 A2 FF F9 C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br>
-e f000:0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '修改命令<br>
F000:0000&nbsp;&nbsp;&nbsp; 04.00&nbsp;&nbsp;&nbsp; E8.00&nbsp;&nbsp;&nbsp; A2.00&nbsp;&nbsp;&nbsp; FF.00&nbsp;&nbsp;&nbsp; F9.00&nbsp;&nbsp;&nbsp; C3.00'注意，.后面的是我改的，把这几个值都改成0了。<br>
-d f000:0000 0005 '再次显示这个区的数据。<br>
F000:0000&nbsp;&nbsp;&nbsp; 04 E8 A2 FF F9 C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br>
-<br>
通过上面测试，发现该区数据仍然未改变。但你要是试别的RAM区的，肯定会变。如果想试你自己试试吧。</p>
<p>&nbsp;&nbsp;&nbsp; 显示缓冲区：在文本方式下，B800:0000开始的地址保存着屏幕上每个字符位置的值。在文本方式下，屏幕被分为80 X 25。每个位置有两个值，一个值是ASCII字符，一个值是该ASCII的属性值（主要是颜色）。所以一个屏幕共有80X25X2=400个字符。<br>
我们来改：<br>
-d b800:0000 0010 '显示屏幕缓冲区的内容，注意此时本行最左边的“-”是屏幕左上角。<br>
B800:0000&nbsp;&nbsp;&nbsp; 2D 07 64 07 20 07 62 07-38 07 30 07 30 07 3A 07&nbsp;&nbsp;&nbsp; -.d. .b.8.0.0.:.<br>
B800:0010&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
-<br>
看上面的命令，屏幕最上边一行是“-d b800:0000 0010”，所以他的内容就是“2D 07 64 07 20 07 62 07-38 07 30 07 30 07 3A 07”其中，2D是“-”的ASCII值，07是“-”的属性值。64是“d”的ASCII值，07是“d”的属性值。。。。。<br>
现在修改这些值。我把左上角的字改成黄颜色的“-”，那当然是改b800:0001的属性值了。<br>
-e b800:0001&nbsp;&nbsp;&nbsp; 0e<br>
是不是左上角的颜色变成黄色了吗？<br>
好了，把第二个字符变成绿色的“-”吧？<br>
-e b800:0002 2d 0b<br>
变了吗？</p>
<p>可执行文件内存映象<br>
DOS下可执行文件有两种（BAT是批处理文件，他只是简单调用DOS内部命令或其它程序，所以此处不认为它是可执行文件），一种是COM文件，一种是EXE文件，前面提到，COM文件一般小于64K。EXE文件则可以任意大。为什么呢？<br>
说到这里，还要提到段。每个段64K。段的作用就是数据组织单位。段的类型有三种：代码段（Code Segment，简称CS）、数据段（Data Segment，简称DS）、栈段（Stack Segment，简称SS），另外还有一个附加数据段(Extra Segment，简称ES），它的用与数据段DS可以认为完全一样，当数据段的64K不够用，或你就需要把数据放到两个段中以便移动、复制、比较时，才用到附加数据段ES。（当然，移动、复制、比较操作在一个段中也可以完成）。<br>
1 段的作用。<br>
1.1 代码段（CS），程序装入内存中，DOS怎么知道是从哪里执行呢？答案就是系统自动从代码段指定位置开始执行，并且始终在代码段中执行。内此代码段CS的作用就是保存所有的指令。这里所说的代码也就是汇编指令了。所以编写汇编程序也就主要是编写代码段中的代码。<br>
1.2 数据段（DS）、附加段（ES），顾名思义，数据段中存的就是数据，这些数据供代码段的程序调用。附加段就是附加数据段。作用与数据段相同。<br>
1.3 栈段（SS），这个段非常重要，但实际上，你在使用中，似乎用不着这个段，但实际上，这是黑客编程中最重要的一部分，而且系统会不停地“偷偷地”使用这个段，正是这个偷偷地用，使得系统的很多动作被记录到这个段中。还有两点，你必须记住：一是如果你使用了这个栈，比如你把数据存到这个栈中，则必须有相应的出栈命令，并且入几个数据，就得出几个数据，多一个或少一个，你的程序就可能导致死机或异常；二是你要把握操作时机，比如你不能在系统使用栈的前后使用栈，比如你在调用子程序之前入栈，而在子程序中出栈，而在系统调用子程序时，系统也要使用栈，这种也将导致出错。<br>
栈就是一种先入后出（也有称为后入先出）的结构，有地址由小到大的增加栈，有地址由大到小的逆向减栈。<br>
2 段重叠<br>
从上面，我们可以看到，CS，DS，SS三者作用各不相同，内存就是象录音磁带，录新歌，则旧歌被删，带子上存的始终是最后录的那段音乐。因此，如果重叠则必然相互冲突。那还能重叠吗？<br>
这里所说的重叠不是指内容重叠，而是指概念上的重叠，即数据相互放到一个段中，但相互可以区分开。比如某一段既有数据也有代码，则代码在每要执行到数据之前加一个跳转指令跳过这段代码。这个跳转指令要求用户在编程的时候加上。<br>
而栈段呢？栈段有自己的特殊性，特殊就在于系统也会自动地使用，而用户则又在不知道系统在使用的情况下使用。避免这种冲突的方法就是采用逆向的栈段。<br>
2 COM文件内存映象。<br>
&nbsp;&nbsp;&nbsp; COM文件被读到内存中后，该文件的前100H个字节被操作系统使用，操作系统使用这256个字节保存一些系统要使用的数据，汇编语言编程者不能在这里存自己的数据，但在知道这此数据的作用后可以使用其中的数据。从100H开始，就是程序的开始了。COM文件之所以最大只能有64K，其原因是COM文件的四个段是相互重叠的。也就是说，CS，DS，SS，ES四个段的地址都指向这个COM文件的100H处。程序代码、数据、栈都在由100H到64K的区域内。如何把三者分开呢？栈段采用逆向栈，这个栈由64K开始，随着数据入栈，则地址就减小。这样作的好处是，栈段由高端向低端进展，可以详细与数据、代码分开；坏处也不言而喻，假如一个COM程序大量用到栈（比如是个递归程序）因此栈就不停地降低，而程序代码本身也很多，甚至不停地申请新空间，这样数据和栈就会在中间碰头，导致程序被破坏。<br>
&nbsp;&nbsp;&nbsp; 区分开数据代码段与栈段后，下面讨论把数据段和代码段也分开。这个简单的多，只要逻辑上分开就可以。不过一般的方法就是：在100H处放一个跳转指令，随后放数据，然后再放置其它的代码。而100H处的跳转指令就跳到这里。<br>
因此，COM文件内存映象就是：<br>
CS：0000&nbsp;&nbsp;&nbsp; （由于COM的CS，DS，SS，ES三段重叠，因此此行前CS，写成DS，SS，ES都一样）。&nbsp;&nbsp;<br>
CS：0100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个跳转到YYYY地址的跳转指令。<br>
CS：0101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本程序所需要用到的数据<br>
CS：XXXX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据结束处。<br>
CS：YYYY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序代码保存处。<br>
CS：ZZZZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序代码结束处。<br>
CS：FFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 栈段开始处（注意栈是地址越来越小，所以这里是开始而不是结束处），也是程序的结束处。另外，此处FFFF与前面XXXX，YYYY，ZZZZ不一样，这里是十六进制的64K。</p>
<p>3. EXE文件<br>
&nbsp;&nbsp;&nbsp; 比起COM文件，EXE文件要复杂一些，他的复杂就在于COM文件前面规定了100H个字节用于系统使用，而EXE文件则有个文件头，文件头的大小看具体内容多少。文件头的内容使得EXE看起来复杂了，但也更灵活了。更重要的是，对于病毒设计者，这个文件头使他们如鱼得水。因为文件头处<br>
EXE文件的内存映象为：<br>
XXXX：0000 文件头<br>
XXXX：YYYY 文件头结束处。</p>
<p>CS：0000 代码段开始处<br>
CS：ZZZZ 代码段结束处</p>
<p>DS：0000 数据码段开始处<br>
DS：WWWW 数据码段结束处</p>
<p>SS：0000 栈段开始处<br>
SS：UUUU 栈段结束处</p>
<p>ES：0000 附加段开始处<br>
ES：VVVV 附加段结束处</p>
<p>说明：<br>
1 上述ES可以没有，要看实际需要<br>
2 CS，DS，ES，SS的顺序也是看编程者是怎么安排的，好在用户不必关心他的具体位置。<br>
3 由上可见，CS，DS，ES，SS的段地址肯定保存到了文件头中。<br>
4 由上可见，实际执行的只是CS，因此DS，ES，SS的首地址，CS肯定要想办法知道。：） <br>
</p> <a href="http://hi.baidu.com/hkbyest/blog/item/222e46df4706f31163279894.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D1%A7%CF%B0%CF%E0%B9%D8">学习相关</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/222e46df4706f31163279894.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:17</pubDate>
        <category><![CDATA[学习相关]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/222e46df4706f31163279894.html</guid>
</item>

<item>
        <title><![CDATA[学习汇编前你应该知道的知识]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/7931d044fb10634e510ffe89.html]]></link>
        <description><![CDATA[
		
		<p>作者: <a href="http://www.20cn.net/cgi-bin/club/userinfo.pl?user=unique"><font color="#004d9c">286</font></a> <font face="Courier New">[unique]</font></p>
<p>学习汇编前你应该知道的知识<br>
1 汇编需要什么工具和程序，到哪里下载？<br>
&nbsp;&nbsp;&nbsp; 目前阶段，汇编程序仅需要两个程序就够了。 masm.exe,link.exe。二者可由<a href="http://www.20cn.org/~unique/Download/Tool/masm.rar">http://www.20cn.org/~unique/Download/Tool/masm.rar</a>下载，前者是编译程序，后者是链接程序。<br>
&nbsp;&nbsp;&nbsp; 另外，为了验证和调试程序，还需要一个程序debug.exe，该程序由windows本身就提供，所以就不提供下载地址了。<br>
&nbsp;&nbsp;&nbsp; 将二者下载后，放到某一个目录中（任意目录都可以），考虑到很多命令需要通过键盘敲入，所以建议你不要把文件放入到长文件名目录、中文目录或很深的目录中。比如你可以建一个“D:\Masm”目录，并建议此后的程序都放这个目录，此后称这个目录为汇编目录。</p>
<p><br>
2 学习汇编需要有哪些编程方面的知识。<br>
&nbsp;&nbsp;&nbsp; 没有任何编程方面的知识，学习此语言等于缘木求鱼，所以请放弃学习的想法。一般来说至少要知道如下几点：<br>
&nbsp;&nbsp;&nbsp; *）程序的运行逻辑结构有顺序（按语句依次执行）、分支结构（IF...THEN...ELSE...)，循环结构（FOR...NEXT)三种结构。<br>
&nbsp;&nbsp;&nbsp; *）知道什么是子程序，什么是调用。<br>
&nbsp;&nbsp;&nbsp; *）汇编程序员的视角。不同编程视角编程要求是不一样的。比如删除文件，<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;用户的视角是找到“删除”按钮或菜单，然后单击一下即可。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;高级程序员的视角是知道删除的文件，并发出删除命令。这些通过API实现。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;汇编程员的视角是得到要删除的文件名，找到该文件所在位置，通过调用删除“中断命令”进行删除。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;操作系统开发人员的视角则是接到删除命令后，先找到系统根目录区，由根目录区的链接依次找到子目录区，直到找到要删除的文件，然后按照操作系统删除文件的规则对该文件名进行修改。比如DOS，只把第一个字符改成"?"。</p>
<p>&nbsp;&nbsp;&nbsp; 按程序语句等价的角度看，一行VB的打印语句，用汇编实现大约需要一百二十多行。知道汇编语言的视角后就要知道，前面的道路是坎坷的，没有耐心是不行的。想通过几分钟几行程序就完成很复杂的操作不是件容易的事。</p>
<p>3 学汇编有什么用？<br>
&nbsp;&nbsp;&nbsp; 汇编产生于DOS时代或更早，而现在是Windows时代，所以可能遗憾地说：尽管还有批牛人在用汇编开发核心级程序，但我们几乎没什么用，除了必要时间能拿来分析一两个程序的部分代码之外，别的也就没干什么用了。并且并不是所有的汇编命令都能在windows下使用。而泛泛地追求“时髦”而学本语言，最后的结果是损了夫人又折兵。所以学之前你要考虑好。我劝那些为了当“黑客”而学汇编的人就此止步。</p>
<p><br>
第零讲 预备知识</p>
<p>1 一个汇编程序的编译过程是怎么样的。<br>
&nbsp;&nbsp;&nbsp; 1）首先你需要找一个编辑器，编辑器用任何“纯文本”编辑器都可以。比如记事本。编好以后保存到汇编目录中。扩展名为asm，比如myfirst.asm。但这里建议你找一个能显示出当前行的编译器。这样出错后排错很容易。<br>
&nbsp;&nbsp;&nbsp; 2）然后在DOS下进入D:\Masm目录中，输入“masm myfirst.asm"，如果有错系统会提示出错的行位置和出错原因。<br>
&nbsp;&nbsp;&nbsp; 3）然后再输入“link myfirst.obj”，即可看到当前目录下有一个myfirst.exe程序。</p>
<p>2 宏汇编和汇编有什么区别吗？<br>
&nbsp;&nbsp;&nbsp; 二者的区别在于前者提供宏，后者不提供。后者已找不到了，所以你可以认为二者没有区别。</p>
<p>3 机器语言、汇编语言、高级语言的关系<br>
&nbsp;&nbsp;&nbsp; 最早的计算机采用机器语言，这种语言直接用二进制数表示，通过直接输入二进制数，插拔电路板等实现，这种“编程”很容易出错，每个命令都是通过查命令表实现，既然是通过“查表”实现的，那当然也可以让计算机来代替人查表实现了。于是就产生了汇编语言，所以不管别人怎么定义机、汇语言，我就认为，二者是等价。后来人们发现，用汇编语言编某一功能的时候，连续一段代码都是相同或相似，于是就考虑用一句语言来代替这一段汇编语言，于是就产生了高级语言。因此，所有高级语言都能转化成汇编语言，而所以汇编语言又可转化成机器语言。反之，所有机器语言可以转成汇编语言（因为二者等价）。但并不是所以汇编语言都能转成高级语言。</p>
<p>4 计算机的组成<br>
&nbsp;&nbsp;&nbsp; 通常都把计算机定义成五部分：运算器、控制器、存储器、输入系统、输出系统。<br>
&nbsp;&nbsp;&nbsp; 为了简单其间，我们如此理解：运算器+控制器=CPU。存储器=内存（暂不包括外存，永不包括CACHE）。输入系统=键盘（不包括鼠标），输入系统=显示器（不包括打印机，绘图仪）。</p>
<p>5 寄存器和内存的区别<br>
&nbsp;&nbsp;&nbsp; 寄存器在CPU中。内存在内存条中。前者的速度比后者快100倍左右。后面的程序要求每条指定要么没有内存数据，要么在有一个寄存器的参与下有一个内存数据。（也就是说，不存在只访问内存的指令）。</p>
<p>6 汇编语言的计数<br>
&nbsp;&nbsp;&nbsp; 与生活中的计数不一样，汇编中的计数是从0开始的。比如16个计数，则是从0~15，而不是生活中的1~16。这一点看起来简单，真运算起来就不是件容易的事了，不信等着瞧。</p>
<p>7 进制问题<br>
&nbsp;&nbsp;&nbsp; 又与生活中不一样的地方是进制。切记下面的常识：<br>
&nbsp;&nbsp;&nbsp; *）计算机内部存储都用二进制。<br>
&nbsp;&nbsp;&nbsp; *）我们的汇编源程序默认都用十进制。（除非你指明类型）<br>
&nbsp;&nbsp;&nbsp; *）我们用的调试程序debug默认的都是十六进制。（无法指明其他类型）<br>
&nbsp;&nbsp;&nbsp; 其中十六进制的十六个个位数依次是：0，1，2，3，4，5，6，7，8，9，A，B，C，D，E，F。</p>
<p>8 进制转换<br>
&nbsp;&nbsp;&nbsp; 一个比较简单的方法是查表法。<br>
&nbsp;&nbsp;&nbsp; 十进制 十六进制 二进制<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0001<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0010<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0011<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0100<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0101<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0110<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0111<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1001<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1010<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1011<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1101<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1110<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1111<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp; 好了，结合6，7，8三条。大家来算一个“题”。某一组数据显示时，每个数据占了四个位置，<br>
每行共十六个。问：十六进制的13位置在哪里（第几行，第几列）。<br>
&nbsp;&nbsp;&nbsp; 格式如下：m m m m n n n n o o o o p p p p '注：之所以没用ABC是怕与上面十六进制弄混。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r r r r s s s s t t t t u u u u<br>
第一讲 基础知识</p>
<p>1 访问内存<br>
&nbsp;&nbsp;&nbsp; 程序在内存中，访问内存是几乎每一程序都要进行的操作，计算机对内存编址是线性的，也就是说是一维的，比如256M的内存，地址就应该是从0~(256M-1)，这个地址称为物理地址或绝对地址。<br>
1.1 地址表示<br>
&nbsp;&nbsp;&nbsp; 但从汇编程序员的角度看，内存却是二维的，要说明一个地址，需要给出两个值，就象你在平面上指定一点需要说出（X，Y）坐标一样，汇编程序员的内存视角也需要两个“坐标”，前一个称为段地址（Segment），后一个称为偏移地址（Offset），该地址称为逻辑地址。<br>
&nbsp;&nbsp;&nbsp; 比如“1234:3DF5”就是一个地址。“1F3F：”不是一个地址，因为他只有段地址，没有编移地址。注意此后的地址都用十六进制表示。<br>
1.2 地址计算<br>
&nbsp;&nbsp;&nbsp; 前面提到，计算机编址是一维的，汇编程序员是二维的，那么二者怎么换算呢？由后者到前者的换算方法是，“段地址串”后面加个“0”，然后再加上偏移地址。<br>
&nbsp;&nbsp;&nbsp; 比如“1234:3DF5”（十六进制的加减运算参见相关资料）<br>
12340 ‘串后加了一个0<br>
3DF5<br>
-----<br>
16135&nbsp;&nbsp;&nbsp; ’注意此串仍然是十六进制。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，汇编程序员眼中的地址“1234：3DF5”就是物理地址（计算机编址）：16135。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 知道了由后者向前者的转换，那么由前者向后者的转换呢？<br>
&nbsp;&nbsp;&nbsp; “不知道”，为什么不知道，继续往下看。<br>
1.3 到底哪个地址对。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 知道了1.2的地址算法后，我又发现一个问题：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “1000：6135”的物理地址是多少呢？ 10000+6135=16135。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “1001：6125”的物理地址呢？ 10010+6125=16135。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么到底哪个对呢？问题的回答是这样的：假设我现在让你按一下“L”键，我可以告诉你如下几种方法中的一种或几种。1 请按一下“L”键； 2请按一下键盘上第四行第十个键；3 请按一下第十列中的第四个键；4 请按一下“K”右边的键；5 按标准指法单击一下右手无名指。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 举上面的例子也就是说，同一个地址有很多种表示方式，具体用哪一种，要看实际使用时的情况。但无论用哪种方式，只要能达到目的即可。（实际中该问题一般不会受此问题困扰，但初学时突然想不通）。<br>
1.4 有多少内存可以访问<br>
&nbsp;&nbsp;&nbsp; 无论是段地址还是偏移地址都是四位十六进制（如果不够四位，前面补0）。也就是说：总共可以访问的地址说是：0000：0000~FFFF：FFFF。 总共FFFF0+FFFF+1=10FFF0个地址。也就是不到1M的空间。<br>
&nbsp;&nbsp;&nbsp; 记住如下结论：<br>
&nbsp;&nbsp;&nbsp; *）不管你实际内存有多少，目前我们只能访问不到1M的空间。<br>
&nbsp;&nbsp;&nbsp; *）而实际上连这1M也用不完。其中上端的384K的址只能读不能写，只能读，一般称为ROM。<br>
&nbsp;&nbsp;&nbsp; *）低端的640K可以读写。但这640K的低端100多K也不能随便写，因此DOS系统使用该区。<br>
&nbsp;&nbsp;&nbsp; *）原来1024M的内存，汇编程序只能使用其中400多K。这段内存的容易相当于一个普通文档的大小。不过这就足够了。</p>
<p>2 DEBUG的使用<br>
先记住以下两个命令：D命令和Q命令。前者是显示内存内容，后者是退出DEBUG命令。<br>
-------------以下为抄别的人内容---------------<br>
DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具，具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部，因此可以说它是80X86CPU的心灵窗口，也是我们学习汇编语言必须掌握的调试工具。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）DEBUG程序使用</p>
<p>在DOS提示符下键入命令：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C&gt;DEBUG [盘符：][路径][文件名.EXE][参数1][参数2] </p>
<p>&nbsp;&nbsp;&nbsp; 这时屏幕上出现DEBUG的提示符“-”，表示系统在DEBUG管理之下，此时可以用DEBUG进行程序调试。若所有选项省略，仅把DEBUG装入内存，可对当前内存中的内容进行调试，或者再用N和L命令，从指定盘上装入要调试的程序；若命令行中有文件名，则DOS把DEBUG程序调入内存后，再由DEBUG将指定的文件名装入内存。<br>
2）DEBUG的常用命令<br>
（1）退出命令 Q<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式：Q<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 功能：退出DEBUG，返回到操作系统。<br>
（2）显示存储单元命令 D<br>
格式1：D[起始地址]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式2：D[起始地址][结束地址|字节数]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 功能：格式1从起始地址开始按十六进制显示80H个单元的内容，每行16个单元，共8行，每行右边显示16个单元的ASCII码，不可显示的ASCII码则显示“·”。格式2显示指定范围内存储单元的内容，其他显示方式与格式1一样。如果缺省起始地址或地址范围，则从当前的地址开始按格式1显示。<br>
例如：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -D 200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;表示从DS:0200H开始显示128个单元内容<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -D 100 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;表示显示DS:0100-DS:0120单元的内容<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：在DEBUG中，地址表示方式有如下形式：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 段寄存器名：相对地址，如：DS:100<br>
段基值：偏移地址（相对地址），如：23A0:1500</p>
<p>--------------------------小抄结束--------------------------------</p>
<p>3 验证第一节里的内容<br>
运行“开始/程序/附件/MS-DOS命令提示符”（这是win2000,win98下自己找吧）<br>
在“_”下输入D，显示<br>
-d<br>
1398:0100&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1398:0110&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 34 00 87 13&nbsp;&nbsp;&nbsp; ............4...<br>
1398:0120&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1398:0130&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1398:0140&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1398:0150&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1398:0160&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1398:0170&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
-<br>
我们记下：1398：011C的值是个34。1389：011C的物理地址应该是：13A9C。<br>
那么1000:3A9C的物理地址也应该是13A9C，他的内存也应该是34，（因为本来就是一个地址吗，就象第三行第十列和第十列第三行当然应该是同一个位置）。<br>
-d 1000:3A9C<br>
1000:3A90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34 00 87 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4...<br>
1000:3AA0&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1000:3AB0&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1000:3AC0&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1000:3AD0&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1000:3AE0&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1000:3AF0&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1000:3B00&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
1000:3B10&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-00 00 00 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ............<br>
-<br>
果然如此，同样你可以验证：13A9：000C也肯定是指这一个地址，不信试试。<br>
4 DEBUG命令<br>
-------------------继续小抄----------------<br>
前面已学过：显示存储单元命令 D<br>
再学一个命令<br>
（1）修改存储单元命令 E</p>
<p>格式1：E[起始地址] [内容表]</p>
<p>格式2：E[地址]</p>
<p>功能：格式1按内容表的内容修改从起始地址开始的多个存储单元内容，即用内容表指定的内容来代替存储单元当前内容。</p>
<p>例如：—E DS：0100 'VAR' 12 34</p>
<p>表示从DS:0100 为起始单元的连续五个字节单元内容依次被修改为</p>
<p>'V'、'A'、'R'、12H、34H。</p>
<p>格式2是逐个修改指定地址单元的当前内容。</p>
<p>如：—E DS：0010</p>
<p>156F：0010 41.5F</p>
<p>其中156F:0010单元原来的值是41H，5FH为输入的修改值。若只修改一个单元的内容，这时按回车键即可；若还想继续修改下一个单元内容，此时应按空格键，就显示下一个单元的内容，需修改就键入新的内容，不修改再按空格跳过，如此重复直到修改完毕，按回车键返回DEBUG“-”提示符。如果在修改过程中，将空格键换成按“-”键，则表示可以修改前一个单元的内容。</p>
<p>-------------------小抄结束----------------</p>
<p>5 使用DOS时，汇编用户可以从DOS操作系统中得到什么？<br>
&nbsp;&nbsp;&nbsp; 现在编程，通常很多功能都是通过调用系统API。很多高级语言都直接把这些API包装起来，以系统接口或函数的方式提供给用户，那么汇编函数都能得到什么呢？<br>
&nbsp;&nbsp;&nbsp; 首先，汇编用户有很多东西可以调用。他们主要是：<br>
&nbsp;&nbsp;&nbsp; 5.1 BIOS提供的接口。现在硬件与软件的区分已越来越不明显，很多硬件不仅仅是电路，而还要提供一些固化写入硬件的一部分“程序”，这些程序以ROM的方式出现，汇编用户最大的好处就是可以直接使用这些“程序”，这些使用不仅功能强大，而且效率非常高。<br>
&nbsp;&nbsp;&nbsp; 5.2 DOS功能调用，作为操作系统也象BIOS一样向用户提供了相应的“程序”。这些程序在很大程序上扩充了BIOS。与BIOS不同的是，这部分程序放在内存中，它可以被修改。而BIOS中不能再修改。<br>
&nbsp;&nbsp;&nbsp; ==========================================================<br>
&nbsp;&nbsp;&nbsp; 以上两种接口都通过一种相同的格式调用，这些程序统称为“中断”，现在先不要理解中断的本意，你现在可以认为是系统提供给你的函数。<br>
&nbsp;&nbsp;&nbsp; ============================================================<br>
&nbsp;&nbsp;&nbsp; 5.3 系统共享数据区。编过程序的人都知道全局变量的好处，全局变量方便之外在于任何函数、过程都可以调用、读取、修改。全局变量不足之处是危险性，有一个过程改了这个变量值，其它的也得跟着改变了。DOS操作系统同样也提供了这样的共享数据区，该区是整个系统的共享区，任何程序都可以查找、修改。当然，修改某处必然会对其它程序造成影响。</p>
<p>6 再谈中断<br>
&nbsp;&nbsp;&nbsp; 前面5.2已提到中断了,现在问题是不同硬件不一样，即使相同硬件的ROM，不同版本，各个BIOS中断程序所处的位置也不一样，DOS中断也一样，不同版本、不同配置，在内存位置也不一样。那么你使用某一个中断，系统怎么知道你使用的那个中断程序在哪呢？<br>
&nbsp;&nbsp;&nbsp; 为了解决这一问题，DOS会在启动的时候，把所有这些（BIOS和DOS）中断的首地址保存到一个地址。这个地址很容易记，这段地址是内存的绝对零地址（0000:0000）。前面已讲过，每个地址在汇编程序员角度来看是二维的，也就是分为段地址和偏移地址。每个地址各占两个字节，所以要表示这个二维地址需要4个字节。所以每个中断首地址由4个字节表示。一共256个中断，占用了1024个字节的位置。<br>
&nbsp;&nbsp;&nbsp; 另外需要注意的是，这4个表示地址的字节，数据是由低向高的。比如12 34 56 78所表示的地址是：7856:3412。<br>
一般用INT M表示中断M，如果M是十六进制，则在后面加上一个H。比如19号中断，十六进制应该是13H。所以该中断就是INT 13H。</p>
<p>7 再谈系统共享数据区<br>
&nbsp;&nbsp;&nbsp; 该共享数据区在绝对地址：0040:0000开始。</p>
<p>8 验证我上面说的内容<br>
&nbsp;&nbsp;&nbsp; 8.1 找中断<br>
&nbsp;&nbsp;&nbsp; 运行DEBUG后。输入D 0000：0000。显示绝对零地址的内容。<br>
&nbsp;&nbsp;&nbsp; C:\&gt;debug<br>
-d 0:0<br>
0000:0000&nbsp;&nbsp;&nbsp; 68 10 A7 00 8B 01 70 00-16 00 9B 03 8B 01 70 00&nbsp;&nbsp;&nbsp; h.....p.......p.<br>
0000:0010&nbsp;&nbsp;&nbsp; 8B 01 70 00 B9 06 0E 02-40 07 0E 02 FF 03 0E 02&nbsp;&nbsp;&nbsp; ..p.....@.......<br>
0000:0020&nbsp;&nbsp;&nbsp; 46 07 0E 02 0A 04 0E 02-3A 00 9B 03 54 00 9B 03&nbsp;&nbsp;&nbsp; F.......:...T...<br>
0000:0030&nbsp;&nbsp;&nbsp; 6E 00 9B 03 88 00 9B 03-A2 00 9B 03 FF 03 0E 02&nbsp;&nbsp;&nbsp; n...............<br>
0000:0040&nbsp;&nbsp;&nbsp; A9 08 0E 02 99 09 0E 02-9F 09 0E 02 5D 04 0E 02&nbsp;&nbsp;&nbsp; ............]...<br>
0000:0050&nbsp;&nbsp;&nbsp; A5 09 0E 02 0D 02 DC 02-B8 09 0E 02 8B 05 0E 02&nbsp;&nbsp;&nbsp; ................<br>
0000:0060&nbsp;&nbsp;&nbsp; 02 0C 0E 02 08 0C 0E 02-13 0C 0E 02 AD 06 0E 02&nbsp;&nbsp;&nbsp; ................<br>
0000:0070&nbsp;&nbsp;&nbsp; AD 06 0E 02 A4 F0 00 F0-37 05 0E 02 71 84 00 C0&nbsp;&nbsp;&nbsp; ........7...q...<br>
-u 0070:018B<br>
0070:018B 1E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DS<br>
0070:018C 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AX<br>
0070:018D B84000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AX,0040<br>
0070:0190 8ED8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DS,AX<br>
0070:0192 F70614030024&nbsp;&nbsp;&nbsp; TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD PTR [0314],2400<br>
0070:0198 754F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01E9<br>
0070:019A 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BP<br>
0070:019B 8BEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BP,SP<br>
0070:019D 8B460A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AX,[BP+0A]<br>
0070:01A0 5D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BP<br>
0070:01A1 A90001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AX,0100<br>
0070:01A4 7543&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01E9<br>
0070:01A6 A90002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AX,0200<br>
0070:01A9 7422&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01CD<br>
首先，D命令把中断首地址显示出来。每4个表示一个地址。其中INT 0的中断首地址为：00A7:1068，INT 1的中断地址为：0070:018B.......0070:018B是中断3的首地址。后面那个U命令就表示显示该地址的“中断程序”的内存。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你们可以试着找找INT 13H的位置在哪。<br>
&nbsp;&nbsp;&nbsp; 8.2 验证系统共享数据区<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统共享数据区内容极为丰富，我实在记不住哪么多了。我曾记在一个本上，可惜那个本早在N年前（3&lt;N&lt;6）就丢了。兄弟们谁找到这个地址的内容，一定要贴上来，这里有东西可以让大家眼界大开。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前几年，我用的286计算机是黑白显示器（555555~~~~~~~~~，别嫌我老、旧、慢呀），可当时有个游戏非要彩显，不是彩显不让运行。我就是改了这个区的某一个位，让哪游戏“以为”我用的是彩显，于是游戏能用了。虽然不好看，但总能用。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在DOS下，你每按一个键，系统都会记下来，下面我们一起找找这个键盘缓冲区的地址。知道这个地址，你就可以作一个“虚拟”键盘，通过发命令来模拟某个人在按键。这个地址位于：0040:001E。 其中每个键有两个字节，一个字节是ASCII码，一个是扫描码。共16个。<br>
C:\&gt;debug<br>
-d 40:0<br>
0040:0000&nbsp;&nbsp;&nbsp; F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F&nbsp;&nbsp;&nbsp; ..........x.x...<br>
0040:0010&nbsp;&nbsp;&nbsp; 22 C8 00 80 02 28 00 00-00 00 2A 00 2A 00 20 39&nbsp;&nbsp;&nbsp; "....(....*.*. 9<br>
0040:0020&nbsp;&nbsp;&nbsp; 34 05 30 0B 3A 27 30 0B-0D 1C 64 20 20 39 34 05&nbsp;&nbsp;&nbsp; 4.0.:'0...d&nbsp;&nbsp;&nbsp; 94.<br>
0040:0030&nbsp;&nbsp;&nbsp; 30 0B 3A 27 30 0B 0D 1C-71 10 0D 1C 64 20 00 00&nbsp;&nbsp;&nbsp; 0.:'0...q...d ..<br>
0040:0040&nbsp;&nbsp;&nbsp; A2 00 C3 00 A2 AF 09 E1-C8 03 50 00 00 10 00 00&nbsp;&nbsp;&nbsp; ..........P.....<br>
0040:0050&nbsp;&nbsp;&nbsp; 00 18 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
0040:0060&nbsp;&nbsp;&nbsp; 0F 0C 00 D4 03 29 30 7F-03 00 C0 00 A1 B7 11 00&nbsp;&nbsp;&nbsp; .....)0.........<br>
0040:0070&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-14 14 14 00 01 01 01 01&nbsp;&nbsp;&nbsp; ................<br>
-d 0040:0000<br>
0040:0000&nbsp;&nbsp;&nbsp; F8 03 F8 02 E8 03 E8 02-BC 03 78 03 78 02 80 9F&nbsp;&nbsp;&nbsp; ..........x.x...<br>
0040:0010&nbsp;&nbsp;&nbsp; 22 C8 00 80 02 28 00 00-00 00 2A 00 2A 00 3A 27&nbsp;&nbsp;&nbsp; "....(....*.*.:'<br>
0040:0020&nbsp;&nbsp;&nbsp; 30 0B 30 0B 30 0B 30 0B-0D 1C 64 20 20 39 30 0B&nbsp;&nbsp;&nbsp; 0.0.0.0...d&nbsp;&nbsp;&nbsp; 90.<br>
0040:0030&nbsp;&nbsp;&nbsp; 30 0B 30 0B 30 0B 08 0E-08 0E 34 05 30 0B 00 00&nbsp;&nbsp;&nbsp; 0.0.0.....4.0...<br>
0040:0040&nbsp;&nbsp;&nbsp; 1F 00 C3 00 A2 AF 09 E1-C8 03 50 00 00 10 00 00&nbsp;&nbsp;&nbsp; ..........P.....<br>
0040:0050&nbsp;&nbsp;&nbsp; 00 18 00 00 00 00 00 00-00 00 00 00 00 00 00 00&nbsp;&nbsp;&nbsp; ................<br>
0040:0060&nbsp;&nbsp;&nbsp; 0F 0C 00 D4 03 29 30 7F-03 00 C0 00 24 B8 11 00&nbsp;&nbsp;&nbsp; .....)0.....$...<br>
0040:0070&nbsp;&nbsp;&nbsp; 00 00 00 00 00 00 00 00-14 14 14 00 01 01 01 01&nbsp;&nbsp;&nbsp; ................<br>
-<br>
既然是键盘缓冲区，每个输入的键都会显示在该区中，第一次我只输入了“d 40:0”，所以你可以在此后显示数据右边字符中找到这些字符，注意是间隔开的。<br>
第二次我输入“d 0040:0000”，则右边显示的是“d 0040:0000”的内容。你可以找找。 <br>
</p> <a href="http://hi.baidu.com/hkbyest/blog/item/7931d044fb10634e510ffe89.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D1%A7%CF%B0%CF%E0%B9%D8">学习相关</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/7931d044fb10634e510ffe89.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:14</pubDate>
        <category><![CDATA[学习相关]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/7931d044fb10634e510ffe89.html</guid>
</item>

<item>
        <title><![CDATA[各种计算机语言的经典书籍]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/cfa39a11f96f3e12b9127b8d.html]]></link>
        <description><![CDATA[
		
		<p><font color="#3366ff">落叶树声明：此为转载，并不代表个人观点，请持不同意见者别针对本人。</font></p>
<p><font color="#ff0000">1、Java</font></p>
<p>Java编程语言（第三版)---Java四大名著----James Gosling(Java之父)</p>
<p>Java编程思想（第2版)----Java四大名著----Bruce Eckel</p>
<p>Java编程思想（第3版)----Java四大名著----------------Bruce Eckel</p>
<p>JAVA 2核心技术 卷I：基础知识（原书第7版）---Java四大名著-----Cay Horstmann</p>
<p>JAVA 2核心技术 卷II：高级特性（原书第7版)----Java四大名著-----Cay Horstmann</p>
<p>Effective Java中文版------Java四大名著--------Joshua Bloch</p>
<p>精通Struts:基于MVC的Java Web设计与开发---孙卫琴</p>
<p>精通Hibernate：Java对象持久化技术详解---孙卫琴</p>
<p>Tomcat与Java Web开发技术详解------------孙卫琴</p>
<p>Java与模式------------------------------阎宏</p>
<p><br>
<font color="#ff0000">2、c#</font></p>
<p>C#程序设计-------Charles Petzold“windows编程泰山北斗”---C#语言“倚天屠龙双剑”</p>
<p>C# Primer中文版--------Stanley B.Lippman---C#语言“倚天屠龙双剑”</p>
<p>.NET框架程序设计（修订版)--------Jeffrey Richter“windows编程泰山北斗”---.NET平台四大天王</p>
<p>c#Windows程序设计----------Charles Petzold“windows编程泰山北斗”------.NET平台四大天王</p>
<p>.NET程序设计技术内幕-------------Jeff Prosise---.NET平台四大天王</p>
<p>.NET本质论--第1卷：公共语言运行库(中文版)--------Chris Sells---.NET平台四大天王</p>
<p> </p>
<p><font color="#ff0000">3、C++</font></p>
<p>C++程序设计语言（特别版)---c++八大金刚----Bjarne Stroustrup“C++之父”</p>
<p>C++ Primer (第3版)中文版----c++八大金刚---Stanley B.Lippman</p>
<p>C++ Primer (第4版)中文版----c++八大金刚---Stanley B.Lippman</p>
<p>C++标准程序库—自修教程与参考手册--c++八大金刚--Nicolai M.Josuttis</p>
<p>C++语言的设计和演化-----c++八大金刚----Bjarne Stroustrup“C++之父”</p>
<p>深度探索C++对象模型---c++八大金刚----Stanley B.Lippman</p>
<p>Essential C++中文版---c++八大金刚---Stanley B.Lippman</p>
<p>Effective C++中文版 2nd Edition-----c++八大金刚------Scott Meyers</p>
<p>More Effective C++中文版----c++八大金刚------Scott Meyers</p>
<p>C++编程思想（第2版） 第1卷：标准C++导引--------Bruce Eckel</p>
<p>C++编程思想（第2版）第2卷：实用编程技术 --------Bruce Eckel</p>
<p>C++程序设计--------------------------谭浩强 </p>
<p>C++ 程序设计教程(第2版)--------------钱能</p>
<p>C++ Primer Plus(第五版)中文版---Stephen Prata</p>
<p>广博如四库全书The c++ programming language、c++ Primer<br>
深奥如山重水复Inside the c++ object model<br>
程序库大全The c++ standard libray<br>
工程经验之积累Effective c++、More Effective c++、Exceptional c++</p>
<p>c++八大金刚：<br>
1、Essentital c++---lippman---C++之父，旁枝暂略，主攻核心，轻薄短小，初学者</p>
<p>2、The c++ programming language----C++之父，技术权威，用词深峻，思想深远，c++百科全书代表，圣经。<br>
3、c++ Primer----lippman---纵横书市十数年，c++最佳教本，c++百科全书代表。<br>
4、Inside the c++ object model-----lippman----揭示c++底层，非常好，非常难。<br>
5、Effective c++-----通过50个编程实例，展示专家经验，行文有趣，深处浅出。<br>
6、More Effective c++－－－－通过35个编程实例，展示专家经验，行文有趣，深处浅出。<br>
7、The c++ standard libray－－－c++标准库的百科全书。<br>
8、设计模式：可复用面向对象软件的基础－－－－－－good!</p>
<p><br>
<font color="#ff0000">4、c</font></p>
<p>C程序设计语言（第2版·新版）---C语言“倚天屠龙双剑”---Brian W.Kernighan“C语言之父”</p>
<p>C Primer Plus中文版（第五版）--------C语言“倚天屠龙双剑”---Stephen Prata</p>
<p>C程序设计（第三版）---------------------------谭浩强</p>
<p>C语言大全（第四版）---------------------------HERBERT SCHILDT</p>
<p>C语言接口与实现：创建可重用软件的技术-------------DAVID R.HANSON&nbsp;&nbsp;</p>
<p>C语言参考手册(原书第5版)--------------------------Samuel P.Harbison</p>
<p>C程序设计教程---------------------------------H.M.Deitel/P.J.Deitel </p>
<p>C陷阱与缺陷-----------------------------------Andrew Koenig&nbsp;&nbsp;</p>
<p><br>
<font color="#ff0000">5、VB</font></p>
<p>Visual Basic .NET技术内幕-----VB编程三剑客-----------Francesco Balena“vb首席大师”</p>
<p>Windows程序设计-Visual Basic.NET语言描述--VB编程三剑客-----Charles Petzold“windows编程泰山北斗”---</p>
<p>.NET框架程序设计：Visual Basic.NET语言描述--VB编程三剑客--Jeffrey Richter“windows编程泰山北斗”---，Francesco Balena“vb首席大师”&nbsp;&nbsp;</p>
<p>Visual Basic 6编程技术大全------------------------Francesco Balena“vb首席大师”</p>
<p>Visual Basic.NET 从入门到精通-------------------------Petroutsos,E. </p>
<p>高级VISUAL BASIC编程-----------------------------------MATTHEW CURLAND&nbsp;&nbsp;&nbsp;</p>
<p><br>
<font color="#ff0000">6、Delphi</font></p>
<p>Inside VCL(深入核心——VCL架构剖析)----------李维 </p>
<p>Delphi 7高效数据库程序设计--------------李维 </p>
<p>面向对象开发实践之路（Delphi版）----------李维 </p>
<p><br>
<font color="#ff0000">7、VC</font></p>
<p>Windows 程序设计（第5版）-----Charles Petzold“windows编程泰山北斗”---</p>
<p>Windows核心编程----------Jeffrey Richter“windows编程泰山北斗”---</p>
<p>Windows高级编程指南---------Jeffrey Richter“windows编程泰山北斗”---</p>
<p>深入浅出MFC（第二版）-----“MFC四大天王”-------侯捷</p>
<p>MFC Windows程序设计（第2版)---MFC四大天王”---------Jeff Prosise</p>
<p>Visual C++ 技术内幕（第4版)--MFC四大天王”--------David Kruglinski</p>
<p>深入解析MFC-------------MFC四大天王”-----------George Shepherd</p>
<p>Visual C++.NET 技术内幕（第6版)-MFC四大天王”------------David Kruglinski</p>
<p><br>
<font color="#ff0000">8、VF</font></p>
<p>Visual Foxpro程序设计参考手册-------------------张洪举</p>
<p>专家门诊——Visual FoxPro开发答疑160问-------------------张洪举</p>
<p>Visual FoxPro 6.0/9.0解决方案与范例大全-------------------张洪举</p>
<p>Visual FoxPro软件开发模式与应用案例-------------------张洪举</p>
<p> <br>
<font color="#ff0000">9、黑客</font></p>
<p>应用密码学(协议算法与C源程序-----------Bruce Schneier</p>
<p>网络信息安全的真相-----------Bruce Schneier</p>
<p>黑客大曝光：网络安全机密与解决方案（第5版）--------STUART MCCLURE </p>
<p>软件加密技术内幕------------看雪学院 </p>
<p>加密与解密——软件保护技术与完全解决方案------------看雪学院 </p>
<p>加密与解密（第二版）--------段钢</p>
<p><br>
<font color="#ff0000">10、汇编</font></p>
<p>Intel微处理器结构、编程与接口（第六版）---------Barry B. Brey</p>
<p>80*86、奔腾机汇编语言程序设计---------Barry B. Brey</p>
<p>Windows环境下32位汇编语言程序设计（第2版)-----------罗云彬</p>
<p>IBM-PC汇编语言程序设计（第2版）&nbsp;&nbsp; 本书是国内优秀教材--------沈美明 温冬婵 </p>
<p>IBM PC汇编语言程序设计（第五版）&nbsp;&nbsp; 这本书籍是国外优秀教材-------PETER ABEL著,沈美明 温冬蝉译</p>
<p><br>
<font color="#ff0000">11、驱动开发</font></p>
<p>Windows WDM设备驱动程序开发指南------------------------------------ Chris Cant</p>
<p>Windows 2000/XP WDM设备驱动程序开发(第2版)--------------------------武安河</p>
<p>WINDOWS 2000/XP WDM设备驱动程序开发-------------------------------- 武安河</p>
<p><br>
<font color="#ff0000">12、网络</font></p>
<p>计算机网络第四版中文版----网络编程三剑客--------------Andrew S.Tanenbaum</p>
<p><br>
TCP/IP详解3卷本--------------------Richard Stevens----网络编程三剑客</p>
<p>UNIX网络编程2卷本--------------------Richard Stevens----网络编程三剑客</p>
<p>用TCP/IP进行网际互联-----------Douglas E. Comer</p>
<p>高级TCP/IP编程-------------------Jon C. Snader</p>
<p>C++网络编程-----------------------Douglas Schmidt</p>
<p>UNIX环境高级编程（第2版)--------------------Richard Stevens</p>
<p> </p>
<p><font color="#ff0000">13、算法</font></p>
<p>计算机程序设计艺术-------Donald.E.Knuth----------算法“倚天屠龙”双剑</p>
<p>算法导论-----------------Thomas H. Cormen--------算法“倚天屠龙”双剑</p>
<p>离散数学及其应用----------Kenneth H.Rosen</p>
<p>具体数学—计算机科学基础--------Donald.E.Knuth</p>
<p> </p>
<p><font color="#ff0000">14、图形编程</font><br>
Windows 图形编程----------------FENG YUAN --图形编程界的Charles Petzold之书</p>
<p><br>
<font color="#ff0000">15、数据结构</font></p>
<p>数据结构 C++语言描述》58.00(Data Structures C++) William Ford,William Topp 刘卫东 沈官林 </p>
<p>数据结构算法与应用-C++语言描述》49.00Sartej Sahni 汪诗林 孙晓东等机械工业出版社</p>
<p> </p>
<p><font color="#ff0000">16、软件工程</font></p>
<p>设计模式--可复用面向对象软件的基础 </p>
<p>重构—改善既有代码的设计</p>
<p><br>
<font color="#ff0000">17、操作系统</font></p>
<p>深入理解计算机系统（修订版）-------RANDAL E.BRYANT</p>
<p> </p>
<p><font color="#ff0000">18、Unix</font></p>
<p><br>
UNIX 网络编程 卷I 套接字联网API（英文版 第三版<br>
UNIX 编程艺术<br>
UNIX环境高级编程（英文影印第2版-----UNIX编程“圣经<br>
UNIX环境高级编程（英文影印版）（第2版）<br>
99-UNIX环境高级编程（第2版）<br>
UNIX环境高级编程（第2版)---UNIX编程“圣经<br>
UNIX网络编程 第1卷：套接口API（第3版）<br>
UNIX网络编程卷2：进程间通信（第2版）（英文影印版）<br>
UNIX 网络编程（第二版）第2卷：进程间通信<br>
UNIX编程环境<br>
UNIX 网络编程 卷I 套接字联网API（英文版 第三版<br>
UNIX系统编程<br>
UNIX环境高级编程<br>
UNIX环境高级编程（英文影印版<br>
88-LINUX内核分析及编程<br>
UNIX 网络编程 卷I 套接字联网API（英文版 第三版）<br>
UNIX网络编程 第1卷：套接口API（第3版） <br>
UNIX 网络编程（第二版）第2卷：进程间通信<br>
UNIX网络编程卷2：进程间通信（第2版）（英文影印版） <br>
UNIX 网络编程（第2版）第1卷：套接口API和X/Open 传输接口API<br>
UNIX网络编程（卷1）：连网的APLS：套接字与XTI（第二版)（英文影印版）<br>
UNIX环境高级编程<br>
UNIX 环境高级编程（英文版）<br>
UNIX环境高级编程（第2版）<br>
Unix技术手册</p>
<p> </p>
<p><font color="#ff0000">19、Linux</font></p>
<p><br>
Linux内核设计与实现<br>
Linux内核完全注释<br>
LINUX内核分析及编程<br>
GNU/Linux 编程指南（第二版）<br>
Linux设备驱动程序（第三版）<br>
嵌入式设计及Linux驱动开发指南——基于ARM 9处理器 <br>
Linux设备驱动程序 第三版（英文影印版）<br>
Linux内核设计与实现（第2版）<br>
Linux内核设计与实现（英文影印版）（第2版）<br>
linux技术手册</p>
<p><br>
<font color="#ff0000">20、游戏编程</font></p>
<p>Windows游戏编程大师技巧（第二版<br>
游戏之旅--我的编程感悟 <br>
OpenGL超级宝典：第三版<br>
OpenGL编程指南（第四版）<br>
Java 游戏高级编程<br>
J2ME手机游戏编程入门 <br>
游戏之旅——我的编程感悟<br>
游戏开发中的人工智能（英文影印版）<br>
3D游戏：卷2 动画与高级实时渲染技术<br>
面向对象的游戏开发 <br>
Java 游戏高级编程<br>
3D游戏编程大师技巧<br>
游戏编程精粹<br>
面向对象的游戏开发<br>
3D游戏 卷1：实时渲染与软件技术<br>
3D游戏：卷2 动画与高级实时渲染技…<br>
J2ME手机游戏编程入门<br>
Direct3D游戏编程入门教程（第二版…</p>
<p> <br>
<font color="#ff0000">21、移动开发</font></p>
<p>Windows Mobile手机应用开发<br>
SYMBIAN OS C++手机应用开发 <br>
68-Windows Mobile手机应用开发--傅曦 齐宇 徐骏 <br>
48-SYMBIAN OS C++手机应用开发 （第2卷）------------------RICHARD HARRISON著,周良忠 王伯欣译<br>
68-SYMBIAN OS C++手机应用开发---------------RICHARD HARRISON著,周良忠译&nbsp;&nbsp;<br>
Windows CE.net内核定制及应用程序开发---------周毓林 宁杨 陆贵强 付林林 <br>
嵌入式系统Windows CE 开发技巧与实例--傅曦<br>
Palm OS编程实践---绝版</p>
<p> </p>
<p><font color="#ff0000">22、单片机</font></p>
<p>单片机轻松入门----------------------------------周坚(平凡老师)&nbsp;&nbsp;</p>
<p>单片机典型模块设计实例导航-----------------------求是科技</p>
<p>例说8051----------------------------------------张义和 陈敌北</p>
<p>KEIL CX51 V7.0单片机高级语言编程与ΜVISION2应用实践-----徐爱钧&nbsp;&nbsp;&nbsp;</p>
<p>单片机应用程序设计技术(修订版)--------------------周航慈 </p>
<p>8051单片机实践与应用-------------------------------吴金戎</p>
<p>MCS-51系列单片机实用接口技术---------------------李华</p>
<p><br>
<font color="#ff0000">23、串并口通讯</font></p>
<p>Visual C++/Turbo C串口通信编程实践------------------龚建伟</p>
<p>VISUAL BASIC与RS-232串行通信控制（最新版）----------范逸之 </p>
<p> </p>
<p><font color="#ff0000">24、电子</font></p>
<p>无线电识图与电路故障分析轻松入门(第二版) -------------------胡斌 </p>
<p>无线电元器件检测与修理技术轻松入门（第二版） -------------------胡斌</p>
<p>图表细说电子技术识图-------------------胡斌</p>
<p>图表细说电子元器件-------------------胡斌</p>
<p>图表细说元器件及实用电路-------------------胡斌</p>
<p> </p>
<p>本文出自<a href="http://www.lmh2004.cn/"><font color="#800080">www.lmh2004.cn</font></a> <br>
</p> <a href="http://hi.baidu.com/hkbyest/blog/item/cfa39a11f96f3e12b9127b8d.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%D1%A7%CF%B0%CF%E0%B9%D8">学习相关</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/cfa39a11f96f3e12b9127b8d.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:09</pubDate>
        <category><![CDATA[学习相关]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/cfa39a11f96f3e12b9127b8d.html</guid>
</item>

<item>
        <title><![CDATA[Windows Xp修复控制台详细用法]]></title>
        <link><![CDATA[http://hi.baidu.com/hkbyest/blog/item/c7b587a23a1648afcbefd083.html]]></link>
        <description><![CDATA[
		
		<p><strong>编者按：<br>
</strong>　Windows XP（包括 Windows 2000）的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。（当然大家可以在系统启动后按F8，插入XP系统光盘进入）这次整理了一下，希望对大家有所帮助： </p>
<p>Windows XP（包括 Windows 2000）的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。（当然大家可以在系统启动后按F8，插入XP系统光盘进入）这次整理了一下，希望对大家有所帮助：<br>
<br>
Bootcfg <br>
<br>
　　bootcfg 命令启动配置和故障恢复（对于大多数计算机，即 boot.ini 文件）。 <br>
　　含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 bootcfg 命令。 <br>
<br>
用法： <br>
<br>
　　bootcfg /default　　设置默认引导项。 <br>
<br>
　　bootcfg /add　　　　向引导列表中添加 Windows 安装。 <br>
<br>
　　bootcfg /rebuild　　重复全部 Windows 安装过程并允许用户选择要添加的内容。 <br>
<br>
　　注意：使用 bootcfg /rebuild 之前，应先通过 bootcfg /copy 命令备份 boot.ini 文件。 <br>
<br>
　　bootcfg /scan　　　 扫描用于 Windows 安装的所有磁盘并显示结果。 <br>
<br>
　　注意：这些结果被静态存储，并用于本次会话。如果在本次会话期间磁盘配置发生变化，为获得更新的扫描，必须先重新启动计算机，然后再次扫描磁盘。 <br>
<br>
　　bootcfg /list　　　列出引导列表中已有的条目。 <br>
<br>
　　bootcfg /disableredirect 在启动引导程序中禁用重定向。 <br>
<br>
　　bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings] <br>
<br>
　　在启动引导程序中通过指定配置启用重定向。 <br>
<br>
范例： <br>
　　bootcfg /redirect com1 115200 <br>
　　bootcfg /redirect useBiosSettings <br>
<br>
hkdsk<br>
<br>
　　创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。 <br>
<br>
　　含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。 <br>
<br>
vol [drive:] [ chkdsk [drive:] [/p] [/r] <br>
<br>
　　参数　　无 <br>
<br>
　　如果不带任何参数，chkdsk 将显示当前驱动器中的磁盘状态。 <br>
<br>
drive: 指定要 chkdsk 检查的驱动器。 <br>
/p　　 即使驱动器不在 chkdsk 的检查范围内，也执行彻底检查。该参数不对驱动器做任何更改。 <br>
/r　　 找到坏扇区并恢复可读取的信息。隐含着 /p 参数。 <br>
<br>
　　注意 <br>
<br>
Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录（默认为 ＼%systemroot%＼System32）中找到该文件，将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机，必须保证是在包含 Windows 的驱动器上使用该命令。 <br>
<br>
Diskpart <br>
<br>
　　创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。 <br>
<br>
　　diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size] <br>
<br>
　　参数 无 <br>
<br>
　　如果不带任何参数，diskpart 命令将启动 diskpart 的 Windows 字符模式版本。 <br>
<br>
　　/add <br>
<br>
　　创建新的分区。 <br>
<br>
　　/delete <br>
<br>
　　删除现有分区。 <br>
<br>
　　device_name <br>
<br>
　　要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如，设备名称： <br>
<br>
　　＼Device＼HardDisk0 <br>
<br>
　　drive_name <br>
<br>
　　以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例： <br>
<br>
　　D: <br>
<br>
　　partition_name <br>
<br>
　　以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范例： <br>
<br>
　　＼Device＼HardDisk0＼Partition1 <br>
<br>
　　 大小 <br>
<br>
　　要创建的分区大小，以兆字节 (MB)表示。仅与 /add 同时使用。 <br>
<br>
　　范例 <br>
<br>
　　下例将删除分区： <br>
<br>
diskpart /delete ＼ Device＼ HardDisk0＼ Partition3 <br>
diskpart /delete F: <br>
<br>
　　下例将在硬盘上添加一个 20 MB 的分区： <br>
<br>
　　diskpart /add ＼ Device＼ HardDisk0 20 <br>
<br>
Fixboot <br>
<br>
　　向系统分区写入新的分区引导扇区。只有在使用故障恢复控制台时，才能使用 fixboot 命令。 <br>
<br>
　　fixboot [drive] <br>
<br>
　　参数　　驱动器 <br>
<br>
　　将要写入引导扇区的驱动器。它将替代默认的驱动器（即用户登录的系统分区）。例如，驱动器：D: <br>
<br>
　　范例 <br>
<br>
　　下列命令范例向驱动器 D: 的系统分区写入新的分区引导扇区： <br>
<br>
　　fixboot d: <br>
<br>
　　注意: 如果不带任何参数，fixboot 命令将向用户登录的系统分区写入新的分区引导扇区。 <br>
<br>
　　Fixmbr <br>
<br>
　　修复启动磁盘的 主启动记录。fixmbr 命令仅在使用故障恢复控制台时才可用。 <br>
<br>
　　fixmbr [ device_name] <br>
<br>
　　参数 <br>
<br>
　　device_name <br>
<br>
　　要写入新的主引导记录的设备（驱动器）。设备名称可从 map 命令的输出获得。例如，设备名称： <br>
<br>
　　＼Device＼HardDisk0 <br>
<br>
　　范例 <br>
<br>
　　下列命令示例向指定设备写入一个新的主引导记录： <br>
<br>
　　fixmbr ＼Device＼HardDisk0 <br>
<br>
　　注意：如果不指定 device_name，新的主引导记录将被写入引导设备，即装载主系统的驱动器。 <br>
如果系统检测到无效或非标准分区表标记，将提示用户是否继续执行该命令。除非您访问驱动器有问题，否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。 <br>
<br>
Format <br>
<br>
　　将指定的驱动器格式化为指定的文件系统。含有下列参数的 format 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 format 命令。 <br>
<br>
　　format [ drive:] [ /fs:file-system] <br>
<br>
　　参数 <br>
<br>
drive: <br>
<br>
　　指定要格式化的驱动器。不能从故障恢复控制台格式化软盘。 <br>
<br>
　　/q <br>
<br>
　　对驱动器进行快速格式化。不扫描驱动器看是否有坏区域，因此只应对以前格式化过的驱动器使用该参数。 <br>
<br>
　　/fs:file-system <br>
<br>
　　指定要使用的文件系统：FAT、FAT32 或 NTFS 。如果未指定文件系统，将使用现有的文件系统格式。 <br>
<br>
Map <br>
<br>
　　显示驱动器号与物理设备名称的映射。该信息在运行 fixboot 和 fixmbr 命令时非常有用。 <br>
<br>
　　map 命令仅在使用故障恢复控制台时才可用。 <br>
<br>
　　Map [ arc] <br>
<br>
　　参数 <br>
<br>
arc <br>
<br>
　　指示 map 命令显示高级 RISC 计算 (ARC)设备名称而不是设备名称。以下是 ARC 设备名称的范例： <br>
<br>
　　multi(0)disk(0)rdisk(0)partition(1) <br>
<br>
　　等价的设备名称是： <br>
<br>
　　＼Device＼HardDisk0＼Partition1 <br>
<br>
　　范例 <br>
<br>
　　下例将物理设备名映射为使用 ARC 设备名称的驱动器号： <br>
<br>
　　map arc <br>
<br>
　　注意：如果不使用 arc 参数，则 map 命令显示设备名称。map 命令还显示文件系统的类型和每个磁盘的大小（MB）。（作者：雪之燃烧）<br>
</p> <a href="http://hi.baidu.com/hkbyest/blog/item/c7b587a23a1648afcbefd083.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/hkbyest/blog/category/%BE%AD%D1%E9%B5%E3%B5%CE">经验点滴</a>&nbsp;<a href="http://hi.baidu.com/hkbyest/blog/item/c7b587a23a1648afcbefd083.html#comment">查看评论</a>]]></description>
        <pubDate>2007-07-21  21:06</pubDate>
        <category><![CDATA[经验点滴]]></category>
        <author><![CDATA[hkbyest]]></author>
		<guid>http://hi.baidu.com/hkbyest/blog/item/c7b587a23a1648afcbefd083.html</guid>
</item>


</channel>
</rss>