独树一枝 發表於 2020-5-23 00:39:00

汇编语言——汇编指令

<h2>mov</h2>
<p>功能:用来进行数据传输。</p>
<p>以 “mov A, B”为例,相当于A=B。</p>
<p>具有以下形式:mov 寄存器, 数据;mov 寄存器, 寄存器;mov 寄存器, 内存单元;mov 内存单元, 寄存器;mov 段寄存器,寄存器;</p>
<p>&nbsp;</p>
<h2>add</h2>
<p>功能:用来做加法。</p>
<p>以“add A, B”为例,相当于A=A+B。</p>
<p>具有的形式,和 mov 一样。</p>
<p>&nbsp;</p>
<h2>sub</h2>
<p>功能:用来做减法。</p>
<p>以“sub A, B”为例,相当于A=A-B。</p>
<p>具有的形式,和 mov 一样。</p>
<p>&nbsp;</p>
<h2>inc,dec</h2>
<p>功能:用来自增,自减</p>
<p>以“inc A”为例,相当于A=A+1。</p>
<p>以“dec A”为例,相当于A=A-1。</p>
<p>&nbsp;</p>
<h2>push</h2>
<p>功能:入栈</p>
<p>以“push A”为例,大概相当于:SP=SP-2 ;将A中的内容送入SS:SP指向的内存单元处。</p>
<p>具有以下形式:push 寄存器;push 内存单元;push 段寄存器</p>
<p>&nbsp;</p>
<h2>pop</h2>
<p>功能:出栈</p>
<p>以“pop A”为例,大概相当于:将SS:SP指向的内存单元处的数据送入A中;SP=SP+2。</p>
<p>具有形式和push相同</p>
<p>&nbsp;</p>
<h2>Loop</h2>
<p>功能:实现基于cx的循环功能</p>
<p>以“loop S“为例,大概相当于:cx=cx-1,判断cx中的值,不为0则转至标号处执行程序。</p>
<p>&nbsp;</p>
<h2>and</h2>
<p>功能:逻辑与指令,按位进行与运算。</p>
<p>通过该指令可将操作对象的相应位设置为0,其他位不变。</p>
<p>&nbsp;</p>
<h2>or</h2>
<p>功能:逻辑或指令,按位进行或运算。</p>
<p>通过该指令可将操作对象的相应位设置为1,其他位不变。</p>
<p>&nbsp;</p>
<h2>mul</h2>
<p>功能:乘法指令</p>
<p>当乘数是字节操作数时,把AL中的无符号数与乘数相乘,结果16位放入AX中</p>
<p>当乘数是字操作数时,把AX中的无符号数与乘数相乘,结果32位,高位放入DX中,低位放入AX中。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>div</h2>
<p>功能:除法指令</p>
<p>除数:有8位和16位两种,在一个reg或内存单元中。</p>
<p>被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。</p>
<p>结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>jmp</h2>
<p>1. 依据位移进行转移的 jmp 指令:</p>
<p>(1) jmp short 标号</p>
<p>这种 jmp指令实现的是段内短转移,它对IP的修改范围为 -128-127 。</p>
<p>实际上,“jmp short 标号”的功能为:(IP)=(IP)+8位位移</p>
<p>8位位移=标号处的地址-jmp指令后的第一个字节的地址。</p>
<p>short指明此处的位移为8位位移。</p>
<p>8位位移用补码表示。</p>
<p>8位位移由编译程序在编译时算出。</p>
<p>&nbsp;</p>
<p>(2)jmp near ptr 标号</p>
<p>这种 jmp 指令实现的是段内近转移。</p>
<p>实际上,“jmp near 标号”的功能为:(IP)=(IP)+16位位移</p>
<p>&nbsp;</p>
<p>2. 转移的目的地址在指令中的 jmp 指令</p>
<p>jmp far ptr 标号&nbsp; 实现的是段间转移,又称为远转移。</p>
<p>功能:(CS)= 标号所在段的段地址,(IP)= 标号所在段中的偏移地址</p>
<p>&nbsp;</p>
<p>3. 转移地址在寄存器中的 jmp 指令</p>
<p>指令格式:jmp 16位 reg</p>
<p>功能:(IP)=(16位reg)</p>
<p>&nbsp;</p>
<p>4.转移地址在内存单元中的 jmp 指令</p>
<p>(1)jmp word ptr 内存单元地址</p>
<p>功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。</p>
<p>&nbsp;</p>
<p>(2)jmp dword ptr 内存单元地址(段间转移)</p>
<p>功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的地址,低地址处是转移的目的偏移地址。</p>
<p>&nbsp;</p>
<h2>jcxz(jump if cx = zero)</h2>
<p>指令格式:jcxz 标号</p>
<p>操作:当 cx=0 时,(IP)=(IP)+8位位移</p>
<p>&nbsp;</p>
<h2>ret</h2>
<p>ret指令用栈中的数据,修改IP的内容,从而实现近转移;</p>
<p>CPU执行 ret 指令时,进行下面两步操作:<br>(1)(IP)=((ss)*16+(sp))</p>
<p>(2)(sp)=(sp)+ 2</p>
<p>&nbsp;</p>
<h2>retf</h2>
<p>retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;</p>
<p>CPU执行 retf 指令时,进行下面4步操作:</p>
<p>(1)(IP)=((ss)*16 + (sp))</p>
<p>(2)(sp)=(sp)+ 2</p>
<p>(3)(CS)=((ss)*16 + (sp))</p>
<p>(4)(sp)=(sp)+ 2</p>
<p>&nbsp;</p>
<h2>call</h2>
<p>一.&nbsp; 依据位移进行转移的call指令</p>
<p>1. call 标号(将当前的 IP 压栈后,转到标号处执行指令)</p>
<p>CPU执行这种格式的call指令后,进行如下的操作:</p>
<p>(1)(sp)=(sp)- 2</p>
<p>  &nbsp; ((ss)* 16 +(sp))=(IP)</p>
<p>(2)(IP)=(IP)+ 16位位移</p>
<p>&nbsp;</p>
<p>二.&nbsp; 转移的目的地址在指令中的call指令</p>
<p>1. call far ptr 标号</p>
<p>CPU执行此种格式的call指令时,进行如下的操作:<br>(1)(sp)=(sp)- 2</p>
<p>  &nbsp; ((ss)*16 + (sp))=(CS)</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (sp)=(sp)- 2</p>
<p>  &nbsp; ((ss)*16 + (sp))=(IP)</p>
<p>(2)(CS)=标号所在段的段地址</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(IP)=标号在段中的偏移地址</p>
<p>&nbsp;</p>
<p>三. 转移地址在寄存器中的call指令</p>
<p>call 16位 reg</p>
<p>功能:</p>
<p>(sp)=(sp)- 2</p>
<p>((ss)*16 +(sp))=(IP)</p>
<p>(IP)=(reg)</p>
<p>&nbsp;</p>
<p>四. 转移地址在内存中的call指令</p>
<p>1. call word ptr 内存单元地址</p>
<p>功能:</p>
<p>push IP</p>
<p>jmp word ptr 内存单元地址</p>
<p>&nbsp;</p>
<p>2. call dwordd ptr 内存单元地址</p>
<p>功能:</p>
<p>push CS</p>
<p>push IP</p>
<p>jmp dword ptr 内存单元地址</p>
<p>&nbsp;</p>
<h2>adc</h2>
<p>adc是带进位加法指令,它利用了CF位上记录的进位值。</p>
<p>指令格式:adc 操作对象1,操作对象2</p>
<p>功能:操作对象1=操作对象1+操作对象2+CF</p>
<p>&nbsp;</p>
<h2>sbb</h2>
<p>sbb是带借位减法指令,它利用了CF位上记录的借位值。</p>
<p>指令格式:sbb 操作对象1,操作对象2</p>
<p>功能:操作对象1=操作对象1-操作对象2-CF</p>
<p>&nbsp;</p>
<h2>cmp</h2>
<p>cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果,关键作用是对标志寄存器的影响。</p>
<p>指令格式:cmp 操作对象1,操作对象2</p>
<p>功能:计算操作对象1-操作对象2但不保存结果,仅仅根据计算结果对标志寄存器进行设置。</p>
<p>&nbsp;</p>
<h2>&nbsp;</h2>
<table style="height: 267px; width: 808px" border="0" align="center"><caption>检测比较结果的条件转移指令</caption>
<tbody>
<tr>
<td>指令</td>
<td>含义</td>
<td>检测的相关标志位</td>


</tr>
<tr>
<td>je</td>
<td>等于则跳转</td>
<td>zf=1</td>


</tr>
<tr>
<td>jne</td>
<td>不等于则跳转</td>
<td>zf=0</td>


</tr>
<tr>
<td>jb</td>
<td>小于则跳转</td>
<td>cf=1</td>


</tr>
<tr>
<td>jnb</td>
<td>不小于则跳转</td>
<td>cf=0</td>


</tr>
<tr>
<td>ja</td>
<td>大于则跳转</td>
<td>cf=0且zf=0</td>


</tr>
<tr>
<td>jna</td>
<td>不大于则跳转</td>
<td>cf=1且zf=1</td>


</tr>


</tbody>


</table>
<h2>&nbsp;</h2>
<p>&nbsp;</p>
<h2>movsb</h2>
<p>格式:movsb</p>
<p>功能:将ds:si指向的内存单元中的字节送入es:di中,然后根据df的值,将si和di递增1或递减1。</p>
<p>执行movsb指令相于进行下面几步操作</p>
<p>(1)((es)*16+(di))=((ds)*16+(si))</p>
<p>(2)如果df=0则:(si)=(si)+ 1;(di)=(di)+ 1</p>
<p>  &nbsp; 如果df=1则:(si)=(si)- 1;(di)=(di)- 1</p>
<p>&nbsp;</p>
<h2>movsw</h2>
<p>&nbsp;格式:movsw</p>
<p>功能:将ds:si指向的内存字单元中的字送入es:di中,然后根据标志寄存器df的值,将si和di递增2或递减2 。</p>
<p>&nbsp;</p>
<h2>rep</h2>
<p>一般和movsb,movsw联动</p>
<p>功能:rep的作用是根据cx的值,重复执行后面的串传送指令。</p>
<p>&nbsp;</p>
<h2>pushf ,popf</h2>
<p>pushf的功能是将标志寄存器的值压栈,popf的功能是从栈中弹出数据,放入标志寄存器中。</p>
<p>&nbsp;</p>
<h2>int</h2>
<p>功能:引发中断过程。</p>
<p>指令格式:int n&nbsp; (n为中断类型码)</p>
<p>cpu执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下。</p>
<p>(1)取中断类型码n;</p>
<p>(2)标志寄存器入栈,IF=0,TF=0;</p>
<p>(3)CS、IP入栈;</p>
<p>(4)(IP)=(n*4),(CS)=(n*4+2)。</p>
<p>&nbsp;</p>
<h2>iret</h2>
<p>功能:从中断例程返回到应用程序。</p>
<p>相当于:</p>
<p>pop IP</p>
<p>pop CS</p>
<p>popf</p>
<p>&nbsp;</p>
<h2>in&nbsp; &nbsp;out</h2>
<p>在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时,要用al;访问16位端口时,要用ax。</p>
<p>对0~255以内的端口进行读写时:</p>
<p>in al,20h  ;从20h端口读入一个字节</p>
<p>out 20h,al  ;往20h端口写入一个字节</p>
<p>对256~65535的端口进行读写时,端口号放在dx中:<br>mov dx,3f8h  ;将端口号3f8h放入dx</p>
<p>in al,dx  ;从3f8h端口读入一个字节</p>
<p>out dx,al  ;往3f8h端口写入一个字节</p>
<p>&nbsp;</p>
<h2>shl</h2>
<p>shl是逻辑左移指令,它的功能为:</p>
<p>(1)将一个寄存器或内存单元中的数据向左移位;</p>
<p>(2)将最后移出的一位写入CF中;</p>
<p>(3)最低位用0补充。</p>
<p>如果移动位数大于1时,必须将移动位数放在cl中。</p>
<p>&nbsp;</p>
<h2>shr</h2>
<p>shr是逻辑右移指令,它的功能为:</p>
<p>(1)将一个寄存器或内存单元中的数据向右移位;</p>
<p>(2)将最后移出的一位写入CF中;</p>
<p>(3)最高位用0补充。</p>
<p>如果移动位数大于1时,必须将移动位数放在cl中。</p>
<p>&nbsp;</p>
<h2>sti&nbsp; cli</h2>
<p>sti,设置IF=1</p>
<p>cli,设置IF=0</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/b1ing/p/12940660.html
頁: [1]
查看完整版本: 汇编语言——汇编指令