闲来小调哼 發表於 2022-8-24 18:54:00

汇编语言概览

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>Intel 8086CPU<ul><li><ul><li><ul><li>1.环境</li><li>2.8086CPU常用指令</li><li>3.8086CPU常用寄存器</li><li>4.章节</li></ul></li></ul></li></ul></li><li>Intel X86架构处理器</li><li>Intel X86_64架构处理器</li></ul></div><br>
因特尔公司的CPU,其定义的指令集一般为复杂指令集CISC,全称为complex instruction set computer<p></p>
<h2 id="intel-8086cpu">Intel 8086CPU</h2>
<p>Intel的CPU,8086CPU下所有寄存器都是16位的</p>
<h5 id="1环境">1.环境</h5>
<ol>
<li>vscode安装MASM/TASM插件</li>
</ol>
<h5 id="28086cpu常用指令">2.8086CPU常用指令</h5>
<p>8086微处理器支持8中类型的指令,常见的指令如下所示:</p>
<ol>
<li>数据传送指令
<ol>
<li>MOV:传送一个字节(向下兼容)或者字从一个地方到另一个地方</li>
<li>POP:从栈顶弹出一个字到指定的位置</li>
<li>IN:从端口读取一个字节或者一个字</li>
<li>OUT:向端口写入一个字节或者一个字</li>
<li>LEA:加载操作数的地址到指定的寄存器</li>
<li>PUSHF:将标志寄存器的值送入栈顶</li>
<li>POPF:弹出栈顶的值送入标志寄存器</li>
</ol>
</li>
<li>运算指令:用于指定加减乘除等操作
<ol>
<li>ADD:加法指令</li>
<li>ADC:带进位加法指令,功能为<code>操作对象1 = 操作对象1 + 操作对象2 + CF</code></li>
<li>INC:将给定的一个字节或者一个字的数据加1</li>
<li>SUB:减法指令</li>
<li>SBB:带借位减法指令,功能为:<code>操作对象1 = 操作对象1 -操作对象2 - CF</code></li>
<li>DEC:和INC指令功能相反</li>
<li>CMP:比较两个字节或者两个字的数据。这个指令的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。</li>
<li>MUL:乘法指令</li>
<li>DIV:除法指令</li>
</ol>
</li>
<li>位操作指令
<ol>
<li>NOT:取反给定字节或者字的每一个位</li>
<li>AND:按位进行与运算(两者都为1结果才为1)</li>
<li>OR:按位进行或运算(两者其中一个为1结果就为1)</li>
<li>XOR:按位进行异或运算(两者相同为0,不同为1)</li>
<li>SHR:逻辑右移指令,高位补零</li>
<li>SHL:逻辑左移指令,低位补零</li>
</ol>
</li>
<li>中断指令
<ol>
<li>int:这个指令用于中断程序的执行,转而去执行中断处理程序。格式为:<code>int 中断类型码</code></li>
<li>iret:这个指令用于从中断处理程序返回到被中断程序,继续执行被中断程序</li>
</ol>
<pre><code>;汇编语法描述指令功能如下
pop IP
pop CS
popf (f表示标志寄存器)
</code></pre>
<ol start="3">
<li>into:这个指令用于当OF = 1时,中断程序的执行</li>
</ol>
</li>
<li>循环控制指令
<ol>
<li>loop:这个指令用于循环执行一组指令直到CX寄存器的值为0</li>
<li>jcxz:如果CX寄存器的值为0,则跳转到指定的地址执行。格式为<code>jcxz 标号</code></li>
</ol>
<pre><code>if ((cx) == 0)
{
    jmp short 标号// 段内短转移
}

</code></pre>
</li>
<li>处理器控制指令:这些指令都会影响标志寄存器中的某些位
<ol>
<li>STC:将CF位设为1</li>
<li>CLC:将CF位设为0</li>
<li>STD:将DF位设为1</li>
<li>CLD:将DF位设为0</li>
<li>STI:将IF位设为1</li>
<li>CLI:将IF位设为0</li>
</ol>
</li>
<li>串处理指令
<ol>
<li>MOVSB:传送一个字节</li>
<li>MOVSW:传送一个字</li>
<li>REP:重复执行给定的指令,直到CX寄存器的值为0</li>
</ol>
</li>
<li>转移指令
<ol>
<li>无条件转移指令:
<ol>
<li>CALL:这个指令用于调用其他子程序(或者说高级语言中的函数),其进行两步操作</li>
</ol>
<pre><code>1. 将当前的IP或者CS和IP压入栈中
2. 转移
</code></pre>
<ol start="2">
<li>RET:这个指令用于从子程序(被调用程序)中返回到调用程序,继续执行</li>
</ol>
<pre><code>(IP) = ((ss) * 16 + (SP))
(SP) = (SP) + 2

相当于
pop IP
</code></pre>
<ol start="3">
<li>JMP: 转移到指定的地址执行</li>
</ol>
</li>
<li>条件转移指令
<ol>
<li>JZ:标志寄存器的ZF标志位为1则跳转</li>
</ol>
</li>
</ol>
</li>
</ol>
<h5 id="38086cpu常用寄存器">3.8086CPU常用寄存器</h5>
<ol>
<li>AX</li>
<li>BX</li>
<li>CX</li>
<li>DX</li>
<li>SI:SI和DI是8086CPU中和BX功能相近的寄存器,但是si和di不能拆分为两个8位寄存器使用。</li>
<li>DI</li>
<li>DS</li>
<li>CS</li>
<li>IP</li>
<li>SS</li>
<li>ES</li>
<li>SP</li>
<li>BP</li>
<li>FLAG:标志寄存器,其值又被称为程序状态字(PSW)</li>
</ol>
<h5 id="4章节">4.章节</h5>
<ol>
<li>chapter1-chapter6</li>
<li>chapter7-chapter9</li>
<li>chapter10-chapter11</li>
<li>chapter12-chapter16</li>
</ol>
<p>参见:&lt;&lt;汇编语言第四版&gt;&gt;</p>
<h2 id="intel-x86架构处理器">Intel X86架构处理器</h2>
<p>待续</p>
<h2 id="intel-x86_64架构处理器">Intel X86_64架构处理器</h2>
<p>待续</p><br><br>
来源:https://www.cnblogs.com/xiaocer/p/16621255.html
頁: [1]
查看完整版本: 汇编语言概览