一、数据传送类指令
1、通用数据传送指令MOV
指令格式:MOV dset,src
功能:将源操作数src的内容传给目的操作数dest,源操作数内容不变。

2、交换指令XCHG
指令格式:XCHG dest,src
功能:将源操作数和目的操作数的内容交换。XCHG指令中的两个操作数类型需匹配,交换只能在两个通用寄存器之间,通用寄存器与储存器操作数之间进行。
3、堆栈操作指令PUSH和POP
PUSH指令格式:PUSH src
功能:将指令中指定的16位操作数src压入堆栈,该操作数只能是通用寄存器操作数、储存器操作数和段寄存器操作数。
POP指令格式:POP dest
功能:将堆栈中栈顶指针SP所指的16位操作数内容弹出,送给指令中指定的操作数。对操作数的规定同PUSH指令(当是段寄存操作数时,CS除外)。
4、地址传送指令
地址传送指令传送的是存储器操作数的地址(偏移地址和段地址)。这组指令都不影响标志位,指令中的源操作数都必须是储存器操作数。
(1)取有效地址指令LEA
指令格式:LEA reg,mem
功能:将源操作数的有效地址送到指令指定的寄存器中。源操作数只能是一存储器操作数,目的操作数只能是一16位的通用寄存器。
(2)地址指针装到DS和指定的寄存器指令LDS
指令格式:LDS reg,mem
功能:将指令中源操作数的有效地址决定的双子内存单元中的第一个字内容传送给指令指定的16位通用寄存器,第二个字内容传送给段寄存器DS。
(3)地址指针装到ES和指定的寄存器指令LES。LES指令的操作与LDS指令基本类似,所不同的只是第二个字的内容传送的段地址是ES,及将源操作数所决定的双字内存单元中的第二个内容传送到ES段寄存器中。
地址传送类指令应用于串操作时,需建立初始串地址指针。
5、标志寄存器传送指令
(1)读取标志指令LAHF
指令格式:LAHF
功能:将标志寄存器的低8位读出,并传送给AH寄存器。
(2)设置标志寄存器指令SAHF
指令格式:SAHF
功能:SAHF指令与LAHF指令正好相反,它将AH寄存器的内容传送给标志寄存器的低8位。
(3)标志寄存器压栈指令PUSHF
指令格式:PUSHF
功能:先执行栈顶指针SP减2操作,然后再将标志寄存器的所有标志位压入到堆栈中栈顶指针SP指向的字单元中,其操作过程与PUSH指令相似。
(4)标志寄存器出栈指令POPF
指令格式:POPF
功能:POPF指令与PUSHF指令的执行过程刚好相反,执行时先将执行的栈顶指针SP所指的字内容弹出来送到标志寄存器中,然后再将SP的值加2,其具体操作与POP指令相似。
6、查表转换指令XLAT
指令格式:XLAT或XLAT表首地址
功能:将数据段中偏移地址为(BX+AL)所对应的内存单元的内容送入AL中。XLAT指令的操作数是隐含的,所执行的操作是将BX中的值作为基地址,AL中的值作为偏移量所形成的偏移地址所对应的字节储存单元中的内容传给AL。
二、算术运算类指令
1、加法指令
(1)加法指令ADD
指令格式:ADD dest,src
功能:将源操作数的内容与目的操作数的内容相加后的结果送回到目的操作数,并根据运算结果影响所有状态标志位。
注意:
(1 源操作数和目的操作数应同时位有符号数和无符号数,且二者的数据类型需匹配
(2 源操作数可以是8/16位的通用寄存器操作数、储存器操作数、或立即数;目的操作数只能是与源操作数相匹配的通用寄存器或储存器操作数,且两者不能为储存器操作数。
(2)带进位的加法指令ADC
指令格式:ADC dest,src
功能:将源操作数的内容、目的操作数的内容、当前进位标志位CF的值相加后的结果会送给目的操作数,并根据运算结果影响所有状态标志位。
(3)加1指令INC
指令格式:INC dest
功能:将指令中指定的操作数内容加1后,再返回给该操作数(不可以是立即数)
2、减法指令
(1)减法指令SUB dest,src
指令格式:SUB dest,src
功能:将目的操作数与源操作数的内容相减之后的结果回送给目的操作数。
(2)带借位的减法指令SBB
指令格式:SBB dest,src
功能:指令执行时,用目的操作数的内容减去源操作数的内容,同时还要减去CF标志位的值,并将相减的结果会送给目的的操作数
(3)减1指令DEC
指令格式:DEC dest
功能:完成对指令中指定的操作数的内容减1后,又送会给操作数。
(4)求补指令NEG
指令格式:NEG dest
功能:对指令中指定的操作数内容求补后,再将结果回送给该操作数。该操作数只能是通用寄存器操作数或储存器操作数。
对一个操作数求补实际上就相当于用0减去该操作数的内容,故NEG指令属于减法指令。该指令的间接求法是将操作数的内容求反,末尾加1后再送回给该操作数。
(5)比较指令:CMP
指令格式:CMP dest,src
功能:CMP指令除了不回送相减结果外,其它均与SUB指令相同
3、乘法指令
无符号数乘法指令MUL
指令格式:MUL opr
功能:将指令中指定的操作数与隐含的被乘数(都为无符号数)相乘,所的乘积按下表对应关系存放
乘数位数 | 隐含的被乘数 | 乘积的存放位置 | 举例 |
8位 | AL | AX | MUL BL |
16位 | AX | DX与AX | MUL BX |
(1 MUL指令中的操作数可以使用除立即数以外的其他寻址方式,但当是寄存器寻址时,操作数只能是通用寄存器
(2 对标志位的“无定义”和“不影响”不同。无定义是指指令执行之后,标志位的状态不确定;不影响是指指令的结果不影响标志位,即标志位保持原状态不变
(2)有符号数乘法指令IMUL。IMUL指令格式和功能和MUL相同,只是要求两个操作数都须为有符号数
(1 IMUL指令中对操作数的寻址方式规定同MUL指令,但表示形式为补码,乘积也是以补码的形式表示的数
4、除法指令
(1)无符号数除法指令DIV
指令格式:DIV src
功能:用指令中的显示操作数去除隐含操作数(都为无符号数),所得的商和余数按下表的对应关系存放
除数位数 | 隐含的被除数 | 商 | 余数 | 举例 |
8位 | 在AX中 | 在AL中 | 在AH中 | DIV BH |
16位 | 在DX与AX中 | 在AX中 | 在DX中 | DIV BX |
(2)有符号数除法指令IDIV
IDIV指令的格式和功能与DIV相同,只是要求操作数必为用补码表示的有符号数,计算的商和余数也是用补码表示的有符号数,且余数的符号与被除数的符号相同
(1除法指令对所有状态标志位的值均无定义
(2除法指令中被除数的长度应为除数长度的两倍,如果被除数和除数长度相等,则应在使用除法指令之前,通过符号扩展指令CBW或CWD对被除数进行位数扩展
(3执行除法指令后,若商超出了表示范围,即字节除法超出了AL范围,字除法超出了AX范围,就会引起0号类型中断,在0号类型中断处理程序中,对溢出进行处理
5、符号扩展与符号扩展指令
(1)符号扩展
当要扩展的数据是无符号数时可以采用零扩展,记载最高为前扩展0,补充够位数即可;当要扩展的数据是有符号数时需采用符号扩展,符号位扩展的方法是将需要扩展的数据的符号为填入到需要扩展的每一位,以保持其作为有符号数的值的大小不变。(治理需要注意的,要扩展的数须是用补码形式表示的有符号数,符号扩展后,其结果仍是该数的补码)
(2)符号扩展指令
(1字节扩展为字指令CBW
指令格式:CBW
功能:该指令的隐含操作数位AH和AL,功能是用AL的符号位去填充AH,即若AL为正数,则AH=00H;否则AH=FFH
(2子扩展为字指令CWD
指令格式:CWD
功能:该指令的隐含操作数为DX和AX,功能是用AX的符号位去填充DX,即若AX为正数,则DX=0000H,否则DX=FFFFH
三、逻辑运算与移位类指令
1、逻辑运算指令
(1)逻辑与指令AND
指令格式:AND dest,src
功能:将两个操作数的内容进行按位相“与”运算,并将结果会送目的操作数。源操作数可以是8/16位的通用寄存器、储存器操作器或立即数,目的操作数只允许是通用寄存器或储存器操作数(实际编程时AND指令常用于实现:1、屏蔽某些位;2、对CF状态位清零
(2)逻辑或指令OR
指令格式:OR dest,src
功能:将两个操作数的内容进行按位相“或”运算,并将结果回送给目的操作数。指令对源操作数和目的操作数的规定及对标志位的影响与AND指令相同(实际编程时,利用OR指令可将操作数的某些位置1,而其余位不变;利用OR指令,也可对两个操作数进行组合)
(3)逻辑异或指令XOR
指令格式:XOR dest,src
功能:将两个操作数的内容进行按位相“异或”运算,并将结果会送目的操作数。(实际编程时,XOR指令常用于实现:1、将操作数的某些位取“反”,其他位不变2、将寄存器内容清零)
(4)逻辑非指令NOT
指令格式:NOT dest
功能:将操作书的内容按位取反,并将结果会送到目的操作数中。指令中的操作数只能是8/16位的通用寄存器或储存器操作数
(5)测试指令TEST
指令格式:TEST dest,src
功能:TEST指令所完成的操作以及对操作数的约定和对标志位的影响都与AND指令相同,所不同的只是TEST指令不回送结果给目的操作数(实际编程时,通常是在需要检测某一位或几位的状态,但又不希望改变原有操作数的数值的情况下使用TEST指令)
2、位移指令
(1)逻辑循环移位指令
(1逻辑左移位指令SHL
指令格式:SHL mem/reg,count
功能:将目的操作数的内容向左移位,移位次数由源操作数count决定,count只能是1或CL。每左移一位,目的操作数的最高位移入CF标志位,最低位补0
(2逻辑右移指令SHR
功能:将目的操作数的内容向右移位,每右移一位,操作数的最低位移入CF标志位,最高位补0
(3算术左移指令SAL。SAL指令与SHL指令是一条机器指令的两种汇编指令表示
(4算数右移指令SAR
功能:将目的操作数的内容向右移位,移位次数由源操作数给定,每右移一位,操作数的最低位移入CF标志位,最高位在移入次高位的同时保持不变,即符号位不变
(2)循环移位指令
(1循环左移指令ROL
功能:将目的操作数的内容向左移动源操作数所规定的位数,每移一位,最高位在进入进位位CF的同时,也移入空出的最低位,形成环路
(2循环右移指令ROR
功能:将目的操作数的内容向右移动源操作数所规定的位数,每移一位,最低位在进入进位位CF的同时,也移入空出的最高位,形成环路
(3带进位循环左移指令RCL
功能:将目的操作数的内容向左移动源操作数所规定的位数,每移一位,最高位进入标志位CF,而CF原先的状态值移入最低位
(4带进位循环右移指令RCR
功能:将目的操作数的内容向右移动源操作数所规定的位数,每移一位,最低位进入标志位CF,而CF原先的状态值移入最高位
四、控制转移类指令
1、无条件转移指令JMP
无条件转移指令JMP执行后,程序无条件地转移到另一个地址去执行。在JMP指令中,必须要指出要转移的目标地址,这个地址是通过修改IP(或CS与IP)的值来指定的,指定的方式可以是直接的,也可以是间接的,具体有以下4种形式:
(1)段内直接转移
指令格式:JMP label
功能:无条件转移到本段内label所指的目标地址处执行,即执行“IP<-IP+位移量”操作。指令被汇编时,汇编程序会计算出JMP指令的下一条指令到label所指示的目标地址之间的位移量
(1 label表示的是一个标号,其在本程序所在的代码段内,表示要转移的目标地址,在一具体源程序中,标号名由用户自己命名
(2 位移量是要转移到的目标指令的偏移地址与紧跟在JMP指令后的那条指令的偏移地址之间的差值。当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负
(3 根据位移量的值范围,JMP label指令又可以分为段内短转移和近转移。其中短转移指8位的位移量,值在-128~+127之间;近转移指16位的位移量,值在-32768~+32767之间。汇编程序也提供了相应的短转移SHORT运算符和NEAR类型来明确,但用户不必考虑是短转移还是近转移,汇编程序在汇编时会计算位移量值并根据计算值进行自动转移
(2)段内间接转移
指令格式:JMP opr
功能:无条件转移到本段内opr所指定的目标地址去执行程序。opr可为一寄存器或储存器操作数,在其中预放着要转移的目标地址。执行JMP指令时,将opr中取得的偏移地址作为新的指令指针装到IP中,实现程序转移
(3)段间直接转移
指令格式:JMP FAR PTR label
功能:无条件转移到另外一个代码段中标号为label所指的目标地址处执行。指令中的FAR PTR为远转移指令,表示转移是在段间进行,label为另外一个代码段中目标地址的符号。
(4)段间间接转移
指令格式:JMP DWORD PTR opr
功能:无条件的转移到另外一个代码段中由操作数所指定的目标地址处执行。指令中的操作数opr只能是一个储存器操作数,涉及连续4个内存单元,通过DWORD PTR 明确类型。指令执行时,由opr的寻址方式确定出具体的偏移地址,将该偏移地址所指的双字单元中的低字内容送给IP,高字内容送给CS,形成新的指令执行地址CS:IP,从而实现段间间接转移
条件转移指令
类型 | 指令格式 | 转移测试条件 | 功能描述 |
单 个 标 志 位 | JC opr | CF=1 | 有进(借)位转移 |
JNC opr | CF=0 | 无进(借)位转移 | |
JP/JPE opr | PF=1 | 奇偶性为1(偶)状态转移 | |
JNP/JPO opr | PF=0 | 奇偶性为0(偶)状态转移 | |
JZ/JE opr | ZF=0 | 结果为0/相位转移 | |
JNZ/JNE opr | ZF=1 | 结果不为0/不相等转移 | |
JS opr | SF=1 | 符号位为1转移 | |
JNS opr | SF=0 | 符号位为0转移 | |
JO opr | OF=1 | 溢出转移 | |
JNO opr | OF=0 | 无溢出转移 | |
无 符 号 数 | JA/JNBE opr | CF=0且ZF=0 | 高于/不低于也不等于转移 |
JNA/JBE opr | CF=1或ZF=1 | 不高于/低于或等于转移 | |
JB/JNAE opr | CF=1且ZF=0 | 低于/不高于也不等于转移 | |
JNB/JAE opr | CF==0或ZF=1 | 不低于/高于或等于转移 | |
有 符 号 数 | JG/JNLE opr | SF=OF且ZF=0 | 大于/不小于也不等于转移 |
JNG/JLE opr | SF=/OF或ZF=1 | 不大于/小于或等于转移 | |
JL/JNGE opr | SF=/OF且ZF=0 | 小于/不大于也不等于转移 | |
JNL/JGE opr | SF=OF或ZF=1 | 不小于/大于或等于转移 |
3、循环控制指令
循环控制指令是一组增强型的条件转移指令,也是通过检测状态标志是否满足给定的条件而进行条件转移,但转移范围只能在-128 ~ +127字节内,具有短距离属性。所有的循环控制指令都不影响状态标志位,但与条件转移指令不同的是,循环次数必须预先送入CX寄存器中,并根据CX内容的检测结果来决定是循环至目标地址还是顺序执行下一条指令。
LOOP CX不为零时循环。
LOOPE/LOOPZ CX不为零且标志Z=1时循环。
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环。
JCXZ CX为零时转移。
JECXZ ECX为零时转移。