<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6502682293701136126</id><updated>2011-12-09T20:15:52.306+08:00</updated><category term='最难'/><category term='print'/><category term='vb kbhit'/><category term='闲聊'/><category term='十进制'/><category term='Integer'/><category term='魔兽'/><category term='汇编'/><category term='魔兽3'/><category term='Assemble'/><category term='显示'/><category term='技术'/><category term='CNC3攻略'/><category term='媒体'/><category term='数字'/><category term='电脑'/><category term='动画'/><category term='修改器'/><category term='游戏'/><title type='text'>绵掌集散地潜水版</title><subtitle type='html'>这里曾是[tc]天驰的绵掌集散地，现在是集散地的精华版</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-8871608760430361463</id><published>2008-10-27T13:18:00.001+08:00</published><updated>2008-10-27T17:36:42.149+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='修改器'/><category scheme='http://www.blogger.com/atom/ns#' term='魔兽3'/><title type='text'>魔兽3内存修改器 v6</title><content type='html'>&lt;a href="http://tctianchi.yo2.cn/articles/%e9%ad%94%e5%85%bd3%e5%86%85%e5%ad%98%e4%bf%ae%e6%94%b9%e5%99%a8-v6.html"&gt;原文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由于hsluoyz同学强烈要求我研究一下魔兽3 1.20e的HP摆放位置，以便达到他某个不可告人的目的，加上本人确实无法接受&lt;a href="http://tctianchi.yo2.cn/articles/%e9%ad%94%e5%85%bd3%e5%86%85%e5%ad%98%e4%bf%ae%e6%94%b9%e5%99%a8v5-for-12206328%ef%bc%8c%e4%bb%a5%e5%8f%8a%e6%99%ba%e5%8a%9b%e4%bf%ae%e6%94%b9%e8%af%a6%e8%a7%a3.html"&gt;v5版&lt;/a&gt;修改器不能改一般单位的事实，所以昨天晚上作了这个v6修改器。这一次的重点是对3个版本的支持以及无注入的新思路。 &lt;p align="center"&gt; &lt;a title="war3trainerv6_2.gif" href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv6_2.gif"&gt; &lt;img src="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv6_2.thumbnail.gif" alt="war3trainerv6_2.gif" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;修改器+源代码+手册打包：&lt;a title="war3trainerv6.rar" href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv6.rar"&gt;war3trainerv6.rar&lt;/a&gt;&lt;/p&gt; &lt;b&gt;[新特性] &lt;/b&gt; &lt;ul&gt;v6版区别于v5版的特征：  &lt;li&gt;无注入的新思路：这一版实现了不修改游戏代码，当然更不是内存搜索，全部直接定位。游戏怎么运行，我就怎么拿到数据，十分猥琐。&lt;/li&gt;&lt;li&gt;同时改多个单位：现在你可以一次选中几个单位，我会列出你选择了什么。&lt;/li&gt;&lt;li&gt;又可以改单位了：既然单位可以改，建筑也就可以改。&lt;/li&gt;&lt;li&gt;多版本支持：受不了某些不肯升级游戏的朋友了，现在支持1.20e、1.21、1.22.0.6328三个版本。&lt;/li&gt;&lt;li&gt;修改单位的坐标：下图就演示了主基地平移。&lt;/li&gt;&lt;li&gt;英雄技能：按照hyp的指示，加了最简单的技能修改，更加复杂的修改没有做。&lt;/li&gt;&lt;/ul&gt;  &lt;p align="center"&gt; &lt;a title="war3trainerv6_1.jpg" href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv6_1.jpg"&gt; &lt;img src="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv6_1.thumbnail.jpg" alt="war3trainerv6_1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt; 主基地平移， 采矿速度提升；&lt;br /&gt; 注意到树丛中的大法师了吗？&lt;br /&gt;另外建筑的阴影明显只是一张贴图&lt;/p&gt; &lt;p&gt;&lt;b&gt;[关于选中单位ESI的获得]&lt;/b&gt;&lt;br /&gt;以下以1.22为例说明我是怎么拿到玩家选择的所有单位。&lt;/p&gt; &lt;p align="center"&gt;另外我要正告hsluoyz同学：&lt;span style="color:#0000ff;"&gt;我怀疑你找来的那个静态指针不具有普遍意义&lt;/span&gt;。我愿意以一顿晚饭的代价跟你打赌。&lt;/p&gt; &lt;p&gt;获得选中列表并不困难，如果你不愿意用我的思路，你也可以直接在内存中搜索“.?AUCUnitListNode@@”获得ESI队列，或者用.\CPlayerWar3.cpp所在的段+90拿到链表基地址然后推算单位地址，都可以。但是我是不做内存搜索的，所以步骤略多：&lt;/p&gt; &lt;ol&gt;&lt;li&gt;[&lt;span style="color:#ff0000;"&gt;6FAA2FFC&lt;/span&gt;] 记为A1&lt;br /&gt; 参考：&lt;br /&gt; &lt;span style="color:#ff0000;"&gt;6F416B0A&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;mov edi&lt;/span&gt;,  &lt;span style="color:#ff0000;"&gt;6FAA2FFC&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#ff0000;"&gt;6F416B10&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;movzx ebx&lt;/span&gt;,  &lt;span style="color:#0000ff;"&gt;word ptr&lt;/span&gt; [&lt;span style="color:#0000ff;"&gt;edi&lt;/span&gt; +&lt;span style="color:#ff0000;"&gt;   28&lt;/span&gt;]&lt;br /&gt; &lt;span style="color:#ff0000;"&gt;6F416B14&lt;/span&gt; call &lt;span style="color:#ff0000;"&gt;6F52F4A0&lt;/span&gt;&lt;/li&gt;&lt;li&gt;[A1 + &lt;span style="color:#ff0000;"&gt;58&lt;/span&gt; + &lt;span style="color:#ff0000;"&gt;4&lt;/span&gt; *   a2] 记为A2，a2取&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;br /&gt; 参考：&lt;span style="color:#ff0000;"&gt;6F3A0564&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;mov eax&lt;/span&gt;,   [&lt;span style="color:#0000ff;"&gt;ecx &lt;/span&gt;+&lt;span style="color:#0000ff;"&gt; eax &lt;/span&gt;*&lt;span style="color:#ff0000;"&gt;   4 &lt;/span&gt;+&lt;span style="color:#ff0000;"&gt; 58&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;[A2 + &lt;span style="color:#ff0000;"&gt;34&lt;/span&gt;] 记为UnitListRoot&lt;br /&gt; 参考：&lt;span style="color:#ff0000;"&gt;6F2CC0AE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;mov ebp&lt;/span&gt;,   [&lt;span style="color:#0000ff;"&gt;eax &lt;/span&gt;+&lt;span style="color:#ff0000;"&gt; 34&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;这个UnitListRoot的数据结构：&lt;br /&gt; struct UnitListRoot&lt;br /&gt; {&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;    BYTE &lt;/span&gt;NotSure[&lt;span style="color:#ff0000;"&gt;0x1F0&lt;/span&gt;];&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;    &lt;/span&gt;UnitListNode* Head, End;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;    DWORD&lt;/span&gt; Length;&lt;br /&gt; }&lt;br /&gt; 参考：&lt;span style="color:#ff0000;"&gt;6f415b95&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;mov eax&lt;/span&gt;,   [&lt;span style="color:#0000ff;"&gt;ebx&lt;/span&gt;+&lt;span style="color:#ff0000;"&gt;1F4&lt;/span&gt;]&lt;/li&gt;&lt;li&gt;UnitListNode的数据结构：&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;struct&lt;/span&gt; UnitListNode&lt;br /&gt; {   &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;    &lt;/span&gt;UnitListNode* Next;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;    DWORD&lt;/span&gt; notNext;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;    &lt;/span&gt;UnitBase* thisUnit;&lt;br /&gt; }&lt;br /&gt; 其中notNext总是等于~Next，而thisUnit就是上次要找的&lt;span style="color:#0000ff;"&gt;ESI&lt;/span&gt;。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;b&gt;[后记]&lt;/b&gt;&lt;br /&gt;这一次我会说得比较小心：我不知道我还会不会更新这个修改器了。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-8871608760430361463?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/8871608760430361463/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=8871608760430361463&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8871608760430361463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8871608760430361463'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2008/10/3-v6.html' title='魔兽3内存修改器 v6'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-1210424275055923716</id><published>2008-10-25T20:36:00.001+08:00</published><updated>2008-10-25T20:38:54.843+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb kbhit'/><title type='text'>vb的kbhit()实现</title><content type='html'>&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;a href="http://tctianchi.yo2.cn/articles/vb%E7%9A%84kbhit%E5%AE%9E%E7%8E%B0.html"&gt;这里是原文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;数值分析考得如此简单，以至于感觉白复习了。&lt;br /&gt;&lt;br /&gt;晚上，因为一些原因我很希望串口的数据能及时dump到硬盘上，可恶的是手头的串口调试工具都不怎么顺手，我气愤了，所以决定写一个题为《不就是个串口嘛！》的程序。很多功能还没有来得及加上，以后再完善，先用起来再说。&lt;br /&gt;&lt;br /&gt;网上的一些vb6高手似乎很懒，实现了控制台、读取、写入、颜色等等功能，唯独没有加上这个关键的kbhit()函数。那怎么能行呢！所以这篇文章特别dump了c语言的库函数：&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&lt;span style="color:#0000ff;"&gt;Public Function&lt;/span&gt; kbHit() &lt;span style="color:#0000ff;"&gt;As Boolean&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;    ' Dim m_StdInput As Long&lt;br /&gt;    ' m_StdInput = CreateFile("CONIN$", _&lt;br /&gt;    ' GENERIC_READ Or GENERIC_WRITE, _&lt;br /&gt;    ' FILE_SHARE_READ Or FILE_SHARE_WRITE, _&lt;br /&gt;    ' 0, _&lt;br /&gt;    ' OPEN_EXISTING, _&lt;br /&gt;    ' 0, _&lt;br /&gt;    ' 0)&lt;br /&gt;    ' 或者，m_StdInput = GetStdHandle(STD_INPUT_HANDLE)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    Dim &lt;/span&gt;nRet&lt;span style="color:#0000ff;"&gt; As Long&lt;br /&gt;    Dim &lt;/span&gt;CharsRead &lt;span style="color:#0000ff;"&gt;As Long&lt;br /&gt;    Dim &lt;/span&gt;nEvents&lt;span style="color:#0000ff;"&gt; As Long&lt;br /&gt;    Dim&lt;/span&gt; Events() As INPUT_KEY_EVENT_RECORD&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    &lt;/span&gt;nRet = GetNumberOfConsoleInputEvents(m_StdInput, nEvents)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    If&lt;/span&gt; nRet = 0 &lt;span style="color:#0000ff;"&gt;Or&lt;/span&gt; nEvents = 0 &lt;span style="color:#0000ff;"&gt;Then&lt;br /&gt;        &lt;/span&gt;kbHit = &lt;span style="color:#0000ff;"&gt;False&lt;br /&gt;        Exit Function&lt;br /&gt;    End If&lt;br /&gt;    ReDim &lt;/span&gt;Events(0 To nEvents - 1)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    &lt;/span&gt;nRet = PeekConsoleInput(m_StdInput, Events(0), nEvents, CharsRead)&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;    If&lt;/span&gt; nRet &lt;span style="color:#0000ff;"&gt;And&lt;/span&gt;  CharsRead &lt;&gt; 0 &lt;span style="color:#0000ff;"&gt;And&lt;/span&gt; CharsRead &lt;= nEvents&lt;span style="color:#0000ff;"&gt; Then&lt;br /&gt;        Dim &lt;/span&gt;i&lt;span style="color:#0000ff;"&gt; As Long&lt;br /&gt;        For &lt;/span&gt;i =  0 &lt;span style="color:#0000ff;"&gt;To&lt;/span&gt; nEvents - 1&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;            If &lt;/span&gt;Events(i).EventType = KEY_EVENT &lt;span style="color:#0000ff;"&gt;And&lt;/span&gt; _&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                 &lt;/span&gt;Events(i).bKeyDown &lt;span style="color:#0000ff;"&gt;Then&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;                &lt;/span&gt; &lt;span style="color:#008080;"&gt;' [tc]Caution: Events(i).AsciiChar is ignored&lt;br /&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;                 &lt;/span&gt; &lt;span style="color:#008080;"&gt;' [tc]Caution: _getextendedkeycode is ignored&lt;br /&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;                &lt;/span&gt;kbHit =&lt;span style="color:#0000ff;"&gt; True&lt;br /&gt;                 Exit Function&lt;br /&gt;            End If&lt;br /&gt;        Next&lt;br /&gt;    End If&lt;br /&gt;    &lt;/span&gt;kbHit = &lt;span style="color:#0000ff;"&gt;False&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;End Function&lt;/span&gt;&lt;/code&gt;&lt;/p&gt; &lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;相关定义我就不贴了，网上满大街都是。这个程序中间我注有两个Caution，如果检测到的按键并不是键盘上的按键，理论上kbhit应该返回False，但是这段代码不是这样。所以这个函数其实是不完美的，为什么我不去实现_getextendedkeycode呢？因为我比较懒……&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-1210424275055923716?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/1210424275055923716/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=1210424275055923716&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/1210424275055923716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/1210424275055923716'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2008/10/vbkbhit.html' title='vb的kbhit()实现'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-3128193574835508272</id><published>2008-10-13T08:06:00.001+08:00</published><updated>2008-10-13T08:09:06.887+08:00</updated><title type='text'>[tc]的Blogger重新开张</title><content type='html'>此前去年由于Blogspot域名被封，本人将Blog搬迁到了yo2。今天决定依然以&lt;a href="http://tctianchi.yo2.cn"&gt;tctianchi.yo2.cn&lt;/a&gt;作为主站，偶尔把好一点的文章转到这里来，07年级以前发布的文章不变。&lt;br /&gt;&lt;br /&gt;所以这里就要改名了，现在叫做《绵掌集散地潜水版》。所以还是欢迎网友到主站去玩！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-3128193574835508272?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/3128193574835508272/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=3128193574835508272&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3128193574835508272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3128193574835508272'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2008/10/tcblogger.html' title='[tc]的Blogger重新开张'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-1922829081031990858</id><published>2008-10-09T18:38:00.000+08:00</published><updated>2008-10-13T08:05:50.160+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='修改器'/><category scheme='http://www.blogger.com/atom/ns#' term='魔兽'/><title type='text'>魔兽3内存修改器V5 For 1.22.0.6328，以及智力修改详解</title><content type='html'>原贴：&lt;a href="http://tctianchi.yo2.cn/articles/%e9%ad%94%e5%85%bd3%e5%86%85%e5%ad%98%e4%bf%ae%e6%94%b9%e5%99%a8v5-for-12206328%ef%bc%8c%e4%bb%a5%e5%8f%8a%e6%99%ba%e5%8a%9b%e4%bf%ae%e6%94%b9%e8%af%a6%e8%a7%a3.html"&gt;http://tctianchi.yo2.cn/articles/%e9%ad%94%e5%85%bd3%e5%86%85%e5%ad%98%e4%bf%ae%e6%94%b9%e5%99%a8v5-for-12206328%ef%bc%8c%e4%bb%a5%e5%8f%8a%e6%99%ba%e5%8a%9b%e4%bf%ae%e6%94%b9%e8%af%a6%e8%a7%a3.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;距离上一次写魔兽修改器（&lt;a href="http://tctianchi.yo2.cn/articles/tc%E9%AD%94%E5%85%BD3nbsp121%E5%86%85%E5%AD%98%E4%BF%AE%E6%94%B9%E5%99%A8nbspv4.html" mce_href="http://tctianchi.yo2.cn/articles/tc魔兽3nbsp121内存修改器nbspv4.html"&gt;V4在这里&lt;/a&gt;）已经有超过一年半的时间了， 这个期间有不少网友来信，但是我完全没有要再写一版的意思。包括像出现在本Blog的hyp发布了他自己的修改器（&lt;a href="http://hi.baidu.com/%E9%BB%84%E6%B0%B8%E5%B9%B3/blog/item/4011d7357e56f71491ef3960.html" mce_href="http://hi.baidu.com/黄永平/blog/item/4011d7357e56f71491ef3960.html"&gt;这里&lt;/a&gt;），包括暴雪出了1.22补丁，我都没有改。直到另一位网友给我写信（他没有留言，我假设他不希望自己的名字出现在这里）声称他已经能找到所有单位的HP为止，我顿时&lt;strike&gt; 愤怒了 &lt;/strike&gt;对他刮目相看！&lt;/p&gt; &lt;p&gt;&lt;a href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv5.gif" title="war3trainerv5.gif" mce_href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv5.gif"&gt;&lt;img src="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv5.thumbnail.gif" mce_src="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv5.thumbnail.gif" alt="war3trainerv5.gif" align="right" /&gt;&lt;/a&gt;于是我想写一个集大成的修改器，可以模拟整个游戏界面，看到地图上的所有单位，可以点击任何想改的数据然后改掉，切换到游戏时已经改好……做一个这样的修改器好像难度也不会很大，但是我还很忙，所以就不要这么麻烦了（雾很大）。&lt;/p&gt; &lt;p&gt;这两天我趁glascholar同学帮我去解决电脑上没有导出并口接插件并且寄到苏州来的空档，做了这个V5修改器来针对1.22.0.6328版 的Warcraft 3。为了避免与hyp同学重复，我依然没有用内存搜索的方法来做，而是坚持了我以前的游戏代码篡改的思路。但是与V4不同的是，我花了很大力气实现了只注 入一次就能修改全部属性的特性。也就是说：&lt;span style="color: rgb(255, 0, 0);"&gt;我已经解决了单位各属性地址之间的关系&lt;/span&gt;。所以其他人也应该可以根据我的理论实现自己的内存搜索版的修改器。&lt;/p&gt; &lt;p&gt;修改器+源代码+手册打包：&lt;a href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv5.rar" title="war3trainerv5.rar" mce_href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2008/10/war3trainerv5.rar"&gt;war3trainerv5.rar&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;[特性]&lt;/b&gt;&lt;/p&gt; &lt;ul&gt;V5版修改器具有以下特性： &lt;li&gt;仅适用于魔兽3 1.22.0.6328，其他版本不用试也知道不行&lt;/li&gt;&lt;li&gt;可以修改前10个玩家的钱，并且不用注入就能修改&lt;/li&gt;&lt;li&gt;可以修改英雄的一些属性，每个英雄只需要注入一次，其他地址可以推算&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;V5的注入对一般单位无效&lt;/span&gt;，这反而变成V5修改器的缺陷，而&lt;span style="color: rgb(0, 0, 255);"&gt;V4版是可以改一般单位的&lt;/span&gt;。因为唯一的一次注入放在了英雄状态栏绘制的函数里面，而V4版是每个属性单独注入一次，所以没有这个问题。如果我愿意放下自尊，不去搞什么“只注入一次”的话，就可以解决这个问题，但是这样就无法炫耀技术了，对吧？&lt;/li&gt;&lt;li&gt;智力修改完美解决，现在不可能找不到智力的地址了&lt;/li&gt;&lt;li&gt;新增HP、MP，及其最大值的修改&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;b&gt;[详解智力修改]&lt;br /&gt;&lt;/b&gt;在V2版（&lt;a href="http://tctianchi.yo2.cn/articles/%E3%80%8Atc%E9%AD%94%E5%85%BD3-120%E5%86%85%E5%AD%98%E4%BF%AE%E6%94%B9%E5%99%A8%E3%80%8Bv2%E7%89%88.html" mce_href="http://tctianchi.yo2.cn/articles/《tc魔兽3-120内存修改器》v2版.html"&gt;这里&lt;/a&gt;）中，我曾经给过一个傻x的修改方案，现在给出更加精确的算法。为什么智力的修改与力量、敏捷不同。这是因为后两者的代码比较集中，而且代码也比较规则。例如力量的绘制代码如下：&lt;br /&gt;&lt;table class="mceVisualAid" id="table5" bg="" style="color: rgb(238, 238, 238);" border="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D7D   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ebp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;0D4h&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;eHeroMultiply&lt;/span&gt; = *(&lt;span style="color: rgb(0, 128, 128);"&gt;pAttribute1&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;0x35&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D83   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ebp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;94h&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;vHeroPower&lt;/span&gt; = *(&lt;span style="color: rgb(0, 128, 128);"&gt;pAttribute1&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;0x25&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D89   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8ECh&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;eHeroMultiply&lt;/span&gt;], &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;　&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D8D   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ebp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;6Ch&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="2"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;vPowerAdd&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 128);"&gt;sub_6F4634E0&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;pAttribute1&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;0x1B&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D90   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;sub_6F4634E0&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D95   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8ECh&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;eHeroMultiply&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid"&gt;　&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D99   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;　&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D9A   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="3"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ePowerAdd&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 128);"&gt;ZipNum_Encode_NotSure&lt;/span&gt;(&amp;amp;&lt;span style="color: rgb(0, 128, 128);"&gt;tmpInt1&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 128);"&gt;vPowerAdd&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D9C   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8F0h&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;tmpInt1&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DA0   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;ZipNum_Encode_NotSure&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DA5   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="3"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;ePowerSum&lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt; = ZipNum_Multiply_NotSure&lt;/span&gt;(&amp;amp;&lt;span style="color: rgb(0, 128, 128);"&gt;tmpInt2&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 128);"&gt;ePowerAdd&lt;/span&gt;, &amp;amp;&lt;span style="color: rgb(0, 128, 128);"&gt;eHeroMultiply&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DA7   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8F0h&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;tmpInt2&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DAB   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;ZipNum_Multiply_NotSure&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DB0   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="2"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;vPowerSum&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 128);"&gt;ZipNum_Decode_NotSure&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;ePowerSum&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DB2   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;ZipNum_Decode_NotSure&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DB7   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;add&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="8"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;s578_SStrPrintf&lt;/span&gt;(&lt;br /&gt;  &lt;span style="color: rgb(0, 128, 128);"&gt;Buffer1&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;  0x40u&lt;/span&gt;, &lt;span style="color: rgb(128, 0, 128);"&gt;&lt;br /&gt;  "%d"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;br /&gt;  vHeroPower&lt;/span&gt; + &lt;span style="color: rgb(0, 128, 128);"&gt;vPowerSum&lt;/span&gt; - *&lt;span style="color: rgb(0, 128, 128);"&gt;AttributeBiasCopy1&lt;br /&gt;&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DB9   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;sub&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ebx&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DBB   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DBC   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;offset&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;aD_0&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; ; "%d"&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DC1   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8F4h&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer1&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DC5   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;40h&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; BufferSize&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DC7   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; Buffer&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DC8   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;s578_SStrPrintf&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DCD   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ebx&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid"&gt;　&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DCF   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8FCh&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;GBufferCopy1&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;GBufferCopy2&lt;/span&gt; = &lt;span style="color: rgb(0, 128, 128);"&gt;GBufferCopy1&lt;/span&gt;;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DD3   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;add&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;, 10h&lt;/td&gt; &lt;td class="mceVisualAid"&gt;　&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DD6   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;add&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="3"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;sumPower&lt;/span&gt; = *&lt;span style="color: rgb(0, 128, 128);"&gt;GBufferCopy1&lt;/span&gt; + *&lt;span style="color: rgb(0, 128, 128);"&gt;AttributeBiasCopy1&lt;/span&gt;;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;br /&gt;if&lt;/span&gt; ( &lt;span style="color: rgb(0, 128, 128);"&gt;sumPower&lt;/span&gt; )&lt;br /&gt;{    &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DD8   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;jz short&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;loc_6F353E1B&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DDA   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;test&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DDC   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;offset&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;aCff00ff00_1&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; " |CFF00FF00+"&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;    tmpString1&lt;/span&gt; = &lt;span style="color: rgb(128, 0, 128);"&gt;" |CFF00FF00+"&lt;/span&gt;;    &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DE1   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;jg short&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;loc_6F353DE8&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;    if&lt;/span&gt; ( &lt;span style="color: rgb(0, 128, 128);"&gt;sumPower&lt;/span&gt;&lt;= 0 )&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DE3   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;offset&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;aCffff0000_1&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; " |CFFFF0000"&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;    &lt;span style="color: rgb(0, 128, 128);"&gt;tmpString1&lt;/span&gt; =&lt;span style="color: rgb(128, 0, 128);"&gt; " |CFFFF0000"&lt;/span&gt;;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DE8   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;40h&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; MaxLength&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="5"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;    s503_SStrNCat&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer1&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 128);"&gt;tmpString1&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0x40u&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DEA   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; pSrc&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DEB   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8F4h&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer1&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DEF   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; pDest&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DF0   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;s503_SStrNCat&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DF5   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="6"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;    s578_SStrPrintf&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer2&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0x40u&lt;/span&gt;, &lt;span style="color: rgb(128, 0, 128);"&gt;"%d|R"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 128);"&gt;sumPower&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DF6   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;offset&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;aDR&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; "%d|R"&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DFB   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8F4h&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer2&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353DFF   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;40h&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; BufferSize&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E01   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; Buffer&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E02   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;s578_SStrPrintf&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E07   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;add&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;10h&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="6"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;    s503_SStrNCat&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer1&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 128);"&gt;Buffer2&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;0x40u&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E0A   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;40h&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; MaxLength&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E0C   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8F0h&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer2&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E10   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; pSrc&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E11   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esp&lt;/span&gt;+&lt;span style="color: rgb(255, 0, 0);"&gt;8F4h&lt;/span&gt;+&lt;span style="color: rgb(0, 128, 128);"&gt;Buffer1&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E15   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;push&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0);"&gt;; pDest&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353E16   &lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;s503_SStrNCat&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;}&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;&lt;p&gt;智力的代码在&lt;span style="color: rgb(255, 0, 0);"&gt;6F0DA9D0&lt;/span&gt;，内存位置不完全相同，感兴趣可以去看，本质上还是一样的。下面的步骤供修改器使用。但是我要说，如果只注入一次的话，最难改的不是智力，而是移动速度的话，你相信吗？这件事情详见附件里面的手册。这里讲智力。&lt;/p&gt; &lt;p&gt;&lt;b&gt;第1步：&lt;/b&gt;搞到英雄的基址，可以在&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D25&lt;/span&gt;拿到&lt;span style="color: rgb(0, 0, 255);"&gt;ESI&lt;/span&gt;，并且解开（即所谓解引用，或者寻址），并且做如下定义：&lt;br /&gt;○ &lt;span style="color: rgb(0, 0, 255);"&gt;ESI&lt;/span&gt;记为&lt;span style="color: rgb(0, 128, 128);"&gt;ThisUnit&lt;/span&gt;&lt;br /&gt;○ [&lt;span style="color: rgb(0, 128, 128);"&gt;ThisUnit&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;1E4&lt;/span&gt;] 记为&lt;span style="color: rgb(0, 128, 128);"&gt; UnitAttributes&lt;/span&gt;（这里用不到，改别的东西要用）&lt;br /&gt;○ [&lt;span style="color: rgb(0, 128, 128);"&gt;ThisUnit&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;1EC&lt;/span&gt;] 记为&lt;span style="color: rgb(0, 128, 128);"&gt; HeroAttributes&lt;/span&gt;&lt;br /&gt;这个1EC是怎么来的呢？&lt;br /&gt;参考的代码：&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D00&lt;/span&gt;&lt;br /&gt;即：&lt;span style="color: rgb(0, 0, 255);"&gt;int __thiscall&lt;/span&gt; &lt;span style="color: rgb(0, 0, 128);"&gt;DrawHeroProperty&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; *&lt;span style="color: rgb(0, 128, 128);"&gt;GameContext&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; **&lt;span style="color: rgb(0, 128, 128);"&gt;Attributes&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; *&lt;span style="color: rgb(0, 128, 128);"&gt;AttributeBias&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;unsigned int&lt;/span&gt; *&lt;span style="color: rgb(0, 128, 128);"&gt;GBuffer&lt;/span&gt;)&lt;br /&gt;　&lt;br /&gt;&lt;table class="mceVisualAid" id="table1" bg="" style="color: rgb(238, 238, 238);" border="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353D51&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov ebp&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;1ECh&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;pAttribute&lt;/span&gt; = &lt;span style="color: rgb(0, 128, 128);"&gt;Attributes&lt;/span&gt;[&lt;span style="color: rgb(255, 0, 0);"&gt;0x7B&lt;/span&gt;]; &lt;span style="color: rgb(0, 128, 0);"&gt;// 7B * 4 = 1EC&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;……&lt;/td&gt; &lt;td class="mceVisualAid"&gt;……&lt;/td&gt; &lt;td class="mceVisualAid"&gt;……&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353EDE&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov ecx&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;ebp&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="2"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;vIntellect&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 128);"&gt;getHeroIntellect_NotSure&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;pAttribute&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F353EE0&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;6F0DA9D0&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;&lt;p&gt;&lt;b&gt;第2步：&lt;/b&gt;获得智力的游戏全局索引，定义：&lt;br /&gt;○ [&lt;span style="color: rgb(0, 128, 128);"&gt;HeroAttributes&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;7C&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;2&lt;/span&gt; * &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;] 记为&lt;span style="color: rgb(0, 128, 128);"&gt; Index1&lt;/span&gt;&lt;br /&gt;○ [&lt;span style="color: rgb(0, 128, 128);"&gt;HeroAttributes&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;7C&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;3&lt;/span&gt; * &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;] 记为&lt;span style="color: rgb(0, 128, 128);"&gt; ReferenceNumber1&lt;/span&gt;&lt;/p&gt; &lt;p&gt;参考的代码：&lt;span style="color: rgb(255, 0, 0);"&gt;6F0DA9D0&lt;/span&gt;&lt;br /&gt;即：&lt;span style="color: rgb(0, 0, 255);"&gt;int __fastcall &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;getHeroIntellect_NotSure&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;* &lt;span style="color: rgb(0, 128, 128);"&gt;pAttribute&lt;/span&gt;)&lt;/p&gt; &lt;table class="mceVisualAid" id="table2" bg="" style="color: rgb(238, 238, 238);" border="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F0DA9DE&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;lea ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;7Ch&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="2"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;vHeroIntellect&lt;/span&gt; = &lt;span style="color: rgb(0, 0, 128);"&gt;sub_6F4634E0&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 128);"&gt;pAttribute&lt;/span&gt; +&lt;span style="color: rgb(0, 128, 128);"&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;0x1F&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;// 1F * 4 = 7C&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F0DA9E1&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634E0&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;参考的代码：&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634E0&lt;br /&gt;&lt;/span&gt;即：&lt;span style="color: rgb(0, 0, 255);"&gt;int __fastcall &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;sub_6F4634E0&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; *&lt;span style="color: rgb(0, 128, 128);"&gt;base&lt;/span&gt;)&lt;br /&gt;　&lt;br /&gt;&lt;table class="mceVisualAid" id="table3" bg="" style="color: rgb(238, 238, 238);" border="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634E0&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov edx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;0Ch&lt;/span&gt;]&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="5"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; *(&lt;span style="color: rgb(0, 0, 255);"&gt;_DWORD&lt;/span&gt; *)(&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;br /&gt;getValueFromGame&lt;/span&gt;(*(&lt;span style="color: rgb(0, 128, 128);"&gt;base&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;2&lt;/span&gt;), *(&lt;span style="color: rgb(0, 128, 128);"&gt;base&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;3&lt;/span&gt;))&lt;br /&gt;+ &lt;span style="color: rgb(255, 0, 0);"&gt;0x78&lt;br /&gt;&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634E3&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;8&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634E6&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;call &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F180&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634EB&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov eax&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 255);"&gt; &lt;/span&gt;[&lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;78h&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634EE&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;retn&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;&lt;p&gt;&lt;b&gt;第3步：&lt;/b&gt;使用所谓&lt;算法1&gt;（&lt;span style="color: rgb(255, 0, 0);"&gt;6F4634E0&lt;/span&gt;），获得智力的地址。&lt;/p&gt; &lt;p&gt;步3.1：[&lt;span style="color: rgb(255, 0, 0);"&gt;6FAA4178&lt;/span&gt;] 记为 &lt;span style="color: rgb(0, 128, 128);"&gt;ThisGame&lt;/span&gt;&lt;br /&gt;步3.2：[&lt;span style="color: rgb(0, 128, 128);"&gt;ThisGame&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;C&lt;/span&gt; 记为 &lt;span style="color: rgb(0, 128, 128);"&gt;ThisGameMemory&lt;/span&gt;&lt;br /&gt;步3.3：[&lt;span style="color: rgb(0, 128, 128);"&gt;ThisGameMemory&lt;/span&gt; + &lt;span style="color: rgb(0, 128, 128);"&gt;Index1&lt;/span&gt; * &lt;span style="color: rgb(255, 0, 0);"&gt;8&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;] 记为&lt;span style="color: rgb(0, 128, 128);"&gt; Address1&lt;/span&gt;&lt;br /&gt;步3.4：[&lt;span style="color: rgb(0, 128, 128);"&gt;Address1&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;18&lt;/span&gt;] 应当等于&lt;span style="color: rgb(0, 128, 128);"&gt;ReferenceNumber1&lt;/span&gt;，不相等游戏会异常（访问地址&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;），所以做修改器不用考虑这里&lt;br /&gt;步3.5：&lt;span style="color: rgb(0, 128, 128);"&gt;Address1&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;78 &lt;/span&gt;作为地址，里面是智力&lt;/p&gt; &lt;p&gt;参考的代码：&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F180&lt;/span&gt;&lt;br /&gt;即：&lt;span style="color: rgb(0, 0, 255);"&gt;int __fastcall &lt;/span&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;getValueFromGame&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;unsigned int&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;nIndex&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;ReferenceNumber&lt;/span&gt;)&lt;/p&gt; &lt;table class="mceVisualAid" id="table4" bgcolor="#eeeeee" border="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td class="mceVisualAid"&gt;……&lt;/td&gt; &lt;td class="mceVisualAid"&gt;……&lt;/td&gt; &lt;td class="mceVisualAid" rowspan="10"&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;result&lt;/span&gt; = *(&lt;span style="color: rgb(0, 0, 255);"&gt;_DWORD&lt;/span&gt; *)&lt;br /&gt;(&lt;br /&gt;  *(&lt;span style="color: rgb(0, 0, 255);"&gt;_DWORD&lt;/span&gt; *)(&lt;span style="color: rgb(0, 128, 128);"&gt;dword_6FAA4178&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;0xC&lt;/span&gt;)&lt;br /&gt;  + &lt;span style="color: rgb(255, 0, 0);"&gt;8&lt;/span&gt; * &lt;span style="color: rgb(0, 128, 128);"&gt;nIndex&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;br /&gt;&lt;/span&gt;) &amp;amp;&lt;br /&gt;(&lt;br /&gt;  (*(&lt;span style="color: rgb(0, 0, 255);"&gt;_DWORD&lt;/span&gt; *)&lt;br /&gt;    (*(&lt;span style="color: rgb(0, 0, 255);"&gt;_DWORD&lt;/span&gt; *)&lt;br /&gt;       (*(&lt;span style="color: rgb(0, 0, 255);"&gt;_DWORD&lt;/span&gt; *)(&lt;span style="color: rgb(0, 128, 128);"&gt;dword_6FAA4178&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;0xC&lt;/span&gt;)&lt;br /&gt;       + &lt;span style="color: rgb(255, 0, 0);"&gt;8&lt;/span&gt; * &lt;span style="color: rgb(0, 128, 128);"&gt;nIndex&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;br /&gt;    &lt;/span&gt;)&lt;br /&gt;   + &lt;span style="color: rgb(255, 0, 0);"&gt;24&lt;br /&gt; &lt;/span&gt;) != &lt;span style="color: rgb(0, 128, 128);"&gt;ReferenceNumber&lt;/span&gt;)&lt;br /&gt;- &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;br /&gt;&lt;/span&gt;);&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1DA&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov eax&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;esi&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;0Ch&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1DD&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mov ecx&lt;/span&gt;, [&lt;span style="color: rgb(0, 0, 255);"&gt;eax&lt;/span&gt; +&lt;span style="color: rgb(0, 0, 255);"&gt; ecx &lt;/span&gt;* &lt;span style="color: rgb(255, 0, 0);"&gt;8&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1E1&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;xor eax, eax&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1E3&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;cmp &lt;/span&gt;[&lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;18h&lt;/span&gt;], &lt;span style="color: rgb(0, 0, 255);"&gt;edx&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1E6&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;pop edi&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1E7&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;setnz al&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1EA&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;pop esi&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1EB&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;sub eax&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1EE&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;and eax&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 255);"&gt;ecx&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;6F03F1F0&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;retn&lt;/span&gt;&lt;/td&gt; &lt;td class="mceVisualAid"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;result&lt;/span&gt;;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;需要特别指出的是，还有一个所谓&lt;算法2&gt;（&lt;span style="color: rgb(255, 0, 0);"&gt;6F468A20&lt;/span&gt;）也很重要，改移动速度要用到，详见我的手册。&lt;/p&gt; &lt;p&gt;&lt;b&gt;[后记]&lt;br /&gt;&lt;/b&gt;这两天我在game.dll、Storm.dll阅读了超过万行汇编。在这里严重感谢Hex-Rays这款插件，虽然有的时候也会越帮越忙，但是如果没有她，我肯定无法在短时间内完成这样的工作量。&lt;/p&gt; &lt;p&gt;有鉴于我此刻已经厌倦修改魔兽，所以这一回，应该不会再出V6了吧！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-1922829081031990858?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/1922829081031990858/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=1922829081031990858&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/1922829081031990858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/1922829081031990858'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2008/10/3v5-for-12206328.html' title='魔兽3内存修改器V5 For 1.22.0.6328，以及智力修改详解'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-8315173384103143166</id><published>2007-07-20T08:02:00.001+08:00</published><updated>2008-10-13T08:34:07.608+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CNC3攻略'/><category scheme='http://www.blogger.com/atom/ns#' term='电脑'/><category scheme='http://www.blogger.com/atom/ns#' term='最难'/><title type='text'>C&amp;C3：怎样零伤亡打赢最难电脑</title><content type='html'>原贴：&lt;a href="http://tctianchi.yo2.cn/articles/cnc3singleplay.html"&gt;http://tctianchi.yo2.cn/articles/cnc3singleplay.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;　　C&amp;amp;C3的最难电脑以疯狂的经济基础而闻名，不过这样的电脑也并不是不可战胜的。观察表明，如果电脑没有矿场或矿车，钱是不会自动增加的。所以压制电脑的经济是越早越好的。以下针对1.05版以GDI为例说明打法，其他阵营仅给出录像。&lt;br /&gt;&lt;br /&gt;[地图]&lt;br /&gt;今天的战场是《竞技场》，著名2人地图。我先解释一下这张地图。当前位置为我方出生点，左上角为NOD。中间有两个分矿，对角上有两个蓝矿，电脑不会去用，但是会占领两个地堡。中间的上方和下方各有一个白点，那是油井，我们不管它。&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: center;" align="center"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/1.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/1.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/1.thumbnail.jpg" alt="&amp;amp;Lang;竞技场&amp;amp;Rang;地图" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　任务目标：不使用BUG，不使用工程师逼退策略，赢下最难电脑。争取最短时间、最少伤亡、最多资源。&lt;br /&gt;&lt;br /&gt;[初期]&lt;br /&gt;双矿场开局。&lt;br /&gt;主基地：F10生产线－F2矿场－F3兵营－F1电厂&lt;br /&gt;生产线：　　　F1电厂－F2矿场－F5雷达－F8高科&lt;br /&gt;下雷达的时候，兵营造好一个机枪兵，收起基地车，赶往对手分矿。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tctianchi.yo2.cn/wp-admin/upload.php?style=inline&amp;amp;tab=browse-all&amp;amp;post_id=246710&amp;amp;_wpnonce=b85ea7fbc3&amp;amp;ID=248078&amp;amp;action=view&amp;amp;paged" id="file-link-248078" title="sshot0003.jpg" class="file-link image"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0003.jpg" title="sshot0003.jpg"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0003.thumbnail.jpg" alt="sshot0003.jpg" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　        路上遇到一工程师，不要客气。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0007.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0007.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0007.thumbnail.jpg" alt="sshot0007.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　如图所示，放下两个声波塔。补上一个电厂，升级催化。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0012.jpg" title="sshot0012.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0012.jpg" title="sshot0012.jpg"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0012.thumbnail.jpg" alt="sshot0012.jpg" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　 电脑对这种战术感到茫然无措。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0019.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0019.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0019.thumbnail.jpg" alt="sshot0019.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　注意：声波塔到达5个以前非常脆弱，一定要控一下，以最大伤害范围为主旨。&lt;br /&gt;&lt;br /&gt;[中期]&lt;br /&gt;过渡时期需要在家里补一两个声波。电脑的偷袭可能从上面、右边、左下进行，根据实际情况安排。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0024.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0024.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0024.thumbnail.jpg" alt="sshot0024.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　电脑迅速做出反应，建造了空军来偷袭，不过我已经备好了防空。那我怎么知道电脑会有毒液的呢？因为意识好！&lt;br /&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0026.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0026.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0026.thumbnail.jpg" alt="sshot0026.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　——刚才是吹牛，因为[tc]曾经因此损失矿车一部，没有实现０伤亡。&lt;br /&gt;&lt;br /&gt;注意：发现火焰坦克一定要退出里面的机枪兵。&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0027.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0027.thumbnail.jpg" alt="sshot0027.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　电脑看到我防空不多，所以会继续毒液，所以我也继续回应之。 &lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0029.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0029.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0029.thumbnail.jpg" alt="sshot0029.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　现在开始疯狂地扩张（看小地图）。 &lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0033.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0033.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0033.thumbnail.jpg" alt="sshot0033.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;[后期]&lt;br /&gt;出一些MM的同时，把红血的单位拿来修。&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0036.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0036.thumbnail.jpg" alt="sshot0036.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　注意：最后关头也请时刻注意微操，MM并不是不会挂的。[tc]曾有多次在最后几分钟失去获得零伤亡录像的机会的惨痛经历。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0042.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0042.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0042.thumbnail.jpg" alt="sshot0042.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　用MM来结束战斗会不会太俗套了呢？&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0055.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0055.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0055.thumbnail.jpg" alt="sshot0055.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　注意：一旦开始生产MM就要升级轨道炮。[tc]居然忘记升级了，这是本录像的重大失误。&lt;br /&gt;&lt;br /&gt;[结局]&lt;br /&gt;后半段[tc]打得并不好看，主要是因为[tc]太过谨慎了。比赛越是到后期，越是有可能损失一两个单位造成遗憾。&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0057.jpg" onclick="return false;" title="直接链接到文件"&gt;&lt;img src="http://wpcache.yo2.cn/wp-content/uploads/16/1615/2007/07/sshot0057.thumbnail.jpg" alt="sshot0057.jpg" height="128" width="170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;　　以上战略实际上10分钟左右就可以结束，但是要保证0部队伤亡＋0建筑损失，是非常不容易的一件事。[tc]我打了整整一个晚上，才成功了一次。&lt;br /&gt;&lt;br /&gt;先附上本教学录像：&lt;a href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2007/07/replay-gdi-perf.rar" onclick="return false;" title="直接链接到文件"&gt;replay-gdi-perf.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;第二个录像是之前打的版本，除了一不小心挂掉一个炮台之外，应该说比上面的录像打得好。&lt;a href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2007/07/replay-gdi.rar" onclick="return false;" title="直接链接到文件"&gt;replay-gdi.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[其他阵营]&lt;br /&gt;先说NOD。NOD的高机动性、隐形在电脑的作弊下黯然失色，但是NOD拥有本游戏最多的技能，应当加以利用。可惜[tc]暂时还打不出比较好的录像。&lt;a href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2007/07/replay-nod.rar" onclick="return false;" title="直接链接到文件"&gt;replay-nod.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;这个录像和上面一样是Tower Rush，但是没有实现零伤亡。&lt;br /&gt;&lt;br /&gt;Scim，1.05版的MotherShip对射程作了调整，所以利用一下。&lt;br /&gt;&lt;br /&gt;虽然只要3分钟就可以解决问题，但是录像没有实现零伤亡。&lt;a href="http://tctianchi.yo2.cn/wp-content/uploads/16/1615/2007/07/replay-sc.rar" onclick="return false;" title="直接链接到文件"&gt;replay-sc.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NOD和外星人的零伤亡录像我以后再做，现在先摆在这里。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-8315173384103143166?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/8315173384103143166/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=8315173384103143166&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8315173384103143166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8315173384103143166'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/07/c.html' title='C&amp;C3：怎样零伤亡打赢最难电脑'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-3812293248507592344</id><published>2007-04-17T22:16:00.000+08:00</published><updated>2007-04-17T22:19:43.849+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='闲聊'/><title type='text'>说明：我搬过家了</title><content type='html'>由于本Blog日前域名被封，[tc]已于2007-03-25搬迁至&lt;br /&gt;&lt;br /&gt;http://tctianchi.yo2.cn/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-3812293248507592344?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/3812293248507592344/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=3812293248507592344&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3812293248507592344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3812293248507592344'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/04/blog-post.html' title='说明：我搬过家了'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-2041614474318730556</id><published>2007-03-17T19:54:00.000+08:00</published><updated>2007-03-18T22:38:37.824+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='游戏'/><title type='text'>[tc]魔兽3 1.21内存修改器 V4</title><content type='html'>　　由于Blood+缺了一集，一边等候下载，一边就写了这个V4版。有些代码写的实在垃圾，懒得改了，于是又贴了几个补丁。&lt;br /&gt;　　这次除了补完上次说的“攻击力”、“攻击类型”、“防御类型”之外，“防御力”也被我“一不小心”改出来了。“智力”还是像以前一样，有找不到的几率，暂时还没有想到解决方案。&lt;br /&gt;&lt;br /&gt;　　因为此次更新并不完全是一时兴起，所以那个修改金钱的难题是一定要解决的。&lt;br /&gt;　　6F088E78: mov eax,[edx+78] 8b 42 78&lt;br /&gt;　　金钱和智力一样，代码是公用的，有一定的几率会变成无用的地址，好在几率不大，大部分时间是在一个区域内不停的变动，[tc]仔细一看：edx的低16位居然是固定的！比如P1的金钱始终是[0190]，P2是[1410]，只有高16位是不固定的。这就好办了，取下上16位，补上我们自己的下16位即可！该问题完美解决！&lt;br /&gt;　　编程的时候值得一提的是：这次[tc]决意尽可能少的修改原来游戏的代码。此前的修改存在冗余！比如“力量”、“敏捷”，我是分开搜索的。但是明眼人很快会发现，这两个地址是相关的，只要找到其中一个，另一个也能推算出来。这次修改金钱也是一样的道理。&lt;br /&gt;　　[tc]修改了Player 1-10（注：魔兽最多可以有12个在线玩家，我一时偷懒只作了10个）的金、木、人口、最大人口，但是这些数据是相关的：对于同一个人而言，偏移地址是这样的：&lt;br /&gt;　　　　金　　　　　　0x  0&lt;br /&gt;　　　　木　　　　　　0x 80&lt;br /&gt;　　　　最大人口　　　0x180&lt;br /&gt;　　　　当前人口　　　0x200&lt;br /&gt;&lt;br /&gt;　　不出意外的话，这是我最后一次更新这个修改器了。因为基本上能想到的东西都已经写了。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uY1kBF5xvkE/Rf1Ow_D1QXI/AAAAAAAAABU/M3yMNfmxHGA/s1600-h/show.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_uY1kBF5xvkE/Rf1Ow_D1QXI/AAAAAAAAABU/M3yMNfmxHGA/s320/show.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5043273761193017714" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-2041614474318730556?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/2041614474318730556/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=2041614474318730556&amp;isPopup=true' title='10 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/2041614474318730556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/2041614474318730556'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/tc3-121-v4.html' title='[tc]魔兽3 1.21内存修改器 V4'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_uY1kBF5xvkE/Rf1Ow_D1QXI/AAAAAAAAABU/M3yMNfmxHGA/s72-c/show.gif' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-9082245807006485620</id><published>2007-03-15T22:55:00.001+08:00</published><updated>2007-03-15T22:55:37.283+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>推箱子的求解</title><content type='html'>　　经过两周的折腾，白了头发无数，终于能算一些简单的地图了。15x15以内的地图基本上不超过5秒钟能有近似最优解。超过20x20的地图，10分钟之内没有结果，我也没耐心等下去。&lt;br /&gt;　　整个算法看起来是这样的：首先选择可以移动的箱子的集合，选择一个深度优先遍历，当发现下一步有重复时，选择较短的路径；当树的深度超过一个限度时，把叶子节点送入一个链表；只要那个链表不空，那么设定新的最大深度，回到第一步。为了判定初始的深度，需要对箱子与目标点作一次匹配（我选择的是最大代价匹配）。&lt;br /&gt;　　为了实现A*算法，使用了许多类来作支撑，比如：&lt;br /&gt;　　　clsShortestPath　　　　　 专门求迷宫的最短路径，翻译自高中时候的程序&lt;br /&gt;　　　clsGraph_MostMatching　　 二部图最大匹配&lt;br /&gt;　　　clsMapData　　　　　　　　跟地图有关的操作在这里&lt;br /&gt;　　　clsMapStatus　　　　　　　跟地图状态有关的操作在这里&lt;br /&gt;　　　clsSolution　　　　　　　 求解的主程序，根据一个基本clsSolutionNode作为树根，展开所有解&lt;br /&gt;　　　clsSolutionNode　　　　　 解的内容、保存下一个解的链状结构，当树的深度超过给定值时会调用制定的函数保存状态&lt;br /&gt;　　　clsSolutionNodeHistory　　纪录解的历史，在重复的解中选择路径比较短的解&lt;br /&gt;&lt;br /&gt;　　如果有人说这样写效率会不会很低？我认为不会，我没有使用virtual，不算真正的OO，在静态绑定的作用下，效率不会很低。&lt;br /&gt;　　代码总共33k，没办法把源代码贴出来。下面是程序到目前为止的5个版本的What's New，从中可以说明一些问题。&lt;br /&gt;&lt;br /&gt;V1&lt;br /&gt;● 用链表实现广度优先&lt;br /&gt;● 计算下一级时，回收上一级内存&lt;br /&gt;&lt;br /&gt;V2&lt;br /&gt;● 改进的内存回收，能快速回收同一层的内存&lt;br /&gt;● 阻止嵌入角落&lt;br /&gt;● 修改了过程保存的方式（不再是string），减小了内存使用&lt;br /&gt;● 防止重复上一次的步骤的反过程（比如上一次是向左，那么这一次不会向右），用list实现&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;V3&lt;br /&gt;● 下定决心，把广度优先改成深度优先，用树实现，保存下一步的是list&lt;br /&gt;● 新建clsSolutionNodeHistory，加强了重复路径搜索能力，杜绝重复的搜索&lt;br /&gt;● 明确了地图clsMap、地图数据clsMapData的不同（前者只有地形数据），减小了内存占用和构造时间&lt;br /&gt;● 修正了图形显示的小Bug（箱子、目标位置的标记不能通过单次循环完成）&lt;br /&gt;● 新增了一个小的地图编辑器（VB）&lt;br /&gt;&lt;br /&gt;V4&lt;br /&gt;● 地图优化：自动判定不能放置箱子的区域（不需要再在地图编辑器中作弊了）&lt;br /&gt;● 改进的clsSolutionNodeHistory：情况相同时，如果上一次失败了，那么取消现在的尝试；如果上一个记录还没有计算过，那么选择路径比较短的一次&lt;br /&gt;● 进一步改进了状态的保存，clsMapData改名为clsMapStatus、clsMap改名为clsMapData&lt;br /&gt;● 追加了一个看似十分垃圾的评价函数，以箱子与目标的距离作为判定依据，这样就形成了一个简化的A*算法&lt;br /&gt;● 强制限定了运算深度，由于不能自动追加深度，还不能看作是IDA*算法&lt;br /&gt;● 为了得到初始的运算深度，用网络流实现了二部图的最优匹配&lt;br /&gt;● 为了提供最优匹配的原始数据（目前是每个箱子到每个目标的距离），编写了最短路经搜索代码，代码用的是高中时写的VB程序，算法名字不记得了，只知道空间复杂度O(n^4)，时间复杂度O(n^2)&lt;br /&gt;&lt;br /&gt;V5&lt;br /&gt;● 题解程序将步数溢出的节点压入一个链表，IDA*得以实现&lt;br /&gt;● 最优匹配从自小代价改为最大代价（也就是说，假定编地图的人让玩家总是把箱子推到最远的目标点，真是无语了）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-9082245807006485620?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/9082245807006485620/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=9082245807006485620&amp;isPopup=true' title='8 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/9082245807006485620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/9082245807006485620'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/blog-post_7237.html' title='推箱子的求解'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-8567548689809293780</id><published>2007-03-15T08:52:00.000+08:00</published><updated>2007-03-15T09:06:12.267+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>用最大流实现二部图最大匹配</title><content type='html'>　　为了某个已经折腾了两周的程序，花了两天时间实现了二部图的最大匹配，现分享如下。&lt;br /&gt;&lt;br /&gt;　　题目的简化版是这样的：ABCD四个节点要对应1234四个节点，每个字母对应一个数字、每个数字对应一个字母。已知每个字母与每个数字只见的对应代价是不一样的。现在求最佳的配对方案，使得总代价最大／最小。&lt;br /&gt;　　这个问题属于二部的带权匹配问题，网上似乎有不少解法，基本上是用匈牙利算法解决的。但是考虑到带权问题的复杂性，以及日后扩充要求的可能性，[tc]决定还是用网络流来求解。&lt;br /&gt;&lt;br /&gt;　　[tc]的参考书：《网络最优化》，刘家壮，高等教育出版社，1991年。&lt;br /&gt;　　用网络流求解的思路是这样的。由于已知字母与数字的关系如下图所示（对应关系的弧略去），&lt;br /&gt;　　　A \/ 1&lt;br /&gt;　　　B \/ 2&lt;br /&gt;　　　C /\ 3&lt;br /&gt;　　　D /\ 4&lt;br /&gt;　　可以在现有的关系基础上，增加一个只有出度的开始节点s，和一个只有入度的结束节点t。&lt;br /&gt;　　　　/　A \/ 1 \&lt;br /&gt;　　　S -　B \/ 2 - T&lt;br /&gt;　　　　\　C /\ 3 /&lt;br /&gt;　　　　\　D /\ 4 /&lt;br /&gt;　　显然s到t的计算过程可以找到字母与数字的匹配。现在设网络内的容量全部为1，当前流量为0，那么容易证明匹配结束后，每个字母对应一个数字、每个数字对应一个字母。&lt;br /&gt;&lt;br /&gt;　　既然思路确定了，程序也就简单了。下面的代码是用来测试的，实际使用时可以整理成类，整理成类的方法就不说了。&lt;br /&gt;　　注意这个算法的时间复杂度大约是O(n^2*L)，n是矩阵度数，L是一个不确定的值，L &lt; n，与匈牙利算法的O(n ^ 3)相比差不多，但是可以轻易的扩展成更复杂的程序。&lt;br /&gt; 　　另外为了功能需要，下面的代码包括了求最大最小值两个代码，是用宏定义来区分的，看代码时请特别小心。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include &lt;span style="color:gray;"&gt;"stdafx.h"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;////////////////////////////////////////////////////////////////// &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// 用最大流实现二分图最大匹配 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// 网络最大流（容量1），添加了超级源、超级汇 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#include &lt; stdio.h &gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#include &lt; string.h &gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;/* &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;样例： &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;INPUT &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;3 5 2 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;3 2 8 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;7 5 8 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;OUTPUT &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;20 &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;*/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// 如果是寻最大值，需要下面这句 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;// 如果是寻最小值，屏蔽下面这句 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:green;"&gt;//#define __FIND_MAX &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; maxn=100;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; maxint=32767;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;struct&lt;/span&gt;&lt;span&gt; stuAbutMatrixNode    &lt;/span&gt;&lt;span style="color:green;"&gt;// 邻接矩阵 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; weight,             &lt;/span&gt;&lt;span style="color:green;"&gt;// 权重 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;      flux,                   &lt;span style="color:green;"&gt;// 流量 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;      capability;        &lt;span style="color:green;"&gt;// 容量 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;struct&lt;/span&gt;&lt;span&gt; stuGraphicNode  &lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; value,              &lt;/span&gt;&lt;span style="color:green;"&gt;// 值 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;      fa;                     &lt;span style="color:green;"&gt;// 度 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;stuAbutMatrixNode iAbility[maxn+2+1][maxn+2+1];     &lt;span style="color:green;"&gt;// 0..maxn+2 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;stuGraphicNode best[maxn+2+1];&lt;br /&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; numItems,  &lt;/span&gt;&lt;br /&gt;  numMaxWork,&lt;br /&gt;  s,t;                                                                                         &lt;span style="color:green;"&gt;// s、t是始边、终边的下标 &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&lt;span&gt; init()  &lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; i,j;  &lt;/span&gt;&lt;br /&gt;  scanf(&lt;span style="color:gray;"&gt;"%d"&lt;/span&gt;&lt;span&gt;,&amp;numItems);  &lt;/span&gt;&lt;br /&gt;  memset(iAbility,0,&lt;span style="color:blue;"&gt;sizeof&lt;/span&gt;&lt;span&gt;(iAbility));  &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span&gt;(i=1;i&lt;=numItems;i++)  &lt;/span&gt;&lt;br /&gt;      &lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span&gt;(j=numItems+1;j&lt;=2*numItems;j++)  &lt;/span&gt;&lt;br /&gt;      {&lt;br /&gt;          iAbility[i][j].capability=1;&lt;br /&gt;           &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; iInput;  &lt;/span&gt;&lt;br /&gt;          scanf(&lt;span style="color:gray;"&gt;"%d"&lt;/span&gt;&lt;span&gt;,&amp;iInput);  &lt;/span&gt;&lt;br /&gt;          iAbility[i][j].weight=iInput;&lt;br /&gt;          iAbility[j][i].weight=-iInput;&lt;br /&gt;      }&lt;br /&gt;      s=2*numItems+1;&lt;br /&gt;      t=2*numItems+2;&lt;br /&gt;      &lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span&gt;  (i=1;i&lt;=numItems;i++)  &lt;/span&gt;&lt;br /&gt;      {&lt;br /&gt;          iAbility[s][i].capability=1;&lt;br /&gt;          iAbility[numItems+i][t].capability=1;&lt;br /&gt;      }&lt;br /&gt;      numMaxWork=0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&lt;span&gt; find()  &lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; i,j;  &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&lt;span&gt; quit; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#ifdef __FIND_MAX &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  memset(best,0,&lt;span style="color:blue;"&gt;sizeof&lt;/span&gt;&lt;span&gt;(best));  &lt;/span&gt;&lt;br /&gt;  best[s].value=1;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#else &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span&gt;(i=1;i&lt;=2*numItems+2;i++)  &lt;/span&gt;&lt;br /&gt;      best[i].value=maxint;&lt;br /&gt;  best[s].value=0;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#endif &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;do&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  {&lt;br /&gt;      quit=&lt;span style="color:blue;"&gt;true&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;br /&gt;      &lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span&gt;(i=1;i&lt;=2*numItems+2;i++) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#ifdef __FIND_MAX &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;           &lt;span style="color:blue;"&gt;if&lt;/span&gt;&lt;span&gt;(best[i].value&gt;0) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#else &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;           &lt;span style="color:blue;"&gt;if&lt;/span&gt;&lt;span&gt;(best[i].value!=maxint) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#endif &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;              &lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span&gt;(j=1;j&lt;=2*numItems+2;j++)  &lt;/span&gt;&lt;br /&gt;                  &lt;span style="color:blue;"&gt;if&lt;/span&gt;&lt;span&gt; (iAbility[i][j].flux&lt;iability[i][j].capability)&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#ifdef __FIND_MAX &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;                      &lt;span style="color:blue;"&gt;if&lt;/span&gt;&lt;span&gt; (best[i].value+iAbility[i][j].weight&gt;best[j].value) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#else &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;                      &lt;span style="color:blue;"&gt;if&lt;/span&gt;&lt;span&gt; (best[i].value+iAbility[i][j].weight&lt;best[j].value)&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#endif &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;                       {&lt;br /&gt;                           best[j].value=best[i].value+iAbility[i][j].weight;&lt;br /&gt;                           best[j].fa=i;&lt;br /&gt;                           quit=&lt;span style="color:blue;"&gt;false&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;br /&gt;                       }&lt;br /&gt;  }&lt;span style="color:blue;"&gt;while&lt;/span&gt;&lt;span&gt;(!quit); &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#ifdef __FIND_MAX &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;if&lt;/span&gt;&lt;span&gt;(best[t].value&gt;1)  &lt;/span&gt;&lt;br /&gt;      &lt;span style="color:blue;"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;      &lt;span style="color:blue;"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#else &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;if&lt;/span&gt;&lt;span&gt;(best[t].value&lt;maxint)&gt;&lt;br /&gt;      &lt;span style="color:blue;"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;true&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;      &lt;span style="color:blue;"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#endif &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&lt;span&gt; add()  &lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; i,j;  &lt;/span&gt;&lt;br /&gt;  i=t;&lt;br /&gt;  &lt;span style="color:blue;"&gt;while&lt;/span&gt;&lt;span&gt;(i!=s)  &lt;/span&gt;&lt;br /&gt;  {&lt;br /&gt;      j=best[i].fa;&lt;br /&gt;      iAbility[j][i].flux++;&lt;br /&gt;      iAbility[i][j].flux=-iAbility[j][i].flux;&lt;br /&gt;      i=j;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; x,y,value;  &lt;/span&gt;&lt;br /&gt;  y=best[t].fa;&lt;br /&gt;  x=best[y].fa;&lt;br /&gt;  value=iAbility[x][y].weight;&lt;br /&gt;  printf(&lt;span style="color:gray;"&gt;"(%d,%d)=%d\n"&lt;/span&gt;&lt;span&gt;,x,y-numItems,value); &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#ifdef __FIND_MAX &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  numMaxWork+=best[t].value-1;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#else &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  numMaxWork+=best[t].value;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#endif   &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; main()  &lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;  init();&lt;br /&gt;&lt;br /&gt;  &lt;span style="color:blue;"&gt;while&lt;/span&gt;&lt;span&gt;(find())  &lt;/span&gt;&lt;br /&gt;      add();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#ifdef __FIND_MAX &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  printf(&lt;span style="color:gray;"&gt;"Max=%d\n"&lt;/span&gt;&lt;span&gt;,numMaxWork); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#else &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;  printf(&lt;span style="color:gray;"&gt;"Min=%d\n"&lt;/span&gt;&lt;span&gt;,numMaxWork); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;#endif &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span style="color:blue;"&gt;return&lt;/span&gt;&lt;span&gt; 0;  &lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/maxint)&gt;&lt;/span&gt;&lt;/best[j].value)&gt;&lt;/span&gt;&lt;/iability[i][j].capability)&gt;&lt;/span&gt;&lt;/n，与匈牙利算法的o(n^3)相比差不多，但是可以轻易的扩展成更复杂的程序。&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-8567548689809293780?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/8567548689809293780/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=8567548689809293780&amp;isPopup=true' title='6 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8567548689809293780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8567548689809293780'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/blog-post_15.html' title='用最大流实现二部图最大匹配'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-4320698914000389497</id><published>2007-03-10T15:29:00.000+08:00</published><updated>2007-03-10T15:30:43.094+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>sprintf等C用法在C++的转换的小记</title><content type='html'>　　当我主张（在PC上）用C++的新用法替换C语言的旧式用法时，许多人问来一些奇怪的问题，这里收集了几个典型问题，探讨一下。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1、字符数组&lt;/span&gt;&lt;br /&gt;　　别用这个了，string更好，也标准。同寝室有个同学更喜欢CString，好吧，这个我也没意见，我一般用string，因为我总觉得CString是MFC的东西（其实不是），有恐惧心理。&lt;br /&gt;　　另一方面，string是一个模版类，如果需要宽字节（比如Windows程序），就要用wstring代替，关于这个问题我另外撰文说明好了。简单的说，如果要显示中文，应该使用国际化支持，例如：流.imbue(locale("chs"));&lt;br /&gt;　　不过上面这段代码只能在Windows底下用，在Linux下要受到字体配置文件的影响。&lt;br /&gt;　　&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2、sprintf()&lt;/span&gt;，将printf的结果送入字符串，用于缓冲&lt;br /&gt;　　其实这个问题挺难解决的。&lt;br /&gt;　　首先sprinf有缓冲区溢出的危险，snprintf没有这个危险，但是只有C99容纳了这个函数，C++03似乎没这东西。&lt;br /&gt;　　[tc]的建议是用stringstream，这东西总的说来好用，就是太慢。而且大家也知道，stream基本上没有解决二进制直接访问的问题，所以对效率要求非常高的话还使用指针。&lt;br /&gt;　　好在哪里呢？比如你要把一个"13.2"的字符串转换成13.2的数字，那么可以这样：&lt;br /&gt;　　stringstream ss;float fnum;&lt;br /&gt;　　ss&lt;&lt;"13.2";ss&gt;&gt;fnum;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3、getch()&lt;/span&gt;&lt;br /&gt;　　读一个字符本来就不是什么难事。更何况现在一般用这个函数只为了显示一行“Press Any Key To Continue...”，如果只是这样的话，一句“system(pause");”真是又简便又清楚。缺点就是不好移植。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4、动态数组&lt;/span&gt;&lt;br /&gt;　　老生常谈了。STL里的容器肯定比你写得好！这里就再废话几句：&lt;br /&gt;　　　数据规模小    选vector，使用之前记得reserve()&lt;br /&gt;　　　数据规模大    选list&lt;br /&gt;　　　随机存取        选vector&lt;br /&gt;　　　用iterator遍历    差不多，用vector&lt;br /&gt;　　　前、后部插入    首选deque、vector也快&lt;br /&gt;　　　后部删除        deque、vector&lt;br /&gt;　　　前部删除        deque、list&lt;br /&gt;　　　中间插入        list、deque，我比较倾向list&lt;br /&gt;　　　中间删除        vector、deque&lt;br /&gt;　　　交换数据        vector&lt;br /&gt;　　当然还有别的。&lt;br /&gt;　　顺便，不要再问排序了，容器都有.sort()。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-4320698914000389497?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/4320698914000389497/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=4320698914000389497&amp;isPopup=true' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4320698914000389497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4320698914000389497'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/sprintfcc.html' title='sprintf等C用法在C++的转换的小记'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-3699086261930281077</id><published>2007-03-02T17:58:00.000+08:00</published><updated>2007-03-02T18:02:28.004+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>在ARM上演示uC/OS</title><content type='html'>　　在克服了一些困难之后，终于可以在ARM上直观的表演uC/OS了。（鼓掌）&lt;br /&gt;&lt;br /&gt;　　下面两张图是原作者《嵌入式实时操作系统uC/OS-II第2版》的第一个范例。内容是这样的：建立10个任务，随机的在屏幕上显示本任务的编号，屏幕下方提示的数据分别是：任务数（10个任务+1个监视任务+2个系统任务）、CPU占用率、任务切换情况。&lt;br /&gt;&lt;br /&gt;　　左边这张是uC/OS移植到WindowsXP之后的效果，为了兼容原作者的代码，在控制台下显示运行结果。因为刚刚开始运行，屏幕还没有占满。&lt;br /&gt;　　右边的图是今天刚刚改写好的ARM版uC/OS，为了兼容PC下的代码，把PC机上特有的函数封装一层，以“字符模式”运行。值得注意的是CPU占用率将近100%，只要把uC时钟降低，那么CPU占用率也会降低，当然如果那样做的话，ARM有很多时间是空闲的。&lt;br /&gt;&lt;br /&gt;　　在ARM平台上，干扰因素比PC多，加上机能限制，当外部中断出现时，你会看到“任务切换次数”下降，但是并没有挂掉。据说uC/OS被验证为是一个足够稳定的系统，可以用于军事、科研、紧急事务处理（医疗救护？）等领域。当然，我认为那是建立在程序不写错的基础上，实际上[tc]的这份uC只要破坏掉看门狗的运行，系统即刻会崩溃的。&lt;br /&gt;&lt;br /&gt;　　还需要说明的两个问题：&lt;br /&gt;&lt;br /&gt;　　一个是，[tc]很想知道，在CPU空闲的时候，ARM能不能迅速切换到省电模式，降低功耗？问题在于，[tc]分别试验了CPU在65%和98%的两个程序，结果65%的情况下，CPU温度比较低（这项测试是根据[tc]的触觉，不知道有没有心理因素），也就是说，ARM是自动降温的CPU。然而在官方的说明文本里面似乎没有出现相关介绍。&lt;br /&gt;&lt;br /&gt;　　另一个问题是，这个程序中，[tc]使用的是自己编写的随机函数。似乎工作的还不错\ OoO /。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uY1kBF5xvkE/Ref1Vz4ZANI/AAAAAAAAAA8/JKf92fstBeA/s1600-h/PC.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_uY1kBF5xvkE/Ref1Vz4ZANI/AAAAAAAAAA8/JKf92fstBeA/s320/PC.jpg" alt="" id="BLOGGER_PHOTO_ID_5037264463289974994" border="0" height="200" /&gt;&lt;/a&gt;　&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_uY1kBF5xvkE/Ref1WD4ZAOI/AAAAAAAAABE/0SSf4w_6SuU/s1600-h/DSCF6252.JPG"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_uY1kBF5xvkE/Ref1WD4ZAOI/AAAAAAAAABE/0SSf4w_6SuU/s320/DSCF6252.JPG" alt="" id="BLOGGER_PHOTO_ID_5037264467584942306" border="0" height="200" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-3699086261930281077?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/3699086261930281077/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=3699086261930281077&amp;isPopup=true' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3699086261930281077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3699086261930281077'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/armucos.html' title='在ARM上演示uC/OS'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uY1kBF5xvkE/Ref1Vz4ZANI/AAAAAAAAAA8/JKf92fstBeA/s72-c/PC.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-563527066597960819</id><published>2007-03-01T20:32:00.000+08:00</published><updated>2007-03-01T20:33:23.478+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='闲聊'/><title type='text'>扫除</title><content type='html'>下午跑到宿舍去打扫卫生，阳台的地由于被雨水淋到，脏得够呛。好在是瓷砖地，清洗起来也容易。&lt;br /&gt;&lt;br /&gt;3月4日就开学了，以后就算是这种水贴也只能以星期一篇了吧。不过，一想到这学期就要搬本部，我就……哈哈哈哈！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-563527066597960819?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/563527066597960819/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=563527066597960819&amp;isPopup=true' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/563527066597960819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/563527066597960819'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/blog-post.html' title='扫除'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-4524147054573799710</id><published>2007-03-01T11:56:00.000+08:00</published><updated>2007-03-01T11:57:20.051+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='动画'/><title type='text'>《I''s》系列</title><content type='html'>&lt;span style="font-weight: bold;"&gt;漫画&lt;/span&gt;：周刊《少年Jump》1997～2000连载的桂正和的作品。&lt;br /&gt;15卷，累计1000万册销量。&lt;br /&gt;[tc]我有收藏扫描版。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OVA&lt;/span&gt;：2002年12月，From I''s，《另一个夏天的故事》，全2话&lt;br /&gt;这是一个仅在便利店贩卖的动画，销售量上、下两集合计7万张。&lt;br /&gt;&lt;br /&gt;　　不管从画风还是配乐上看，OVA都难上档次。而且故事内容与原作几乎没有关系，几乎像是同人作品。围绕 濑户一贵、秋叶いっき、市村洋介 10年前重新见面的约定展开。和 葦月 伊织 似乎关系不大。另外OVA还聚集了一小帮声优方面的名家。自我感觉声优方面OVA比TV更强一些。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TV&lt;/span&gt;：2005年，全6话+5 SP。&lt;br /&gt;　　桂正和本人也参加了这次动画化，绘画水平有了质的飞跃。故事本身基本上是按照原作情节，并且把YY内容专门转移到SP中，是相当成功的手法。&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;    /*--------------------------------&lt;br /&gt;    * 最近的动画评论真是越来越短了...&lt;br /&gt;    --------------------------------*/&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-4524147054573799710?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/4524147054573799710/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=4524147054573799710&amp;isPopup=true' title='4 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4524147054573799710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4524147054573799710'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/is.html' title='《I&apos;&apos;s》系列'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-4881451690590166610</id><published>2007-03-01T00:42:00.000+08:00</published><updated>2007-03-01T00:47:55.058+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>tcGUI.c</title><content type='html'>　　今天为ST2410做了一个图形库，完成了大约40%。一想到我今天的工作是八十年代的程序员经常做的事，我就 T_T&lt;br /&gt;&lt;br /&gt;　　简单的说，这个图形库用于在没有文字显示BIOS的CPU上显示文字的。目前完成了以下工作：&lt;br /&gt;&lt;br /&gt;英文8x12点阵的提取&lt;br /&gt;宋体16x16点阵的提取（一个VB小程序），目前做了一级字库&lt;br /&gt;LCD初始化（抄来的）&lt;br /&gt;描点（抄来的）&lt;br /&gt;描线（抄来的）&lt;br /&gt;矩形（抄来的）&lt;br /&gt;实心矩形（抄来的）&lt;br /&gt;清屏（抄来的）&lt;br /&gt;位图图片（抄来的）&lt;br /&gt;英文显示&lt;br /&gt;中文显示&lt;br /&gt;更换颜色，前景/背景&lt;br /&gt;文字透明&lt;br /&gt;&lt;br /&gt;　　还需要加入的功能：&lt;br /&gt;屏幕滚动（即翻页）&lt;br /&gt;屏幕保存/恢复（用于实现双缓冲、视频缓冲、直接写屏）&lt;br /&gt;绘制窗体&lt;br /&gt;触摸笔（快成形了）&lt;br /&gt;&lt;br /&gt;　　本来，[tc]以为这些代码很好找的，结果处处碰壁。在u龙那里，虽然得到一份差不多用途的东西，可惜是编译好的库文件，不提供代码。一气之下，[tc]自己写了这份代码，深感屏幕存取之效率低下，没有显卡的日子，难！&lt;br /&gt;&lt;br /&gt;　　下面第一张图是昨天，为调试方便写的引导程序的图形界面部分。&lt;br /&gt;　　第二张是刚刚实现的成果，似乎实际效果更好一些。不过我这样说也没人相信。&lt;br /&gt;　　在这份成果上，只要将config.h中的#define CHINESE_SUPPORT 1去掉，就会变成第三幅图的样子，目标代码将会减小将近200K。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_uY1kBF5xvkE/ReWxxDCiryI/AAAAAAAAAAY/UfISqvn-6zY/s1600-h/2007.2.29-1.JPG"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_uY1kBF5xvkE/ReWxxDCiryI/AAAAAAAAAAY/UfISqvn-6zY/s320/2007.2.29-1.JPG" alt="" id="BLOGGER_PHOTO_ID_5036627214471442210" border="0" width="200" /&gt;&lt;/a&gt;　&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uY1kBF5xvkE/ReWxxjCirzI/AAAAAAAAAAg/-XDQVy2YRvM/s1600-h/2007.2.29-2.JPG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_uY1kBF5xvkE/ReWxxjCirzI/AAAAAAAAAAg/-XDQVy2YRvM/s320/2007.2.29-2.JPG" alt="" id="BLOGGER_PHOTO_ID_5036627223061376818" border="0" width="200" /&gt;&lt;/a&gt;　&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_uY1kBF5xvkE/ReWxxzCir0I/AAAAAAAAAAo/x4c5a78YGDg/s1600-h/2007.2.29-3.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_uY1kBF5xvkE/ReWxxzCir0I/AAAAAAAAAAo/x4c5a78YGDg/s320/2007.2.29-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5036627227356344130" border="0" width="200" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-4881451690590166610?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/4881451690590166610/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=4881451690590166610&amp;isPopup=true' title='7 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4881451690590166610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4881451690590166610'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/03/tcguic.html' title='tcGUI.c'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uY1kBF5xvkE/ReWxxDCiryI/AAAAAAAAAAY/UfISqvn-6zY/s72-c/2007.2.29-1.JPG' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-3178282200832422657</id><published>2007-02-27T01:22:00.000+08:00</published><updated>2007-02-27T01:23:02.352+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>[tc]NAND Flash BackUP 2.1</title><content type='html'>继上次备份NAND Flash以来，由于Linux核心升级到2.6的缘故，[tc]决心重新写一个备份程序。这块NAND Flash型号是Samsung K9F1208U0M 64MB，和上次一样，用串口通讯。&lt;br /&gt;&lt;br /&gt;虽说是模仿GHOST，其实没有针对文件系统，只是将Flash中的二进制数据保存下来而已。&lt;br /&gt;&lt;br /&gt;为确保正确性，[tc]作了以下两件事：&lt;br /&gt;1、设定了一个简单的信令，由计算机向开发板发送数据请求信号，保证了超时、桢同步错误可以断点续传&lt;br /&gt;2、写了一个简单的MD5算法校验程序&lt;br /&gt;&lt;br /&gt;实际情况表明，断点续传作用明显，由于种种原因，通讯有时会中断，在超时程序的帮助下，可以找回正在传输的部分，继续传输。但是，信令带来了额外的传输开销。实际的输出速度为10 KB/s，64MB的Flash共用将近2小时传输。&lt;br /&gt;&lt;br /&gt;好在下载这些备份不需要这么慢，可以用USB接口，大约有500KB/s。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-3178282200832422657?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/3178282200832422657/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=3178282200832422657&amp;isPopup=true' title='4 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3178282200832422657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3178282200832422657'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/tcnand-flash-backup-21.html' title='[tc]NAND Flash BackUP 2.1'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-5745184141654806133</id><published>2007-02-24T00:52:00.000+08:00</published><updated>2007-02-24T00:54:29.668+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>[选译]关于随机函数发生器的简单讨论</title><content type='html'>（[tc]不是翻译人员，这篇包含个人感情的东西仅供参考）&lt;br /&gt;&lt;br /&gt;　　今天有幸看到DONALD E. KNUTH先生的《THE ART OF COMPUTER PROGRAMMING》SECOND EDITION，第2卷：Seminumerical Algorithms，第1部分论述的是随机函数。揭示了[tc]几天前用到的自定义随机函数。&lt;br /&gt;　　其中最简单的函数莫过于Linear Congruential Method，以下译为“线性余数法”。&lt;br /&gt;&lt;br /&gt;　　线性余数法1949年发明于D. H. Lehmer，定义了下面的迭代函数，产生一个序列，用于简单的计算机（伪）随机序列：&lt;br /&gt;　　Xn+1 = (aXn + c) mod m,n&gt;=0&lt;br /&gt;　　其中X0为“种子”。对于常数X0,a,c,m的选取，原作进行了详细的讨论，选译如下。&lt;br /&gt;&lt;br /&gt;　　定义b=a-1&lt;br /&gt;　　可证a&gt;=2, b&gt;=1时&lt;br /&gt;　　X n+k = (a^k Xn + (a^k - l)c/b) mod m, k &gt;= 0, n &gt;= 0,&lt;br /&gt;&lt;br /&gt;定理A：当且仅当m,a,c,X0满足下列条件时，具有长度为m的周期：&lt;br /&gt;1、c与m为互质数&lt;br /&gt;2、b=a-1是p的倍数，p为m的一切质因子&lt;br /&gt;3、如果m是4的倍数，那么b也是&lt;br /&gt;证明稿据说起源于100年前的定理，M.Greenberger将之推广到m=2^e。证明过程反正我也没看懂就不译了。&lt;br /&gt;&lt;br /&gt;定理B：令λ(p^e) = (p-1) p^(e-1) , p&gt;2&lt;br /&gt;当c=0时能达到的最大周期是λ(m)。该周期满足下列条件时可以达到。&lt;br /&gt;1、X0与m为互质数&lt;br /&gt;2、a是模m的素元（[tc]：素元是指整环R中的非零非可逆元素。如果p能整除R中某两个元素的乘积（如ab），则必整除其中一个（如p|a或p|b））&lt;br /&gt;&lt;br /&gt;问题在于：如何寻找模m的素元？于是：&lt;br /&gt;定理C：满足下列条件之一时，数a是模p^e的素元&lt;br /&gt;1、p^e=2,a为奇数；或者p^e=4,a mod 4=3；或者p^e=8,a mod 8=3,5,7；或者p=2,e&gt;=4,a mod 8=3,5&lt;br /&gt;2、p为奇数，e=1,a&lt;&gt;0(mod p),a^(p-1)&lt;&gt;1(mod p)&lt;br /&gt;3、p为奇数，e&gt;1，a满足第二条，a^(p-1)&lt;&gt;1(mod p^2)&lt;br /&gt;正定理可用于计算机中较大的p的试验&lt;br /&gt;&lt;br /&gt;定理D：如果m=10^e,e&gt;=5,c=0,X0不是2或5的倍数，线性余数法周期为5*10^(e-2)。当且仅当a mod 200=下列数之一：&lt;br /&gt;3,11,13,19,21,27,29,37,53,59,61,67,69,77,83,91,109,117,123,131,133,139,141,147,163,131,173,179,181,187,189,197&lt;br /&gt;&lt;br /&gt;小结：&lt;br /&gt;　　满足上述要求的a=z^k+1,2&lt;=k&lt;=e&lt;br /&gt;　　若取c=1，则：Xn+1=((z^k+1)Xn+1)mod z^e&lt;br /&gt;（[tc]：这一部分的论述，我认为原作所用的计算方法已经过时了，没有摘抄）&lt;br /&gt;&lt;br /&gt;若设X0=0，那么再次出现0可认为是一个周期，所以有&lt;br /&gt;　　Xn=((a^n-1)*c/b) mod m&lt;br /&gt;并且，用二项式展开式展开a^n-1=(b+1)^n-1，化简得：&lt;br /&gt;Xn=c(n+[n,2]b+...+[n,s]b^(s-1))mod m&lt;br /&gt;（[tc]：其中比b^s更高阶的项由于是m的整数倍，被忽略了。式中的[n,2]是排列组合公式）。&lt;br /&gt;（1）基数为1：a=1。Xn=cn(mod m)，显然不随机&lt;br /&gt;（2）基数为2：Xn=cn+cb (n,2)，也不够随机。&lt;br /&gt;(Xn, X(n+1), X(n+2))总是依赖于d+m,d-m,d,d-2m四个位面&lt;br /&gt;（3）基数为3：序列开始比较随机，但是在Xn, X(n+1), X(n+2)中存在高阶相关性。试验表明序列效果一般&lt;br /&gt;总之，基数到达5，看起来才足够随机。&lt;br /&gt;&lt;br /&gt;　　例如：m=2^35,a=2^k+1。那么b=2^k。此时k&gt;=18时b^2=2^(2k)是m的倍数，基数为2。如果k=17,16,...,12，基数为3。基数为4时k=11,10,9。因此k&lt;=8，即a&lt;=257.&lt;br /&gt;稍后将会看到，小的乘积因子有可能被忽略。这样我们就排除了所有的成绩因子的取值。&lt;br /&gt;&lt;br /&gt;　　假设w是计算机字长，m=w+1或w-1，那么基本上m不可能是质数的大的倍数，较高的基数也是不可能的。因此最大的周期是无法达到的。这就是为什么（当初会提出）c=0。&lt;br /&gt;另外值得强调的是，大的基数也不是必要的。&lt;br /&gt;&lt;br /&gt;-----------------------------------------&lt;br /&gt;看到这里，来分析一下[tc]用过的随机函数。&lt;br /&gt;（1）VC++（VS 2005）&lt;br /&gt;　　X0=0, a=214013/(2^17)=3.266, c=2531011/(2^17)=38.620, m=0x7fff=32767&lt;br /&gt;　　这个，OTL，居然是小数，不知道怎么分析。&lt;br /&gt;&lt;br /&gt;（2）VB6&lt;br /&gt;　　X0=327680, a=0x43fd43fd=1140671485, c=0xc39ec3=12820163, m=0xffffff+1=16777216&lt;br /&gt;　　&lt;br /&gt;应用定理A：&lt;br /&gt;（1）&lt;br /&gt;12820163的因子为：1, 2293, 5591, 12820163&lt;br /&gt;16777216的因子为：1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216&lt;br /&gt;的确互质。&lt;br /&gt;（2）&lt;br /&gt;1140671485-1的质因子为：2&lt;br /&gt;满足条件。&lt;br /&gt;&lt;br /&gt;应用定理B：&lt;br /&gt;327680的因子为：1, 2, 4, 5, 8, 10, 16, 20, 32, 40, 64, 80, 128, 160, 256, 320, 512, 640, 1024, 1280, 2048, 2560, 4096, 5120, 8192, 10240, 16384, 20480, 32768, 40960, 65536, 81920, 163840, 327680&lt;br /&gt;可见X0与m不互质，不过这个不影响。&lt;br /&gt;&lt;br /&gt;m=2^24&lt;br /&gt;p=2&lt;br /&gt;e=24&lt;br /&gt;1140671485 mod 8 =5&lt;br /&gt;满足素元要求。&lt;br /&gt;&lt;br /&gt;所以这组数据可以满足随机函数要求。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-5745184141654806133?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/5745184141654806133/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=5745184141654806133&amp;isPopup=true' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/5745184141654806133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/5745184141654806133'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/blog-post_24.html' title='[选译]关于随机函数发生器的简单讨论'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-7004185110832724281</id><published>2007-02-23T00:45:00.000+08:00</published><updated>2007-02-23T00:46:58.774+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>浏览器内嵌播放器错误（勉强解决，供参考）</title><content type='html'>　　[tc]电脑上的浏览器最近出了奇怪的问题，访问某些包含音乐播放器的网站时会出现Windows的错误提示，并关闭浏览器。以至于[tc]自己的Blog都无法访问的严重后果。今天[tc]忍无可忍，奋战一刻钟，勉强解决问题，下面是过程。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[谁在作怪]&lt;/span&gt;&lt;br /&gt;　　第一反应是IE不稳定，跑去从镜像里抠出以前的IE，不行。用FF2试了一下，不行。&lt;br /&gt;　　第二反应是暴风影音，换了老版本（其实还不够老），不行。&lt;br /&gt;　　第三反应，mpc的Bug，换了一个mpc以前的主程序，不行。又卸载暴风影音，用WMP 10居然好了！这样不算解决问题！又把暴风影音装回来（废话！当然是不一样的版本！）也OK！&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[什么毛病]&lt;/span&gt;&lt;br /&gt;　　满心欢喜。其实这是凌晨发生的事。现在是同一天的晚上，问题又来了，现象一样。&lt;br /&gt;　　OK，耐下心，凌晨和现在什么区别？访问的文件不同！[tc]遂想起这一版的暴风影音有个毛病：文件格式不支持的时候会异常退出。&lt;br /&gt;　　接下来的几分钟十分无聊，就不写了。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[祭出必杀]&lt;/span&gt;&lt;br /&gt;　　[tc]的必杀技是会用调试器。于是在问题再一次发生时，用Visual Studio自带的调试器打断，发现是一处除数为零错误。&lt;br /&gt;　　&lt;span style="font-style: italic; color: rgb(102, 51, 255);"&gt;03DBBB98 div eax,ecx&lt;/span&gt;&lt;br /&gt;　　此时ecx=0。经查发现03DBBB98属于SHNTrans.ax。&lt;br /&gt;　　一阵google，净是些菜鸟抱怨系统不稳定的帖子，无聊。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[再靠自己]&lt;/span&gt;&lt;br /&gt;　　把SHNTrans.ax打开一看，发现是个DLL文件。打开之，字符串列表中有一行：Shorter Compressed Audio。放到暴风影音的滤镜列表中一看，叫做SHN to wave Filter。&lt;br /&gt;　　第一反应，又没有新版本？无果。&lt;br /&gt;　　第二反应，不要行不行？我又不听SHN文件，这个滤镜用不上。&lt;br /&gt;　　删除该文件，问题解决。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[结论]&lt;/span&gt;&lt;br /&gt;　　DirectShow好奇怪……&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-7004185110832724281?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/7004185110832724281/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=7004185110832724281&amp;isPopup=true' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7004185110832724281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7004185110832724281'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/blog-post_23.html' title='浏览器内嵌播放器错误（勉强解决，供参考）'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-7912591066637033187</id><published>2007-02-21T13:43:00.000+08:00</published><updated>2007-02-21T15:26:52.277+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='动画'/><title type='text'>欢迎来到NHK</title><content type='html'>&lt;a href="http://www.kadokawa.co.jp/hikky/"&gt;http://www.kadokawa.co.jp/hikky/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NHK=日本家里蹲协会&lt;br /&gt;&lt;br /&gt;　　由泷本龙彦原作小说改编的漫画改编的动画，讲述大学退学的 佐藤达广 在学弟 山崎薫 的影响下成为半个Otaku，同时面对女生 中原岬 的故事。大体上包括相识、签约、跟踪、约会、制作、孤岛、网游（Ultimate Fantasy 诸神的黄昏）、传销、回家、绝望、结局。&lt;br /&gt;&lt;br /&gt;　　主角 佐藤君 的家里蹲史n起n落，令人忍俊不禁。而所谓的“巨大组织的阴谋”、所谓的“罚款100万”（后来变成1000万、1亿万了）、所谓的Purupuru Pururin Rin，都令这部动画增色不少！薫 的GAL Game（不是ACG来的吗？）相关内容，大体上也能反映一些Otaku的现状吧。不过网游受害者这个角色，似乎渲染得比较过分了，有点恐怖。~~囧~~&lt;br /&gt;&lt;br /&gt;　　小林沙苗 配音的　柏瞳（学姐），也是值得关注。中原岬 再一次让[tc]深深感觉到，牧野由依 的声音比较单调（跟单纯不一样），还要再努力一把！总的说来，NHK是一部成功的作品！&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_uY1kBF5xvkE/Rdvz23yz4rI/AAAAAAAAAAM/qdeTn_LBvA8/s1600-h/Mindows.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_uY1kBF5xvkE/Rdvz23yz4rI/AAAAAAAAAAM/qdeTn_LBvA8/s320/Mindows.jpg" alt="" id="BLOGGER_PHOTO_ID_5033885132532212402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;TrueWorld～真実のセカイ～&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;这个游戏，[tc]我花了一个小时来玩。OTL，剧中的设定在哪里啊～～～～&lt;br /&gt;&lt;br /&gt;[tc]Puru Puru Rin&lt;br /&gt;&lt;a href="http://webdisk.cech.com.cn/download/file_share_2914802.html"&gt;http://webdisk.cech.com.cn/download/file_share_2914802.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" height="217" width="320"&gt;&lt;br /&gt;&lt;param name="autoStart" value="false"&gt;&lt;br /&gt;&lt;param name="URL" value="http://webdisk.cech.com.cn/2914802/180da46e54ba5a30f2c05f82cb9cd878f282af29/share/[tc]purupuru%20Rin.mp3"&gt;&lt;br /&gt;&lt;embed autostart="false" src="http://webdisk.cech.com.cn/2914802/180da46e54ba5a30f2c05f82cb9cd878f282af29/share/%5Btc%5Dpurupuru%20Rin.mp3" type="video/x-ms-wmv" controls="ImageWindow" console="cons" height="217" width="320"&gt;&lt;br /&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-7912591066637033187?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/7912591066637033187/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=7912591066637033187&amp;isPopup=true' title='8 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7912591066637033187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7912591066637033187'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/nhk.html' title='欢迎来到NHK'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_uY1kBF5xvkE/Rdvz23yz4rI/AAAAAAAAAAM/qdeTn_LBvA8/s72-c/Mindows.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-504679982872409091</id><published>2007-02-15T23:12:00.000+08:00</published><updated>2007-02-18T14:24:45.614+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='媒体'/><title type='text'>[tc]Lost My Music</title><content type='html'>受到某同人网站的一首音乐的影响，花了几个小时吧《凉宫》里的《Lost My Music》从摇滚改成现在这种风格。本来想要加大提琴再抒情一点的，时间有限，只能用钢琴独奏了。&lt;br /&gt;&lt;br /&gt;音乐大体上可以反映[tc]的意图，但是许多细节都不尽人意。[tc]我也是工作到今天凌晨三点才搞定的。[tc]搞音乐一向虎头蛇尾，大家就忍了吧。&lt;br /&gt;&lt;br /&gt;今天为了上传音乐化了点功夫。结果还使用了网盘。&lt;br /&gt;&lt;br /&gt;文件在这里：&lt;br /&gt;&lt;a href="http://webdisk.cech.com.cn/download/file_share_2896198.html"&gt;[tc]Lost My Music.mp3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-504679982872409091?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/504679982872409091/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=504679982872409091&amp;isPopup=true' title='6 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/504679982872409091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/504679982872409091'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/tclost-my-music.html' title='[tc]Lost My Music'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-7947654309026030430</id><published>2007-02-15T22:38:00.000+08:00</published><updated>2007-02-15T22:40:08.690+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>两种uC线程切换不同的实现方法</title><content type='html'>&lt;p&gt;&lt;strong&gt;到底发生了什么&lt;/strong&gt;&lt;br /&gt;——两种uC线程切换不同的实现方法&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;一、前言&lt;/strong&gt;&lt;br /&gt;　　[tc]在VC上移植的uC/OS前些天遇到了许多奇怪的问题：不同的uC线程顺序的使用VC提供的rand()随机函数得到了相同的结果；另一方面，VC版在检查堆栈的使用情况OSTaskStkChk时，总是返回一致的结果。为什么？到底发生了什么？[tc]的移植存在问题吗？&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;二、两种任务切换方法&lt;/strong&gt;&lt;br /&gt;　　即将讨论的方法显然不是任务切换仅有的方法，只是[tc]只亲生经历过这两种方法。&lt;br /&gt;1、法一：标准方法&lt;br /&gt;　　即在任务切换时，挂起该任务（在这种方法中，CPU只有一个，实际上调度开始时只要暂停中断即可），保存所有寄存器的内容（EAX、EBX……）到该任务的ptos指示堆栈中，更新OS_TCB。&lt;br /&gt;2、法二：Windows切换&lt;br /&gt;　　而[tc]采用的不是上面的方法，Windows有自己的一套线程调度算法，我只是在VC上实现一些功能而以，何必认真呢？于是每当OSTaskCreate发生时，实际上是调用CreateThread来生成一个线程。与Win32程序不同的是，为了让uC来做调度，不得不挂起这些线程SuspendThread，直到调度方生时恢复之ResumeThread。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;三、后果如何&lt;/strong&gt;&lt;br /&gt;　　实际的效果是，[tc]的uC更加稳定。由于用了M$的函数，可以避免Win下的复杂环境，许多操作实际上Win会帮你完成。而跟踪“标准方法”的某个程序之后，不难发现在复杂的中断发生时，该方法的uC很难保证稳定性。[tc]曾见过文佳同志的uC（我对此人并无恶意，只是就事论事），在控制台属性变化时，系统崩溃。原因大概是uC进入临界代码时无法真正的屏蔽一切中断，结果寄存器遭到修改。&lt;br /&gt;　　缺点也是很明显的。由于实现方法的不同，许多行为与uC的原作者的意愿相背离了。这就是开头所述的问题的起源。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;四、解释一下前言中的两个问题&lt;br /&gt;&lt;/strong&gt;1、随机函数&lt;br /&gt;　　本人接触过的各种编译器所提供的随机函数使用的都是线性迭代法（这名字是[tc]瞎起的，听起来还挺专业……）。即：r(0)=种子，r(n)=(A*r(n-1)+B)/C Mod D，其中A、B、C是常数，C一般取2的幂次以回避除法，D是最大值。我猜想原作者使用的BC4.5也是这样做的。&lt;br /&gt;　　随机函数不具有可重入性这是显而易见的。因此作者建议使用信号量来解决。但是遗憾的是，现在的编译器已经自带了所谓的信号量机制。比如下面是VS 2005的一段东西：&lt;br /&gt;　　_ptiddata ptd = _getptd();&lt;br /&gt;　　也就是说，VS会自动负责区分不同的线程。对于每个线程而言，rand函数是独立的。这就是为什么，[tc]的若干个任务（现在是Windows线程了），虽然顺序的调用随机函数，却不能达到随机的目的的原因。&lt;br /&gt;　　看起来要想解决这个问题有两种方法：（1）写个线程，用来给其他线程提供随机函数（真是有病）；（2）自己写个随机函数，为了装B，可以用华丽的[tc]正态分布函数……&lt;/p&gt;&lt;br /&gt;&lt;p&gt;2、不同的线程被认为堆栈使用量相同&lt;br /&gt;　　uC的计算方法大概是，循环遍历整个堆栈，找出已经使用的部分。那么不同的线程，如果算法不同，理应占用不同大小的堆栈。&lt;br /&gt;　　当一个决定性的证据出现——所有线程总是只占用22个字节的堆栈——时，[tc]恍然大悟！&lt;br /&gt;　　道理很简单，由于调用了CreateThread，实际上，线程的堆栈是由Windows分配的，而不是uC。那22个字节是用来保存任务特征的一个数据结构的大小。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;五、后记&lt;/strong&gt;&lt;br /&gt;　　作为uC的初学者就能分析到这一步，佩服自己……&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-7947654309026030430?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/7947654309026030430/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=7947654309026030430&amp;isPopup=true' title='6 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7947654309026030430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7947654309026030430'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/uc.html' title='两种uC线程切换不同的实现方法'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-6371680353837200842</id><published>2007-02-15T14:48:00.000+08:00</published><updated>2007-02-15T14:49:18.040+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='动画'/><title type='text'>夜明け前より瑠璃色な</title><content type='html'>&lt;p&gt;Carillon Harmonia&lt;br /&gt;Yoakena&lt;/p&gt;&lt;p&gt;　　“斯菲阿国”公主 菲娜·法姆·阿修莱特 到男主角 朝雾达哉 家后宫的故事。音效欠火候，没气氛，音乐还不错。故事对政治问题分析得很不严肃。以上。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-6371680353837200842?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/6371680353837200842/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=6371680353837200842&amp;isPopup=true' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/6371680353837200842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/6371680353837200842'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/blog-post_15.html' title='夜明け前より瑠璃色な'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-1662177915037612136</id><published>2007-02-13T10:44:00.001+08:00</published><updated>2007-02-12T18:25:55.111+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='闲聊'/><title type='text'>凉宫春日的忧郁 TV 版 ED 舞步演示</title><content type='html'>凉宫春日的忧郁 TV 版 ED 舞步演示&lt;br /&gt;&lt;a href="http://www.tg777.com/levelup/user/zwei/sos-ed.avi"&gt;http://www.tg777.com/levelup/user/zwei/sos-ed.avi&lt;/a&gt;&lt;br /&gt;谁敢不支持团长大人？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-1662177915037612136?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/1662177915037612136/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=1662177915037612136&amp;isPopup=true' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/1662177915037612136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/1662177915037612136'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/tv-ed.html' title='凉宫春日的忧郁 TV 版 ED 舞步演示'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-8223953589814277093</id><published>2007-02-12T18:23:00.000+08:00</published><updated>2007-02-12T15:39:46.182+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>让基于uC/OS的ARM程序在VC上调试</title><content type='html'>&lt;p&gt;　　明眼人看标题就知道其实这是一个操作系统移植的简单问题。在不同的平台上，只要接口一致，主程序就能互相通用。&lt;/p&gt;&lt;p&gt;1、主题&lt;br /&gt;　　ARM的调试工具已经十分强大了，但是在M$面前还是如同孩子一般幼稚。如果能在Microsoft Visual Studio 2005中建立一个通用的框架，那么ARM平台的程序就可以在x86下设计、调试。完成后拷贝到ADS中编译。&lt;/p&gt;&lt;p&gt;2、移植&lt;br /&gt;　　当然，要让uC/OS能在VC中使用，首先需要将uC/OS移植到PC上。下面的方案我是在参考了一些代码的基础上总结出来的，难称原创，而且估计有不少错误……&lt;br /&gt;　　原作者是在BC4.5上编写uC/OS的。Windows有其特殊的变成风格，比如uC的系统定时器、新进程的启动、中断的允许等问题，完全应该交由Windows完成，而进程调度还是得由uC完成。这里面的矛盾只需要让Windows产生的线程处于睡眠状态就可以轻松搞定。&lt;br /&gt;　　另外中断屏蔽需要用到互斥对象（Mutex），需要时用WaitForSingleObject保持互斥状态，直到进程调度结束。&lt;br /&gt;　　最不好理解的问题莫过于恢复线程状态，这个[tc]我也不是很懂，还要再研究研究。&lt;/p&gt;&lt;p&gt;3、框架&lt;br /&gt;　　完成uC之后，需要分别为ARM和PC设定一个编程框架。[tc]选用的是昨天移植好的ARM的框架。大意如下：&lt;/p&gt;&lt;p&gt;（1）首先是低级初始化&lt;br /&gt;[ARM]&lt;br /&gt;　　还是那些老东西，恢复到“重启”状态、时钟、重入&lt;br /&gt;[PC]&lt;br /&gt;　　什么都不做，x86就是好啊……&lt;/p&gt;&lt;p&gt;（2）Console级&lt;br /&gt;[ARM]&lt;br /&gt;　　2410这东西不能使用stdio.h，所以把各种功能函数定义在这里。&lt;br /&gt;[PC]&lt;br /&gt;　　#include &lt;stdio.h&gt;，x86通用性……&lt;br /&gt;　　为了让各种2410功能也能运行于PC，应该在这里设计各种各样的函数。&lt;/p&gt;&lt;p&gt;（3）FrameWork级&lt;br /&gt;[ARM]&lt;br /&gt;　　设定了分频比、初始化IRQ。但是时钟中断不要修改！初始化MMU。&lt;br /&gt;[PC]&lt;br /&gt;　　基本上，又是什么都不做。x86，我爱你……&lt;/p&gt;&lt;p&gt;（4）Application级-OSinit&lt;br /&gt;[ARM]&lt;br /&gt;　　创建两个基本进程。将看门狗中断定义为系统时钟OSTimeTick()（此前用的是Timer4，但是看门狗更适合。）&lt;br /&gt;[PC]&lt;br /&gt;　　创建两个基本线程，创建时钟线程调用OSTimeTick()，设定Windows线程优先级&lt;/p&gt;&lt;p&gt;　　从这里开始两个平台已经完全一样了。&lt;/p&gt;&lt;p&gt;4、调试&lt;br /&gt;　　这件事情滞后考虑。[tc]眼下想把uC/FS搞来移植，uC/TCPIP就免了，太复杂。其实哪个文件系统已经很复杂了……&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-8223953589814277093?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/8223953589814277093/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=8223953589814277093&amp;isPopup=true' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8223953589814277093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/8223953589814277093'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/ucosarmvc.html' title='让基于uC/OS的ARM程序在VC上调试'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-7038978694028040860</id><published>2007-02-12T15:34:00.000+08:00</published><updated>2007-02-12T15:35:00.052+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>[tc]XP补丁包3、4，今日打包</title><content type='html'>&lt;p&gt;每年两次的[tc]对XP补丁的打包工作今天结束。此次打包的文件有以下两个：&lt;br /&gt;　　[tc]XP补丁包3 2006.8-2007.1.exe&lt;br /&gt;　　[tc]XP补丁包4 正版用户补丁 2005-2007.1.exe&lt;/p&gt;&lt;p&gt;　　从大小来看，此次的补丁包3的50 MB比以往的补丁要小一些。应该是巧合吧，每次的补丁包是一次比一次小。给人一种“XP问题越来越少”的错觉。&lt;/p&gt;&lt;p&gt;　　与以往不同，今天还打包了一个“包4”，这是自微软Windows Update启用正版用户验证以来，从2005年至今的，仅针对正版用户的Windows补丁。[tc]我的获得途径有两条：一是其它网站，二是某些网站公布的微软网站实际的下载地址（即绕过了正版验证）。&lt;/p&gt;&lt;p&gt;　　不过这些“正版补丁”也大都是一些无关紧要的东西，比如：某国家自某日起时钟改为夏令计时、Windows某软件新增了几个小功能（比如msconfig新增了一页、远程桌面连接增加了身份验证）、AMD双核需要一些补丁修正电源效率问题等等。不装也罢。&lt;/p&gt;&lt;p&gt;　　需要补丁的小朋友发邮件。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-7038978694028040860?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/7038978694028040860/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=7038978694028040860&amp;isPopup=true' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7038978694028040860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7038978694028040860'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/tcxp34.html' title='[tc]XP补丁包3、4，今日打包'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-5179196969959183208</id><published>2007-02-12T14:03:00.000+08:00</published><updated>2007-02-12T15:37:58.878+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='动画'/><title type='text'>现视研相关</title><content type='html'>&lt;p&gt;&lt;span style="color:#008800;"&gt;&lt;strong&gt;-1签-&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;现视研&lt;br /&gt;第一季动画一共12集&lt;br /&gt;漫画一共八卷共50话&lt;/p&gt;&lt;p&gt;　　&lt;span style="color:#ff0000;"&gt;现视研（げんしけん）＝ 现代视觉文化研究会&lt;/span&gt;&lt;/p&gt;&lt;p&gt;　　笹原完士 在进入大学之后，致力于理解“漫画·动画·游戏”的新体验。于是认识了包括 高坂真琴 在内的一票Otaku，自己也朝这个道路前进。另一方面出现在现视研的一直恋慕着高坂的 春日部咲 和cosplay的 大野 等各种人也以现视研为舞台展开了许多有趣的生活。&lt;br /&gt;　　木尾士目原作的漫画，描写大学生御宅族生活的《现视研》，一开播反响就很大，今天看到这部作品，果然非常有趣，每一集（特别是接近尾声的时候）等能引人大笑一阵。虽然[tc]不是Otaku，但是似乎能从剧情中找到自己的影子。&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008800;"&gt;&lt;strong&gt;-2签-&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;不公正抽签&lt;br /&gt;OVA 3话&lt;/p&gt;&lt;p&gt;　　除了现视研出现的一些镜头以外，不用问还有其他内容。回过头来看，《现视研》中对《不签》的评论可以说十分到位了。几乎可以说，由于有现视研的评论在先，《不签》才显得格外出色，几乎成为完美的特别适合Otaku看的动画。&lt;br /&gt;　　不同于一般的校园恋爱、恶搞动画，《不签》的全部内容都是围绕“对决”展开的（照理说是指对候补学生会的认同仪式），剧中，蘑菇料理对决、网页点击对决、在三温热里冷得不能再冷的笑话、诱惑的军训、全世界都要崩溃的卡拉OK、拖延时间的外星人游泳（务必请与TV版的外星人联系起来看！）、高度运气的麻将、可以通PHS电话的骷髅地下室。无一不堪称经典!&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008800;"&gt;&lt;strong&gt;-3签-&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;不公正抽签&lt;br /&gt;TV 12话&lt;/p&gt;&lt;p&gt;　　TV版讲述的是 千寻 一行人从抽签入学到当上次界立桥院学生会的过程。不过改变了“原作”的不少设定。比如把 夏本 千寻 设定为缺钙正太会长（应该是书记），秋山 时乃 变成了青梅竹马的副会长（应该是会长），律子变成某丰满女（CV居然是 小清水亚美，汗）。唯一值得期待的罗莉会计 朝雾小雪 是个超能力人（应该是会计的浩浩闹闹的一家子中最小的一个），她姐，眼睛女 朝雾忍，人如其名，是个忍者（应该是 朝雾 小牧，会计）、橘泉美　是个反叛的R3S学生会暴力部门领导者（原作是副会长），上石神井莲子 原作是一个半路冒出来的大嘴女、现在居然是书记……这个世界是不真实的。T_T&lt;br /&gt;　　这次的人物关系变换，以时尚动画来说的确更适合一些，不过以Otaku的眼光恐怕并不是这样认同的。&lt;br /&gt;　　另外，上届学生会副会长 如月 香橙 的CV是 野上 ゆかな，泰莎的配音。[tc]一直到最后一集才听出来，失败。&lt;br /&gt;　　从画风角度上说，TV版不如OVA这么卡哇，而且人物经常变型。虽然制作上不受[tc]认同，但是常常在瞬间中产生的暴笑镜头，还是能让本人狂笑不止。特别是外星人的相关内容……&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008800;"&gt;&lt;strong&gt;-4签-&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;现视研2&lt;br /&gt;？？？&lt;br /&gt;　　虽然《现视研2》似乎是理所当然应该出现的，不过制作计划却夭折了。可惜！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-5179196969959183208?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/5179196969959183208/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=5179196969959183208&amp;isPopup=true' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/5179196969959183208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/5179196969959183208'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/blog-post_12.html' title='现视研相关'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-5544621645117751106</id><published>2007-02-11T20:18:00.000+08:00</published><updated>2007-02-10T22:34:19.047+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>μｃ/ＯＳ-II在S3C2410上的移植小记</title><content type='html'>　　μｃ/ＯＳ（下称“uC/OS”）是完成可以进程调度的可剥夺式操作系统。在经历了40小时之后终于能在本人的ST2410上运行了。然而此次移植的主要贡献仍然是uC/OS的原作者：Michael Anburaj。而[tc]由于智商方面的原因只完成了一些简单的工作。&lt;br /&gt;&lt;br /&gt;　　uC/OS移植的要点，在[tc]看来主要是两方面：&lt;br /&gt;1、编写任务切换程序&lt;br /&gt;2、实现系统Tick（这是实现可剥夺的关键）&lt;br /&gt;&lt;br /&gt;　　前者很简单，备份当前程序的状态，取回下一任务的状态即可。后者主要是利用定时中断的4号定时器完成。4号定时器是一个内部定时器，从200MHz时钟4分频后（分频比应该在初始化系统时间时设定PLL），经过预分频、分频得到适当的定时长度，然后指定pISR_TIMER4的指针，运行服务程序，最终调用OSTimeTick()，就完成了一次调度过程&lt;br /&gt;。&lt;br /&gt;　　这个看似简单的过程实际实施起来却异常艰难。&lt;br /&gt;　　首先，使用定时中断需要MMU帮忙，然而[tc]配的MMU单独运行时没问题，使用定时中断也没问题，但是加上uC就不能工作。&lt;br /&gt;　　其次，初始化程序不大稳定，有时不硬件复位就会自动软复位。&lt;br /&gt;　　总之，[tc]智商不够，最后用了官方的SMDK2410的演示程序为样本，适当修改，这才得以工作。&lt;br /&gt;&lt;br /&gt;　　接下来还要调试uC/OS的其它功能，如消息队列、进程同步、死锁、邮箱等等。而进一步的要求，如文件系统、TCPIP等，看来只能等到开学以后了。&lt;br /&gt;　　累！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-5544621645117751106?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/5544621645117751106/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=5544621645117751106&amp;isPopup=true' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/5544621645117751106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/5544621645117751106'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/iis3c2410.html' title='μｃ/ＯＳ-II在S3C2410上的移植小记'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-2695570944799096594</id><published>2007-02-09T20:42:00.000+08:00</published><updated>2007-02-09T17:08:28.466+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>RightMark CPU Clock Utility</title><content type='html'>&lt;p&gt;　　今天发现一款不错的CPU超/降频软件：RightMark CPU Clock Utility。&lt;br /&gt;　　此前还见过一款界面不错的软件：Notebook Hardware Control（也是非常优秀的！），只是那款的未注册版本限制比较多。&lt;/p&gt;&lt;p&gt;　　该软件主要实现按照不同的策略设置CPU频率。如图所示，设置为“最大性能”时，CPU工作在200M X 10 = 2GHz下，而“省电”模式下工作在800MHz下，温度是23摄氏度，按照[tc]在主板BIOS中的设定，风扇停转，十分安静（[tc]的电源风扇也是静音的）！&lt;br /&gt;　　之所以能发现这款软件，完全是因为Gigabyte附送的调整软件不好用，[tc]差一点自己写这样的软件的说。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://i170.photobucket.com/albums/u252/tctianchi/2007.jpg" target="_blank"&gt;&lt;img height="200" alt="Photobucket - Video and Image Hosting" src="http://i170.photobucket.com/albums/u252/tctianchi/2007.jpg" border="0" /&gt;&lt;/a&gt;　&lt;a href="http://i170.photobucket.com/albums/u252/tctianchi/2007-1.jpg" target="_blank"&gt;&lt;img height="200" alt="Photobucket - Video and Image Hosting" src="http://i170.photobucket.com/albums/u252/tctianchi/2007-1.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-2695570944799096594?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/2695570944799096594/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=2695570944799096594&amp;isPopup=true' title='6 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/2695570944799096594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/2695570944799096594'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/rightmark-cpu-clock-utility.html' title='RightMark CPU Clock Utility'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-4007453594169779861</id><published>2007-02-07T12:54:00.000+08:00</published><updated>2007-02-07T12:57:08.189+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='技术'/><title type='text'>一个不错的模拟低通滤波器</title><content type='html'>对于用模拟电路实现比较理想的低通滤波，[tc]一直以为是非常困难的。相比之下，高通似乎比较容易。中午的时候无聊，居然人品爆发，实现了一个不错的低通滤波器，遂拿出来秀秀。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://i170.photobucket.com/albums/u252/tctianchi/LPF.jpg" target="_blank"&gt;&lt;img src="http://i170.photobucket.com/albums/u252/tctianchi/LPF.jpg" width="200" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;下面是模型。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://i170.photobucket.com/albums/u252/tctianchi/model.jpg" target="_blank"&gt;&lt;img src="http://i170.photobucket.com/albums/u252/tctianchi/model.jpg" width="200" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-4007453594169779861?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/4007453594169779861/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=4007453594169779861&amp;isPopup=true' title='9 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4007453594169779861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4007453594169779861'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/blog-post_07.html' title='一个不错的模拟低通滤波器'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-4915569104470967102</id><published>2007-02-06T22:17:00.000+08:00</published><updated>2007-02-06T22:18:06.897+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='动画'/><title type='text'>忘却的旋律</title><content type='html'>&lt;p&gt;The Melody Of Oblivion&lt;br /&gt;GAINAX J.C.STAFF 2004&lt;br /&gt;&lt;a href="http://www.tbs.co.jp/boukyaku/"&gt;www.tbs.co.jp/boukyaku/&lt;/a&gt;&lt;br /&gt;TV 23话&lt;/p&gt;&lt;p&gt;　　20世纪人类和Monster（怪物）之间发生了一场很大的战争，以Monster一方的胜利告终。新世纪，人们忘记了旋律。直到 博卡 遇见了 黑船 先生，成为 旋律战士，开始了一场“寻找传说中的女神”的旅途。全篇除了一头一尾以外，以地点为分界线，分为　白夜岬、鼠讲谷、猿人湾、迷宫岛、幸运河、东京站、圈外圈　等数篇。博卡 和 小夜子……算是在旅行的吧，每到一处，博卡 就放不下那里的居民，在一句“燃烧吧，我的小宇宙”式的“奏响吧，我的旋律”之后，在居民的唾骂声中离开。与《翼·年代记》的回娘家型不同，《忘》是打怪练级型。&lt;/p&gt;&lt;p&gt;　　GAINAX负责的这部TV动画的制作，制作人员包括了贞本义行。声优阵容也是一如既往的豪华。Bocca·Selenady：桑岛法子、月之森小夜子：浅野真澄、忘却的旋律：能登麻美子、远音：小林沙苗 、スカイブルー：保志总一朗、ホル：森久保祥太郎。非常吸引[tc]的眼球。&lt;/p&gt;&lt;p&gt;　　制作上看，除了个别明显偷工减料的镜头以外，着色艳丽，叙事完整。适当的时候，对人类趋向软弱的本能做出了深刻的反省。而故事的设定决定了不少英雄的无奈的悲剧的循环。恶魔与人类的矛盾、人类不同国家意识的不同步、人类短浅的目光，在动画中一一展现，十分有趣。&lt;/p&gt;&lt;p&gt;　　奇怪的是，这一部内涵严肃的作品，到了尾声《圈外圈》篇时，出现了大量OTL画面设计，令人哭笑不得的舞台剧、时不时插进来的奶牛牧场、怪物联盟成员矫揉造作的表演，着实令《忘》增添了几分恶搞的色彩！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-4915569104470967102?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/4915569104470967102/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=4915569104470967102&amp;isPopup=true' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4915569104470967102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4915569104470967102'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/blog-post.html' title='忘却的旋律'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-2466102687212925908</id><published>2007-02-05T00:30:00.001+08:00</published><updated>2007-02-05T00:30:49.590+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='游戏'/><title type='text'>《[tc]魔兽3 1.21内存修改器》V3</title><content type='html'>前几天才完成的修改器，今天发现已经有1.21的补丁了，先前的修改不能再用，需要更新。&lt;br /&gt;&lt;br /&gt;好在基本的代码不用动，因此花了两个小时来改程序。&lt;br /&gt;&lt;br /&gt;还是老样子，改英雄的经验、三围、攻速、移动这几项。突然发现钱、木等也是可以改的（怎么才发现……），不过操作起来比较麻烦，我就不写了。&lt;br /&gt;&lt;br /&gt;要修改器的同志发邮件。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-2466102687212925908?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/2466102687212925908/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=2466102687212925908&amp;isPopup=true' title='6 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/2466102687212925908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/2466102687212925908'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/02/tc3-121v3.html' title='《[tc]魔兽3 1.21内存修改器》V3'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-4707340782320762385</id><published>2007-01-31T23:18:00.000+08:00</published><updated>2007-01-31T23:32:47.137+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='游戏'/><title type='text'>《[tc]魔兽3 1.20内存修改器》V2版</title><content type='html'>&lt;p&gt;　　半年前[tc]编写这个内存修改器的时候曾经遇到过一个重大问题，昨晚重新翻看的时候，人品爆发，找到了一个可称为“无奈之举”的方案，今天就写了出来。&lt;/p&gt;&lt;p&gt;&lt;b&gt;[问题何在]&lt;/b&gt;&lt;br /&gt;　　此前修改英雄属性的时候，力量、敏捷这两项属性代码十分简易，譬如下面是读取敏捷数据的代码：&lt;/p&gt;&lt;p&gt;　　6F13CE7B:&lt;br /&gt;　　8b be a8 00 00 00 mov edi,[esi+000000a8] &lt;/p&gt;&lt;p&gt;　　然而“智力”却十分难修改，关键性代码有多处，其中最显眼的一处是：&lt;/p&gt;&lt;p&gt;　　6F088E78:&lt;br /&gt;　　8b 42 78 mov eax,[edx+78] &lt;/p&gt;&lt;p&gt;　　可是不幸的是，这段代码并不仅仅是读取智力的，它似乎是一个函数，将一些离散的数据从堆地址传送到临时地址。因此，虽然这里面包含了我们想要修改的内容，但同时包含了许多其他内容。&lt;br /&gt;　　另一方面，力量、敏捷、智力这三项属性，在内存分配上可谓是毫无联系，应该是动态分配得到的，实际游戏中无法从其中一个地址判断出其他的地址。 &lt;/p&gt;&lt;p&gt;&lt;b&gt;[人品爆发]&lt;/b&gt;&lt;br /&gt;　　从大量的数据中滤出所需的“智力”地址，是解决问题的方案之一。&lt;br /&gt;　　昨晚发现，在有限的时间里，经过6F088E78的代码的eax的取值是十分有限的一些数据，而不是任意多个数据。进一步观察发现，在这些数据中，智力的地址竟然是eax的最大值！&lt;br /&gt;　　这一惊人的发现，促使下面的方案的形成。&lt;/p&gt;&lt;p&gt;&lt;b&gt;[无奈之举]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　嵌入的代码，不用问，和其他的代码是不同的。以往获取力量等属性的时候，一般是将寄存器的内容转移到内存里，以便查阅。而智力这一属性的地址，是“经过6F088E78代码处的eax的值”中的最大值，因此需要挑出最大的一个。&lt;br /&gt;　　例如，针对上面的例子，获得敏捷的地址，可以嵌入下面的代码：&lt;/p&gt;&lt;p&gt;　　89 35 08 10 46 00 mov [00461008],esi&lt;/p&gt;&lt;p&gt;　　那么esi的内容将被转移到00461008处，此后只要查阅[[00461008]+a8]，就可以得到并修改敏捷的值。&lt;br /&gt;　　而针对智力，嵌入下面的代码：&lt;/p&gt;&lt;p&gt;　　39 15 14 10 46 00 cmp [00461014],edx&lt;br /&gt;　　77 06 ja 00449E2E &lt;if&gt;goto L1&gt;&lt;br /&gt;　　89 15 14 10 46 00 mov [00461014],edx &lt;if&gt;save&gt;&lt;br /&gt;　　&lt;l1:&gt;&lt;br /&gt;　　&lt;原来的代码&gt;&lt;/p&gt;&lt;p&gt;　　那么edx的最大值将被转移到00461014中，在适当的时候取出[[00461014]+78]就可以获得并修改智力值了！&lt;br /&gt;　　接下来的问题：什么是“适当的时候”呢？&lt;br /&gt;　　[tc]无法给出准确的答案，目前的解决方案是：在敏捷获得后的3秒钟时间内获得的数据都是准确有效的数据。为什么安排在敏捷获得之后？主要原因是魔兽3经常运行6F088E78（智力）这里的代码，而不会运行6F13CE7B（敏捷）这里的代码，因此基本上只有运行了敏捷的读取程序才有可能运行智力的读取程序。&lt;br /&gt;　　这种盲目性决定了本方案是一个“无奈之举”的方案。&lt;/p&gt;&lt;p&gt;&lt;b&gt;[程序现状]&lt;/b&gt;&lt;br /&gt;　　大体上程序就这么定型了。目前的修改器可以实时修改指定英雄的经验值、力量、敏捷、智力、移动速度、攻击频率等属性。事实上，[tc]还可以实现攻击力、防御力、攻击类型（如混乱、穿刺等）、防御类型（如城甲、英雄甲等）等属性，不过意义不大，[tc]没有编写程序。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-4707340782320762385?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/4707340782320762385/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=4707340782320762385&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4707340782320762385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/4707340782320762385'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/01/tc3-120v2.html' title='《[tc]魔兽3 1.20内存修改器》V2版'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-3857745453200678674</id><published>2007-01-30T22:46:00.000+08:00</published><updated>2007-01-31T23:33:03.998+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='闲聊'/><title type='text'>结果跑到Blogger来了！</title><content type='html'>　　似乎半个星期前还在Wallop.com转悠，现在就跑到这里来了。作为老一届MyWallop用户，不得不说：微软没能留住人啊！&lt;br /&gt;&lt;br /&gt;　　先把昨天的东西贴过来，然后再慢慢打理这里好了！还是那些内容：编程（现在包括嵌入式了）成果、动漫评论、摄影心得等等。&lt;br /&gt;&lt;br /&gt;　　化腐朽为绵掌，这里是绵掌集散地！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-3857745453200678674?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/3857745453200678674/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=3857745453200678674&amp;isPopup=true' title='3 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3857745453200678674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/3857745453200678674'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/01/blogger.html' title='结果跑到Blogger来了！'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-7331164434865251498</id><published>2007-01-29T21:30:00.000+08:00</published><updated>2007-01-31T23:33:20.369+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='动画'/><title type='text'>无敌看版娘</title><content type='html'>无敌看版娘&lt;br /&gt;TV 6话&lt;br /&gt;&lt;br /&gt;　　高攻无脑型暴力女 鬼丸 美辉 是一个在 鬼丸中华料理 小店里长大的家伙。不过姑且招牌女服务员。打工期间分神翘班、与周围人打打杀杀是家常便饭。不知道是在店里帮忙还是在帮倒忙。好在在这个世界中，最强人士其实是 鬼丸真纪子，美辉的妈妈，能够毫不费力地把美辉按倒，大概她才是支撑这个店的人。&lt;br /&gt;　　小清水亜美　一改以往的角色风格，此次饰演的　神无月めぐみ，是对面面包店的招牌女服务员。表面看起来很可爱，其实性格阴险。由于体质问题根本不是 美辉 的对手，但是一直坚持着对抗。至于隔壁蔬菜店工作的 太田明彦、每天都来挑战的 西山勘九郎、只有在吃拉面时才笑的 茅原智香，也为这部动画增色颇多。另外，动画中还有一只所向无敌的狗 敏行，据说和美辉有同样程度的战斗能力——当然，在 真纪子 的面前还是毫无办法的。&lt;br /&gt;　　到底是《周刊少年冠军》上获得巨大支持的新系列连载作品，《无敌看板娘》在2006年7月放送时反响似乎也是不错。漫画家　佐渡川准　在秋田书店《周刊少年CHAMPION》上连载至第16卷，还依然绝赞、恶搞连续不断。所以虽然整部动画都充斥着打斗场面（还称不上暴力），不过仍然是一部值得拿来消遣的优秀动画作品！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-7331164434865251498?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/7331164434865251498/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=7331164434865251498&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7331164434865251498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/7331164434865251498'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2007/01/blog-post.html' title='无敌看版娘'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6502682293701136126.post-6113871472031387918</id><published>2006-02-14T07:58:00.000+08:00</published><updated>2008-10-13T08:01:43.101+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='十进制'/><category scheme='http://www.blogger.com/atom/ns#' term='数字'/><category scheme='http://www.blogger.com/atom/ns#' term='显示'/><category scheme='http://www.blogger.com/atom/ns#' term='print'/><category scheme='http://www.blogger.com/atom/ns#' term='Integer'/><category scheme='http://www.blogger.com/atom/ns#' term='汇编'/><category scheme='http://www.blogger.com/atom/ns#' term='Assemble'/><title type='text'>怎样显示一个整数</title><content type='html'>&lt;span&gt;原贴：&lt;a href="http://tctianchi.yo2.cn/articles/integer.html"&gt;http://tctianchi.yo2.cn/articles/integer.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在这个汇编也能调用wprintf的时代讨论这个问题是不是太过时了？如果变量a中保存有十六进制数0FFF FFFF，无论是printf(&lt;span style="color:#888888;"&gt;"%d"&lt;/span&gt;,a);、&lt;/span&gt;&lt;span style="color:#000080;"&gt;Print &lt;/span&gt;&lt;span&gt;a、&lt;/span&gt;&lt;span style="color:#aaaa11;"&gt;writeln(a);&lt;/span&gt;&lt;span&gt;，还是&lt;/span&gt;&lt;span style="color:#008080;"&gt;echo&lt;/span&gt;&lt;span&gt;  a;、&lt;/span&gt;&lt;span style="color:#000080;"&gt;Response&lt;/span&gt;.&lt;span style="color:#000080;"&gt;Write&lt;/span&gt;&lt;span&gt;(a)，都能显示它的十进制版本。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;将寄存器中的数H:L转化为十进制数显示在屏幕上的过程可归约为以下迭代过程：&lt;br /&gt;1、该十进制数的末位是H:L除以10的余数&lt;br /&gt;2、该十进制数的其余各位是H:L除以10的商形成的新数，应用第1-2条所述规则的结果，直到新数为0&lt;br /&gt;但是仔细想想却不是这样简单的。div指令规定：保存在DX:AX中的32位整数除以16位整数时，商将保存在AX余数在DX。因此如果除数为10，被除数大于9FFFF的话，将发生除法溢出。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;研究发现，上面的迭代过程可简化为：&lt;br /&gt;[结论]&lt;br /&gt;1、设x为32位整数，其高位为H除以10的模，低位为L&lt;br /&gt;2、该十进制数的末位是x除以10的余数&lt;br /&gt;3、该十进制数的其余各位是新数y，应用第1-4条所述规则的结果，直到y为0&lt;br /&gt;4、新数y为32位整数，高位为H除以10的商，低位为x除以10的商&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;[证明]&lt;br /&gt;以下符号中，\为整除，Mod为求模，^为求幂。设H、L为16位整数，S=16^4=2^16。&lt;br /&gt;则H:L=H*S+L，x Mod y = x - (x \ y) * y。&lt;br /&gt;还可推知：x \ y = (x - x Mod y) / y。&lt;br /&gt;性质1：a \ b \ c = a \ c \ b = a \ (b * c)，即整除具有交换率和结合率，但没有分配率。需要分配时，应转换为除法。&lt;br /&gt;性质2：(a + b) Mod c = ((a Mod c) + (b Mod c)) Mod c，证明略。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;结论2的证明：(H * S + L) Mod 10 = ((H Mod 10) * S + L) Mod 10&lt;br /&gt;((H Mod 10) * S + L) Mod 10&lt;br /&gt;= ((H - (H \ 10) * 10) * S + L) Mod 10&lt;br /&gt;= ((H * S + L) Mod 10 - ((H \ 10) * 10 * S) Mod 10) Mod 10&lt;br /&gt;∵(H \ 10) * 10 * S) Mod 10&lt;br /&gt;= (H \ 10) * S * 10) Mod 10&lt;br /&gt;= 0&lt;br /&gt;∴原式&lt;br /&gt;= ((H * S + L) Mod 10) Mod 10&lt;br /&gt;= (H * S + L) Mod 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;结论4的证明：(H * S + L) \ 10 = ((H Mod 10) * S + L) \ 10&lt;br /&gt;(H * S + L) \ 10&lt;br /&gt;重新分配高、低16位&lt;br /&gt;= S * ( _&lt;br /&gt;((H * S + L) \ 10) \ S _&lt;br /&gt;) + ( _&lt;br /&gt;((H * S + L) \ 10) Mod S _&lt;br /&gt;)&lt;br /&gt;其中高位 ((H * S + L) \ 10) \ S&lt;br /&gt;= (H * S + L) \ S \ 10&lt;br /&gt;= H \ 10&lt;br /&gt;其中低位 ((H * S + L) \ 10) Mod S&lt;br /&gt;= (H * S + L) \ 10 - (H * S + L) \ 10 \ S * S&lt;br /&gt;= (H * S + L) \ 10 - H \ 10 * S&lt;br /&gt;= (H * S + L - (H * S + L) Mod 10) / 10 - (H - H Mod 10) / 10 * S&lt;br /&gt;= (L - (H * S + L) Mod 10 + (H Mod 10) * S) / 10&lt;br /&gt;∵(H * S + L) Mod 10 = ((H Mod 10) * S + L) Mod 10 ( 结论2 )&lt;br /&gt;∴原式&lt;br /&gt;= ((H Mod 10) * S + L - ((H Mod 10) * S + L) Mod 10) / 10&lt;br /&gt;= ((H Mod 10) * S + L) \ 10&lt;br /&gt;证毕。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;; 显示DX:AX中的有符号长整数,&lt;br /&gt;; 转换后的字符串保存在[BX]中&lt;br /&gt;; [tc]天驰2006.2......&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color:#008080;"&gt;;显示整数&lt;/span&gt;&lt;br /&gt;TCPRINTCLNG &lt;span style="color:#0000ff;"&gt;PROC NEAR&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;PUSH&lt;/span&gt; AX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;PUSH&lt;/span&gt; BX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;PUSH&lt;/span&gt; CX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;PUSH&lt;/span&gt; DX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;PUSH&lt;/span&gt; SI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;XOR&lt;/span&gt; CX,CX &lt;span style="color:#008080;"&gt;; CX是计数器&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; SI,10D&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; DI,BX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ADD&lt;/span&gt; DI,11D&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; BX,DX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;OR&lt;/span&gt; BX,BX&lt;br /&gt;&lt;span style="color:#008080;"&gt;; 测负数&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;JNS&lt;/span&gt; TCPRINTLNGLABELCOVERTPRE&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;NEG&lt;/span&gt; BX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;NEG&lt;/span&gt; AX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;SBB&lt;/span&gt; BX,+00&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;CALL&lt;/span&gt; TCPRINTLNGLABELCOVERT&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;DEC&lt;/span&gt; DI&lt;br /&gt;&lt;span style="color:#008080;"&gt;; 加一个'-'&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;BYTE PTR&lt;/span&gt; [DI],2DH&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;INC&lt;/span&gt; CX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;JMP&lt;/span&gt; TCPRINTLNGLABELOUT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;TCPRINTLNGLABELCOVERTPRE:&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;CALL&lt;/span&gt; TCPRINTLNGLABELCOVERT&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;JMP&lt;/span&gt; TCPRINTLNGLABELOUT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;TCPRINTLNGLABELCOVERT: &lt;span style="color:#008080;"&gt;; 转换&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;XOR&lt;/span&gt; DX,DX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;XCHG&lt;/span&gt; BX,AX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;DIV&lt;/span&gt; SI &lt;span style="color:#008080;"&gt;; 高位除法&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;XCHG&lt;/span&gt; BX,AX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;DIV&lt;/span&gt; SI &lt;span style="color:#008080;"&gt;; 低位除法&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ADD&lt;/span&gt; DL,30H&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;CMP&lt;/span&gt; DL,3AH &lt;span style="color:#008080;"&gt;; 个位比'9'大&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;JB&lt;/span&gt; TCPRINTLNGLABELHEX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;ADD&lt;/span&gt; DL,07H &lt;span style="color:#008080;"&gt;; 就变成'A'&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;TCPRINTLNGLABELHEX:&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;INC&lt;/span&gt; CX &lt;span style="color:#008080;"&gt;; 得到位数&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;; 保存&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;DEC&lt;/span&gt; DI&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; BYTE PTR [DI],DL&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; DX,AX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;OR&lt;/span&gt; DX,BX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;JNZ&lt;/span&gt; TCPRINTLNGLABELCOVERTRET&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color:#008080;"&gt;; 正式显示，CX是个数&lt;/span&gt;&lt;br /&gt;TCPRINTLNGLABELOUT:&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; DL,[DI]&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;INC&lt;/span&gt; DI&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; AH,02H&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;INT&lt;/span&gt; 21H&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;LOOP&lt;/span&gt; TCPRINTLNGLABELOUT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; DL,13D &lt;span style="color:#008080;"&gt;;回车1个&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; AX,0200H&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;INT&lt;/span&gt; 21H&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; DL,10D&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;MOV&lt;/span&gt; AX,0200H&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;INT&lt;/span&gt; 21H&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;POP&lt;/span&gt; SI&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;POP&lt;/span&gt; DX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;POP&lt;/span&gt; CX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;POP&lt;/span&gt; BX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;POP&lt;/span&gt; AX&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;RET&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;TCPRINTCLNG &lt;span style="color:#0000ff;"&gt;ENDP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;这么冗长的代码本来不想贴的，真的。但我为了这个问题思考了一个晚上，不能白费啊。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;这种六七十年代就可能被发明的东西，为什么一直没有人记录下来呢？害得我自己伤脑细胞。 &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6502682293701136126-6113871472031387918?l=tctianchi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tctianchi.blogspot.com/feeds/6113871472031387918/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6502682293701136126&amp;postID=6113871472031387918&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/6113871472031387918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6502682293701136126/posts/default/6113871472031387918'/><link rel='alternate' type='text/html' href='http://tctianchi.blogspot.com/2006/02/blog-post.html' title='怎样显示一个整数'/><author><name>[tc]天驰</name><uri>http://www.blogger.com/profile/18238405574368863672</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://i170.photobucket.com/albums/u252/tctianchi/tc.jpg'/></author><thr:total>0</thr:total></entry></feed>
