东方风云 發表於 2021-10-4 11:52:42

汇编语言:x86汇编指令大全及其注意事项

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>Part 1:instruction</li><li>Part 2</li><ul class="second_class_ul"><li>2.1 (逻辑)运算、移位等常用指令</li><li>2.1 (逻辑)运算、移位等常用指令</li><li>2.2 循环移位指令</li><li>2.3 数据串操作指令</li><li>2.4 逻辑运算指令</li><li>2.5 基于大小关系的跳转指令</li><li>2.6 基于单标志位的转移指令</li></ul></ul></div><p class="maodian"></p><h2>Part 1:instruction</h2>
<p>积少成多,持续更新。(这将会是一个极其漫长的过程)<br />
表格中各条指令的顺序根据笔者所认为的重要或常用程度进行排序,仅供参考。</p>
<p class="maodian"></p><h2>Part 2</h2>
<p>本表格中所涉及的F是指状态寄存器,CF指进位标志位,其它以此类推。</p>
<p class="maodian"></p><p class="maodian"></p><h3>2.1 (逻辑)运算、移位等常用指令</h3>
<p>这一部分记录汇编语言程序设计当中使用频率最高的一部分指令。</p>
<h3>2.1 (逻辑)运算、移位等常用指令</h3>
<p>这一部分记录汇编语言程序设计当中使用频率最高的一部分指令。</p>
<table>
    <thead>
      <tr>
            <th>指令</th>
            <th>作用</th>
            <th align="left">注意事项</th>
            <th>示例</th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>mov dest, src</td>
            <td>传送指令</td>
            <td align="left">1.dest和src不能同时为存储器操作数<br />
            2.CS不能作为dest<br />
            3.段寄存器之间不能互相传送<br />
            4.立即数不能送入段寄存器</td>
            <td>mov ax,word ptr</td>
      </tr>
      <tr>
            <td>add dest,src</td>
            <td>加法指令</td>
            <td align="left">dest,src不能同时为存储器操作数或段寄存器<br />
            </td>
            <td>add ax,cx</td>
      </tr>
      <tr>
            <td>adc dest,src</td>
            <td>带进位加法指令</td>
            <td align="left">dest=dest+src+CF,常用于多字节加法</td>
            <td></td>
      </tr>
      <tr>
            <td>inc dest</td>
            <td>加一指令</td>
            <td align="left">1.此操作不影响CF的状态</td>
            <td>inc byte ptr</td>
      </tr>
      <tr>
            <td>sub dest,src</td>
            <td>减法指令</td>
            <td align="left">1.dest,src的要求与add相同<br />
            2.触发OF:异号相减且结果的符号为与被减数不同</td>
            <td>sub ax,cx</td>
      </tr>
      <tr>
            <td>sbb dest,src</td>
            <td>带进位减法</td>
            <td align="left">常用于多字节减法</td>
            <td></td>
      </tr>
      <tr>
            <td>dec dest</td>
            <td>减一指令</td>
            <td align="left">不影响CF的状态,但其他几个标志位都会受到影响</td>
            <td>dec ax</td>
      </tr>
      <tr>
            <td>mul dest</td>
            <td>无符号乘法指</td>
            <td align="left">1.dest为字节数据,则与AL相乘,结果放入AX<br />
            2.dest为字数据,与AX相乘结果低16位放入AX,高16位放入DX<br />
            3.dest不能是立即数</td>
            <td>mul ax</td>
      </tr>
      <tr>
            <td>imul dest</td>
            <td>有符号乘法</td>
            <td align="left">细节与mul完全相同,对最高位的解释不同</td>
            <td>imul ax</td>
      </tr>
      <tr>
            <td>div dest</td>
            <td>无符号除法</td>
            <td align="left">1.dest为字节数据,用AX除以dest,商放在AL,余数放在AH<br />
            2.dest为字数据,用低16位为AX,高16位为DX的双字数据除以dest,商放在AX,余数放在DX</td>
            <td></td>
      </tr>
      <tr>
            <td>idiv dest</td>
            <td>带符号除法</td>
            <td align="left">与无符号完全相同。除法溢出时结果无效</td>
            <td>idiv ax</td>
      </tr>
      <tr>
            <td>cbw</td>
            <td>扩展AL为AX字数据</td>
            <td align="left">1.仅用于扩展带符号数,无符号直接清零即可<br />
            2.不带操作数</td>
            <td>cbw</td>
      </tr>
      <tr>
            <td>cwd</td>
            <td>扩展AX字为DX,AX双字数据</td>
            <td align="left">要求与cbw相同</td>
            <td>cwd</td>
      </tr>
      <tr>
            <td>seg</td>
            <td>取标号或变量的段地址</td>
            <td align="left"></td>
            <td>mov di,seg label</td>
      </tr>
      <tr>
            <td>lea</td>
            <td>取偏移地址</td>
            <td align="left">1.与offset作用类似<br />
            2.load efficient address的简写</td>
            <td>lea ax,label</td>
      </tr>
      <tr>
            <td>offset</td>
            <td>取偏移地址</td>
            <td align="left">1.作用与lea相同<br />
            2.速度比lea快</td>
            <td>mov ax,offset label</td>
      </tr>
      <tr>
            <td>org</td>
            <td>设定程序段起始地址(偏移)</td>
            <td align="left">1.是origin的缩写<br />
            2.若无org默认程序从cs:0开始存放指令代码<br />
            3.两个org指令之间空余的空间用0填充</td>
            <td>org offsetVal</td>
      </tr>
      <tr>
            <td>xlat</td>
            <td>转换表指令</td>
            <td align="left">1.BX存放表的首地址,AL存放当前表中元素的偏移量<br />
            2.不影响F的状态</td>
            <td>xlat ;无需操作数</td>
      </tr>
    </tbody>
</table>
<p class="maodian"></p><h3>2.2 循环移位指令</h3>
<p>循环移位指令非常容易混淆,但是却十分重要,因此需要牢牢记住并时常查阅此表。</p>
<table>
    <thead>
      <tr>
            <th>指令</th>
            <th>作用</th>
            <th align="left">注意事项</th>
            <th>示例</th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>SHL</td>
            <td>逻辑左移指令</td>
            <td align="left">1.最高位进入CF中<br />
            2.最低位直接用0填充</td>
            <td>SHL AH,1</td>
      </tr>
      <tr>
            <td>SHR</td>
            <td>逻辑右移指令</td>
            <td align="left">1.最低位进入CF中<br />
            2.最高位直接用0填充</td>
            <td>SHR BX,1</td>
      </tr>
      <tr>
            <td>SAL</td>
            <td>算术左移指令</td>
            <td align="left">行为与SHL没有差别</td>
            <td>SAL BL,CL</td>
      </tr>
      <tr>
            <td>SAR</td>
            <td>算术右移指令</td>
            <td align="left">1.最低位进入到CF中<br />
            2.最高位右移后填充最高位(即用最高位填充最高位)</td>
            <td>SAR CL,BX</td>
      </tr>
      <tr>
            <td>ROL</td>
            <td>循环左移指令</td>
            <td align="left">最高位进入到CF中并填充最低位</td>
            <td>同上</td>
      </tr>
      <tr>
            <td>ROR</td>
            <td>循环右移指令</td>
            <td align="left">最低位进入到CF中并填充最高位</td>
            <td>同上</td>
      </tr>
      <tr>
            <td>RCL</td>
            <td>带进位循环左移指令</td>
            <td align="left">1.最低位由CF填充<br />
            2.最高位进入CF</td>
            <td>同上</td>
      </tr>
      <tr>
            <td>RCR</td>
            <td>带进位循环右移指令</td>
            <td align="left">1.最高位由CF填充<br />
            2.最低位进入CF</td>
            <td>同上</td>
      </tr>
    </tbody>
</table>
<p class="maodian"></p><h3>2.3 数据串操作指令</h3>
<p>重复前缀指令与数据串操作指令连用常常能起到事半功倍的效果,注意使用了大大提升汇编程序的简洁性。</p>
<table>
    <thead>
      <tr>
            <th>指令</th>
            <th>作用</th>
            <th align="left">注意事项</th>
            <th>示例</th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>lods/lodsw/lodsb</td>
            <td>载入数据串指令</td>
            <td align="left">1.具体操作:从ds:si读取一个字节/字/双字到AL,AX,EAX中,SI根据DF的值进行增减对应的数值</td>
            <td>lodsw ;无需操作数</td>
      </tr>
      <tr>
            <td>stos/stosw/stosb</td>
            <td>存数据串指令</td>
            <td align="left">1.AX/AL的内容存放到ES:DI中<br />
            2.指针修改是自动且隐式的</td>
            <td>stos/stosw/stosb ;无需操作数</td>
      </tr>
      <tr>
            <td>cmps/cmpsb/cmpsw</td>
            <td>数据串比较指令</td>
            <td align="left">cmps需要两个操作数(数据串首地址),后两个无需操作数,字符串的比较由DI和SI完成</td>
            <td>;NULL</td>
      </tr>
      <tr>
            <td>movs/movsb/movsw</td>
            <td>数据串传送指令</td>
            <td align="left">注意事项参照上方的cmps等的用法</td>
            <td>;NULL</td>
      </tr>
      <tr>
            <td>rep/repz/repnz</td>
            <td>重复前缀指令</td>
            <td align="left">1.当cx的内容不为0时执行操作(先判断)<br />
            2.用CLD,STD控制增、减量修改<br />
            3.与数据串操作指令结合使用,实现内存拷贝、比较等功能</td>
            <td>不需要操作数</td>
      </tr>
    </tbody>
</table>
<p class="maodian"></p><h3>2.4 逻辑运算指令</h3>
<p>这一部分指令是以我的理解进行划分,所以可能不太精准,有意见欢迎在评论区提出。</p>
<table>
    <thead>
      <tr>
            <th>指令</th>
            <th>作用</th>
            <th align="left">注意事项</th>
            <th>示例</th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>cmp dest,src</td>
            <td>1.比较指令</td>
            <td align="left">1.用dest减去src,但不保存结果<br />
            2.相减的结果影响F</td>
            <td>cmp ax,cx</td>
      </tr>
      <tr>
            <td>test dest,src</td>
            <td>1.将dest与src相与</td>
            <td align="left">可用来测试是否为零等,结果不保存<br />
            2.影响F</td>
            <td>test ax,ax</td>
      </tr>
      <tr>
            <td>neg dest</td>
            <td>取补指令,得到相反数</td>
            <td align="left">影响F</td>
            <td>neg ax</td>
      </tr>
      <tr>
            <td>not dest</td>
            <td>取反指令</td>
            <td align="left">1.将操作数每一位按位取反<br />
            2.<strong>不影响F</strong></td>
            <td>not AX</td>
      </tr>
    </tbody>
</table>
<p class="maodian"></p><h3>2.5 基于大小关系的跳转指令</h3>
<p>在使用了cmp,sub,subb等指令后通常使用如下这些指令衔接以便进行下一步的操作,令程序十分简洁。需要注意的是,根据有符号和无符号数需要选择不同的指令进行基于大小关系的跳转。</p>
<table>
    <thead>
      <tr>
            <th>无符号数</th>
            <th></th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>指令</td>
            <td>作用</td>
      </tr>
      <tr>
            <td>JA label</td>
            <td>大于时跳转</td>
      </tr>
      <tr>
            <td>JAE label</td>
            <td>大于等于时跳转</td>
      </tr>
      <tr>
            <td>JB label</td>
            <td>小于时跳转</td>
      </tr>
      <tr>
            <td>JBE label</td>
            <td>小于等于时跳转</td>
      </tr>
    </tbody>
</table>
<table>
    <thead>
      <tr>
            <th>带符号数</th>
            <th></th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>指令</td>
            <td>作用</td>
      </tr>
      <tr>
            <td>JG label</td>
            <td>大于时跳转</td>
      </tr>
      <tr>
            <td>JGE label</td>
            <td>大于等于时跳转</td>
      </tr>
      <tr>
            <td>JL label</td>
            <td>小于时跳转</td>
      </tr>
      <tr>
            <td>JEL label</td>
            <td>小于等于时跳转</td>
      </tr>
    </tbody>
</table>
<table>
    <thead>
      <tr>
            <th>无符号、带符号通用</th>
            <th></th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>JE label</td>
            <td>等于时跳转</td>
      </tr>
      <tr>
            <td>JNE label</td>
            <td>不等于时跳转</td>
      </tr>
    </tbody>
</table>
<p class="maodian"></p><h3>2.6 基于单标志位的转移指令</h3>
<p>根据标志寄存器F中标志位的状态决定是否进行跳转,通常在进行运算后结合这些指令进行跳转。</p>
<table>
    <thead>
      <tr>
            <th>指令</th>
            <th>作用</th>
      </tr>
    </thead>
    <tbody>
      <tr>
            <td>JC label</td>
            <td>CF=1时跳转</td>
      </tr>
      <tr>
            <td>JNC label</td>
            <td>CF=0时跳转</td>
      </tr>
      <tr>
            <td>JZ label</td>
            <td>ZF=1时跳转</td>
      </tr>
      <tr>
            <td>JNZ label</td>
            <td>ZF=0时跳转</td>
      </tr>
      <tr>
            <td>JO label</td>
            <td>OF=1时跳转</td>
      </tr>
      <tr>
            <td>JNO label</td>
            <td>OF=0时跳转</td>
      </tr>
      <tr>
            <td>JS label</td>
            <td>SF=1时跳转</td>
      </tr>
      <tr>
            <td>JNS label</td>
            <td>SF=0时跳转</td>
      </tr>
      <tr>
            <td>JP label</td>
            <td>SF=1时跳转</td>
      </tr>
      <tr>
            <td>JNP label</td>
            <td>PF=0时跳转</td>
      </tr>
    </tbody>
</table>
<h1>Part 3:Loading… …</h1>
<p>第一次更新:2020-05-15 15:29<br />
第二次更新:2020-05-22 00:14<br />
第三次更新:2020-05-24 00:24<br />
第四次更新:2020-05-24 21:10</p>
<p><font color="#ff0000" size="4">持续更新中… …</font></p>
<p>到此这篇关于汇编语言:x86汇编指令大全及其注意事项的文章就介绍到这了,更多相关x86汇编指令大全内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>奉献个公司计算机系统使用管理条例</li><li>导致计算机系统“死机”的原因及其预防方法</li><li>汇编语言开发过程详解</li><li>一位数乘法的汇编语言实现方法</li><li>汇编语言有关在屏幕区显示字符的四种方法(推荐)</li><li>计算机系统汇编语言和机器语言深入理解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言:x86汇编指令大全及其注意事项