﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-soNiliCs-文章分类-Debugging</title><link>http://www.cppblog.com/sonilics/category/6298.html</link><description>Game! Game! Game!</description><language>zh-cn</language><lastBuildDate>Sun, 09 Jan 2011 20:45:55 GMT</lastBuildDate><pubDate>Sun, 09 Jan 2011 20:45:55 GMT</pubDate><ttl>60</ttl><item><title>崩溃分析用到的一些汇编语言技巧</title><link>http://www.cppblog.com/sonilics/articles/138133.html</link><dc:creator>sonilics</dc:creator><author>sonilics</author><pubDate>Fri, 07 Jan 2011 12:19:00 GMT</pubDate><guid>http://www.cppblog.com/sonilics/articles/138133.html</guid><wfw:comment>http://www.cppblog.com/sonilics/comments/138133.html</wfw:comment><comments>http://www.cppblog.com/sonilics/articles/138133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sonilics/comments/commentRss/138133.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sonilics/services/trackbacks/138133.html</trackback:ping><description><![CDATA[<h2 style="font-size: 24pt; font-family: courier new;"><span style="color: red;"></span><span style="font-family: 宋体;">常用寄存器 </span><br></h2>
<p style="font-family: courier new;">
<table style="width: 726px; height: 326px;" border="1">
    <tbody>
        <tr id="" class="" align="left" valign="middle">
            <td style="vertical-align: top;">寄存器<br></td>
            <td style="vertical-align: top;">名称<br></td>
            <td style="vertical-align: top;">常见用途（未完）<br></td>
        </tr>
        <tr>
            <td style="color: #ff0000;">eax<br></td>
            <td>累加器（Accumulator）</td>
            <td style="vertical-align: top;">函数返回值
            <br></td>
        </tr>
        <tr>
            <td style="color: #ff0000;">ebx</td>
            <td>基址寄存器（Base）</td>
            <td style="vertical-align: top;">可作为存储指针来使用
            <br></td>
        </tr>
        <tr>
            <td style="vertical-align: top; color: #ff0000;">ecx<br></td>
            <td style="vertical-align: top;">计数器（Counter）<br></td>
            <td style="vertical-align: top;">在循环和字符串操作时，用来控制循环次数<br> __thiscall中传递this指针</td>
        </tr>
        <tr>
            <td style="vertical-align: top; color: #ff0000;">edx<br></td>
            <td style="vertical-align: top;">数据寄存器（Data）<br></td>
            <td style="vertical-align: top;"><br></td>
        </tr>
        <tr>
            <td style="vertical-align: top; color: #ff0000;">esp<br></td>
            <td style="vertical-align: top;">堆栈指针寄存器（Stack）<br></td>
            <td style="vertical-align: top;"><br></td>
        </tr>
        <tr>
            <td style="vertical-align: top; color: #ff0000;">ebp<br></td>
            <td style="vertical-align: top;">基地址指针寄存器（Base）<br></td>
            <td style="vertical-align: top;"><br></td>
        </tr>
        <tr>
            <td style="vertical-align: top; color: #ff0000;">esi<br></td>
            <td style="vertical-align: top;">源地址寄存器（Source Index）<br></td>
            <td style="vertical-align: top;"><br></td>
        </tr>
        <tr>
            <td style="vertical-align: top; color: #ff0000;">edi<br></td>
            <td style="vertical-align: top;">目的地址寄存器（Destination）<br></td>
            <td style="vertical-align: top;"><br></td>
        </tr>
    </tbody>
</table>
</p>
<h2 style="font-family: courier new;"><br><span style="font-size: 24pt; font-family: 宋体;">常用汇编指令</span></h2>
<p style="font-family: courier new;">
<table style="width: 1156px; height: 342px;" border="1">
    <tbody>
        <tr>
            <td style="color: red;" align="left" valign="center" width="50">push </td>
            <td>把一个32位的操作数压入堆栈，这个操作会导致<span style="color: #000000;">esp</span>减4.</td>
        </tr>
        <tr>
            <td style="color: red;">pop</td>
            <td align="left" valign="center">与push相反，esp加4，一个数据出栈</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">call</td>
            <td style="vertical-align: top;">调用函数。将下一条指令的地址压栈，然后跳转到所调用函数的开始处，本质相当于push+jump</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">ret</td>
            <td style="vertical-align: top;">与call相对应，跳转到栈顶数据所指的地址，本质相当于pop+jump。对于_cdecl 调用的函数，通常会在ret之后进行exp-[n]，用于清理调用参数堆栈</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">xor</td>
            <td style="vertical-align: top;">异或，常用于清零操作，例如： xor eax eax</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">lea</td>
            <td style="vertical-align: top;">取得地址（第二个参数）后放入前面的寄存器中。</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">stosw </td>
            <td style="vertical-align: top;">将eax中的数据传送给edi，之后edi+4。常与rep一起使用，用于初始化内存段</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">rep</td>
            <td style="vertical-align: top;">当eax&gt;0时，重复后面的指令</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">jp,jl,jge</td>
            <td style="vertical-align: top;">根据eax中值与0的关系跳转</td>
        </tr>
        <tr>
            <td style="color: red; vertical-align: top;">cmp</td>
            <td style="vertical-align: top;">比较指令，将结果放入eax中，往往是jp，jl，jge之类跳转指令的执行条件</td>
        </tr>
    </tbody>
</table>
</p>
<h2 style="font-family: courier new;"><br><span style="font-size: 24pt; font-family: 宋体;">函数调用规则</span></h2>
<p style="font-family: courier new;">
<table style="width: 1156px; height: 5px;" border="1">
    <tbody>
        <tr>
            <td style="vertical-align: top;">调用方式<br></td>
            <td style="vertical-align: top;">简要说明<br></td>
            <td style="vertical-align: top;">堆栈清理</td>
            <td style="vertical-align: top;">参数传递规则<br></td>
        </tr>
        <tr>
            <td style="color: #0010ff; vertical-align: top;" width="100">_cdecl</td>
            <td style="vertical-align: top;">C 编译器的默认调用规则</td>
            <td style="vertical-align: top;">Caller<br></td>
            <td style="vertical-align: top;">从右到左</td>
        </tr>
        <tr>
            <td style="color: #0010ff; vertical-align: top;">_stdcall</td>
            <td style="vertical-align: top;">又称为WINAPI</td>
            <td style="vertical-align: top;">Callee<br></td>
            <td style="vertical-align: top;">
            从右到左</td>
        </tr>
        <tr>
            <td style="color: #0010ff; vertical-align: top;" align="left" valign="middle">__thiscall</td>
            <td style="vertical-align: top;" align="left" valign="middle">C++成员函数调用方式<br></td>
            <td style="vertical-align: top;" align="left" valign="middle">Callee</td>
            <td style="vertical-align: top;" align="left" valign="middle">&nbsp;this放入ecx，其他从右到左</td>
        </tr>
        <tr>
            <td style="vertical-align: top; color: #0010ff;">__fastcall<br></td>
            <td style="vertical-align: top;"><br></td>
            <td style="vertical-align: top;">Callee<br></td>
            <td style="vertical-align: top;">前两个等于或者小于DWORD大小的参数放入ecx和edx,其他参数从右到左<br></td>
        </tr>
    </tbody>
</table>
<br>&nbsp;_cdecl调用通常的asm代码： <br><br>被调用方:<br>1.保存ebp。ebp总是用来保存这个函数执行之前的esp值。执行完毕之后，我们用ebp回复esp；同时，调用此函数的上层函数也用ebp做同样的事情。<br>2.保存esp到ebp中。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">;保存ebp，并把esp放入ebp中，此时ebp与esp都为这次函数调用的栈顶<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">push&nbsp;ebp<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">mov&nbsp;&nbsp;ebp,esp</span></div>
<p style="font-family: courier new;"><br>3.在堆栈中预留一个区域用于保存局部变量。方法是将esp减少一个数值，这样就等于压入了一堆变量。要恢复的时候直接把esp回复成ebp保存的数据就可以了。<br>4.保存ebx、esi、edi到堆栈中，函数调用完成后恢复。</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">;把esp往下移动一个范围，等于在堆栈中预留一片新的空间来保存局部变量<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">sub&nbsp;&nbsp;esp,010h<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">push&nbsp;ebx<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">push&nbsp;esi<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">push&nbsp;edi</span></div>
<p style="font-family: courier new;"><br>5.（debug版）把局部变量全部初始化为0xcccccccch.<br></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">;将保存局部变量的区域全部初始化为0xcccccccch<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">lea&nbsp;&nbsp;edi,[ebp</span><span style="color: #000000;">-</span><span style="color: #000000;">010h]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">mov&nbsp;&nbsp;ecx,33h<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">mov&nbsp;&nbsp;eax,0xcccccccch<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">rep&nbsp;&nbsp;stos&nbsp;dword&nbsp;ptr&nbsp;[edi]</span></div>
<p style="font-family: courier new;"><br>6.然后执行函数的具体逻辑。传入参数的获取为：ebp+4为函数的返回地址；ebp+8为第一个参数，ebp+12为第二个参数，以此类推。<br><br>7.回复ebx、esi、edi、esp、ebp，最后返回。如果有返回值，在返回之前将保存在eax中，供调用方式用。<br></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">pop&nbsp;&nbsp;edi&nbsp;;恢复edi、esi、ebx<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">pop&nbsp;&nbsp;esi<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">pop&nbsp;&nbsp;ebx<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">mov&nbsp;&nbsp;esp,&nbsp;ebp&nbsp;;恢复原来的ebp和esp<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">pop&nbsp;&nbsp;ebp<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">ret</span></div>
<p style="font-family: courier new;"><br>调用方：<br></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">mov&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[b]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">push&nbsp;eax<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">move&nbsp;ecx,dword&nbsp;ptr&nbsp;[a]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">push&nbsp;ecx<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">call&nbsp;myfunction<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">add&nbsp; esp,</span><span style="color: #000000;">8</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;回复堆栈</span></div>
<p style="font-family: courier new;">&nbsp;</p>
<h2 style="font-size: 24pt; font-family: 宋体;">常见的基础代码结构</h2>
<h2 style="font-family: courier new;"><span style="font-size: 14pt;">for循环<br></span></h2>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i&nbsp;)<br>0040B93E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br>0040B945&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">30h&nbsp;(40B950h)&nbsp;<br>0040B947&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[i]&nbsp;<br>0040B94A&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;<br>0040B94D&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],eax&nbsp;<br>0040B950&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],14h&nbsp;<br>0040B954&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">38h&nbsp;(40B958h)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>0040B956&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">27h&nbsp;(40B947h)&nbsp;</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new;">可以看到主循环主要由这么几条指令来实现：mov进行初始化；jmp跳过修改循环变量的代码；cmp实现跳转判断；jge根据条件跳转。用jmp回到修改循环变量的代码进行下一次循环。大体结构如下：</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">循环变量</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">,</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">初始值</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;给循环变量赋值<br>&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;跳到第一次循环处<br>A:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(改动循环变量)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;修改循环变量<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br>B：&nbsp; cmp&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">循环变量</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">,</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">限制变量</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp; ;检查循环变量<br>&nbsp;&nbsp;&nbsp;&nbsp;jge&nbsp;&nbsp;跳出循环<br>&nbsp;&nbsp;&nbsp;&nbsp;(循环体)<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br>&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;跳回修改循环变量</span></div>
<h2 style="font-family: courier new;"><br><span style="font-size: 14pt;">do循环</span></h2>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>0040B93E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i;<br>0040B945&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[i]&nbsp;<br>0040B948&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;<br>0040B94B&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],eax&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">10</span><span style="color: #000000;">);<br>0040B94E&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],0Ah&nbsp;<br>0040B952&nbsp;&nbsp;jl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">25h&nbsp;(40B945h)&nbsp;</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new;">上面的do循环就是用一个简单的条件比较指令跳转回去：</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">cmp&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">循环变量</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">限制变量</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>jl&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">循环开始</span><span style="color: #000000;">&gt;</span></div>
<h2 style="font-family: courier new;"><br><span style="font-size: 14pt;">while循环</span></h2>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>0040B93E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>0040B945&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],0Ah&nbsp;<br>0040B949&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">36h&nbsp;(40B956h)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i;<br>0040B94B&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[i]&nbsp;<br>0040B94E&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;<br>0040B951&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],eax&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>0040B954&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">25h&nbsp;(40B945h)&nbsp;</span></div>
<br style="font-family: courier new;"><span style="font-family: courier new;">while要复杂一些，因为wile除了开始的时候判断循环条件之外，后面还要有一条无条件跳转指令：</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">A:&nbsp;&nbsp;cmp&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">循环变量</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">,</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">限制变量</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;jge&nbsp;&nbsp;B<br>&nbsp;&nbsp;&nbsp;&nbsp;(循环体)<br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br>&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;A&nbsp;<br>B:&nbsp;&nbsp;(跳出循环)</span></div>
<h2 style="font-family: courier new;"><br><span style="font-size: 14pt;">if-else判断分支</span></h2>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>0040B93E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>0040B945&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;)<br>0040B94C&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],0Ah&nbsp;<br>0040B950&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">3Bh&nbsp;(40B95Bh)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;<br>0040B952&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],0Ah&nbsp;<br>0040B959&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">51h&nbsp;(40B971h)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;)<br>0040B95B&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],14h&nbsp;<br>0040B95F&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">4Ah&nbsp;(40B96Ah)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">;<br>0040B961&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],14h&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>0040B968&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">51h&nbsp;(40B971h)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">;<br>0040B96A&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],1Eh&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>0040B971&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,eax&nbsp;</span></div>
<span style="font-family: courier new;">if 判断都是使用cmp加上条件跳转指令。</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">cmp&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">条件</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">jle&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">下一个分支</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<span style="font-family: courier new;">所以开始的反汇编为：</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;）<br>0040B94C&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],0Ah&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；判断点<br>0040B950&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">3Bh&nbsp;(40B95Bh)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；跳转到下一个else&nbsp;</span><span style="color: #0000ff;">if</span></div>
<span style="font-family: courier new;">else if和else的特点是，在开始的地方都有一条无条件跳转指令，跳转到判断结束处，阻止前面的分支执行结束后，直接进入这个分支的可能，这个分支执行的唯一条件为前面的判断不满足。</span><br style="font-family: courier new;"><span style="font-family: courier new;">else则在jmp之后直接执行操作，而else if则开始重复if之后的操作，用cmp比较，然后用条件质量进行跳转。</span><br style="font-family: courier new;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">0040B959&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">51h&nbsp;(40B971h)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；跳转到判断块外<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;)<br>0040B95B&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],14h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>0040B95F&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">4Ah&nbsp;(40B96Ah)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；比较，条件跳转，目标为下一个分支<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">;<br>0040B961&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],14h&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<h2 style="font-family: courier new;"><br><span style="font-size: 14pt;">switch-case 判断分支</span></h2>
<p style="font-family: courier new;">switch的特点是有多个判断。因为switch显然不会判断大于小于，所以都是je，分别跳转到每个case处，最有一个是无条件跳转，直接跳到default处。<br>对于break，会增加一个无条件跳转语句，跳转至结尾</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B93E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[i],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B945&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">&nbsp;(i)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B94C&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[i]&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B94F&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp</span><span style="color: #000000;">-</span><span style="color: #000000;">0DCh],eax&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B955&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp</span><span style="color: #000000;">-</span><span style="color: #000000;">0DCh],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B95C&nbsp;&nbsp;je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">49h&nbsp;(40B969h)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；判断case&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B95E&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp</span><span style="color: #000000;">-</span><span style="color: #000000;">0DCh],</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B965&nbsp;&nbsp;je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">52h&nbsp;(40B972h)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；判断case&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B967&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">59h&nbsp;(40B979h)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；跳转到default<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_460_702_Open_Image" align="top"><img src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" id="Codehighlighter1_460_702_Closed_Image" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_460_702_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_460_702_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">0040B969&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;；跳转到结束<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">0040B970&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmain</span><span style="color: #000000;">+</span><span style="color: #000000;">60h&nbsp;(40B980h)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">0040B972&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">0040B979&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[j],</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">0040B980&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,eax&nbsp;</span></div>
<span style="font-family: courier new;">所以如果看到有多个连续的
</span>
<div style="border: 3px solid #c0c0c0; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; color: #ff0000; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">cmp<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">je</span></div>
<p style="font-family: courier new;">标志着可能是swith语句<br></p>
<h2 style="font-family: courier new;"><br><span style="font-size: 14pt;">访问结构体数组成员<br></span></h2>
<p style="font-family: courier new;">对于以下代码：<br></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;A&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_10_36_Open_Image" align="top"><img src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" id="Codehighlighter1_10_36_Closed_Image" align="top"></span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_10_36_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_10_36_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;b;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;c;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;wmain(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_77_175_Open_Image" align="top"><img src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" id="Codehighlighter1_77_175_Closed_Image" align="top"></span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_77_175_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_77_175_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;ar[</span><span style="color: #000000;">3</span><span style="color: #000000;">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">3</span><span style="color: #000000;">;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_113_161_Open_Image" align="top"><img src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" id="Codehighlighter1_113_161_Closed_Image" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_113_161_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_113_161_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar[i].a&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar[i].b&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar[i].c&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div>
<p style="font-family: courier new;">for循环中所对应的汇编为<br></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; font-family: courier new;"><span style="color: #000000;">&nbsp;&nbsp;ar[i].a&nbsp;= 0;<br>0040B956&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [i]&nbsp;&nbsp;；访问第i个数据<br>0040B959&nbsp; imul&nbsp;&nbsp;&nbsp;&nbsp; eax,eax,0Ch &nbsp;&nbsp;&nbsp;；0ch为结构体的大小，这里得到访问第i个机构体的地址偏移<br>0040B95C&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr ar[eax],0 &nbsp;；取得第i个结构体的第一个元素地址<br>&nbsp;&nbsp;ar[i].b&nbsp;= 0;<br>0040B964&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [i] <br>0040B967&nbsp; imul&nbsp;&nbsp;&nbsp;&nbsp; eax,eax,0Ch <br>0040B96A&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+eax-24h],0 <br>&nbsp;&nbsp;ar[i].c&nbsp;= 0;<br>0040B972&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [i] <br>0040B975&nbsp; imul&nbsp;&nbsp;&nbsp;&nbsp; eax,eax,0Ch <br>0040B978&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+eax-20h],0 </span></div>
<p style="font-family: courier new;">对于结构体数组的访问有个很明显的特征：使用imul取得某个数组元素的地址偏移,然后在加上所要访问结构体成员的地址偏移。同时，大多数情况下结构的的大小都是在编译期决定的，imul的最后一个参数会是个常量。</p>
<br>
<h2 style="font-size: 24pt; font-family: courier new;"><span style="font-family: 宋体;">阅读汇编代码的一些技巧</span><br> </h2>
1.将指令分类：<br>
<p style="font-family: courier new;">&nbsp;&nbsp;&nbsp; 首先F（function）类指令：是函数调用相关代码，这些代码用于函数或者作为一个函数数被调用。几乎凡是堆栈操作（备份集陈启或者压入参数）可全部归入此类。此外还有call指令、堆栈恢复。<br>&nbsp;&nbsp;&nbsp; 然后C（control）类指令&nbsp;&nbsp;&nbsp; ：设计判断和跳转指令，以及对循环变量操作的指令。这些代码用于循环、判断语句。<br>&nbsp;&nbsp;&nbsp; 剩余D（data）类指令：数据处理指令，应该不包含函数调用，多半不含有堆操作，也不会含有跳转。<br>2.翻译D类指令。<br>3.表达式的合并与控制流程的结合。<br></p>
<p style="font-family: courier new;"><br></p>
<p style="font-family: courier new;"></p>
<span style="font-size: 24pt; font-family: courier new;"><span style="font-size: 18pt;"><span style="font-size: 14pt;"><span></span></span></span></span>
<p style="font-family: courier new; font-weight: bold;"><span style="font-size: 24pt;"><span style="font-size: 18pt;"><span style="font-size: 14pt;"><span><span>
<p>Reference：</p>
</span></span></span></span></span></p>
<span style="font-size: 24pt; font-family: courier new;"><span style="font-size: 18pt;"><span style="font-size: 14pt;"><span>
<p><a title="学 win32 汇编[29] - 串指令: movs*、cmps*、scas*、lods*、rep、repe、repne 等" href="http://www.cnblogs.com/del/archive/2010/04/17/1714479.html">学 Win32 汇编[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等</a></p>
<p>《天书夜读-从汇编语言到Windows内核编程》</p>
</span>
<p>&nbsp;</p>
</span>
<p>&nbsp;</p>
</span>
<p>&nbsp;</p>
</span>
<p style="font-family: courier new;"><br></p><img src ="http://www.cppblog.com/sonilics/aggbug/138133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sonilics/" target="_blank">sonilics</a> 2011-01-07 20:19 <a href="http://www.cppblog.com/sonilics/articles/138133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架设符号服务器</title><link>http://www.cppblog.com/sonilics/articles/99750.html</link><dc:creator>sonilics</dc:creator><author>sonilics</author><pubDate>Thu, 29 Oct 2009 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/sonilics/articles/99750.html</guid><wfw:comment>http://www.cppblog.com/sonilics/comments/99750.html</wfw:comment><comments>http://www.cppblog.com/sonilics/articles/99750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sonilics/comments/commentRss/99750.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sonilics/services/trackbacks/99750.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=" utf-8="">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 12">
<meta name="Originator" content="Microsoft Word 12">
<link rel="File-List" href="file:///e:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml">
<link rel="themeData" href="file:///e:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
<link rel="colorSchemeMapping" href="file:///e:%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><!--[if gte mso 9]><xml>
Normal
0
false
false
false
EN-US
ZH-CN
X-NONE
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><xml>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin-top:0in;
margin-right:0in;
margin-bottom:10.0pt;
margin-left:0in;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
a:link, span.MsoHyperlink
{mso-style-noshow:yes;
mso-style-priority:99;
color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:purple;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
p
{mso-style-priority:99;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman","serif";
mso-fareast-font-family:"Times New Roman";}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
{mso-style-type:export-only;
margin-bottom:10.0pt;
line-height:115%;}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0in;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]-->
<p>1.下载并安装最新的Debugging
Tools for Windows。<br>
2.在系统Path环境变量中添加Debugging
Tools for Windows的安装路径。<br>
3.在系统环境变量中创建_NT_SYMBOL_PATH项并设置为SRV*E:\SymbolServer
\OSSymbols*http://msdl.microsoft.com/download/symbols;E:\SymbolServer\MySymbols;C:\WINNT\Symbsols<br>
其中,SRV是告诉调试器加载symsrv.dll并将后面的执作为参数,E:\SymbolServer\OSSymbols是我为操作系统符号设置的 目录,http://msdl.microsoft.com/download/symbols告诉调试器如果没有找到所需的符号就到这个地址去下 载,E:\SymbolServer\MySymbols是我自己程序的符号目录,C:\WINNT\Symbsols中有net2005的C- RunTime
Library和MFC的PDB文件. <br>
<br>
我是使用得本机作为符号服务器,当然也可以使用专门架设一台服务器作为符号服务器,只要将_NT_SYMBOL_PATH中的路径设置为远程路径就可以.注意你要对符号服务器有读写权限.&nbsp;
<br>
<br>
See also:<br>
<a href="http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx#a">Debugging
Tools and Symbols: Getting Started</a> <br>
<a href="http://www.cnblogs.com/shanzy/articles/525226.html" mce_href="http://www.cnblogs.com/shanzy/articles/525226.html">MSDN2001中关于symbol文件的相关介绍和MSDN中Matt
Pietrek的文章------最好还是下载DDK</a><br>
<a href="http://vicchina.51.net/show_article.php?id=62">使用
Minidumps 和
Visual Studio .NET 进行崩溃后调试</a><br>
<a href="http://support.microsoft.com/dllhelp/">Debug Tips at
codeproject</a> <br>
<a href="http://blog.csdn.net/oeichenwei/archive/2009/06/04/4243463.aspx">简单建立自己的符号服务器(symstore使用说明)</a>
<br>
<a href="http://support.microsoft.com/dllhelp/">MS DLL Help Database</a><br>
<!--[if !supportLineBreakNewLine]--><br>
<!--[endif]--></p>
<br> <img src ="http://www.cppblog.com/sonilics/aggbug/99750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sonilics/" target="_blank">sonilics</a> 2009-10-29 16:25 <a href="http://www.cppblog.com/sonilics/articles/99750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>