数据传输指令
通用数据传送指令
MOV DST,SRC #将源操作数的数据传送到目的操作数中
说明:1.指令中两个操作数不能同为存储器操作数
2.CS不能作为目标操作数(代码段寄存器不可随意更改)
3.段寄存器之间不能相互传送
4.立即数不能直接放入段寄存器
5.MOV指令不影响标志位
堆栈操作指令
PUSH SRC #将源操作数压入堆栈(压入一个字单元),并使SP减2
POP DST #将当前SP指向的一个字单元弹出到目的操作数中,并使SP加2
说明:1.堆栈数据的压入与弹出必须以字单位执行
2.这两条指令不能用立即寻址方式,POP指令不能使用CS段寄存器(cs不能随意更改,但其值可被压入堆栈)
3.这两条指令不影响标志位
地址传送指令
LEA REG,SRC #将源操作数的有效地址(16位的偏移地址)送到指定的寄存器中REG(register)
说明:1.目的操作数REG是一个16位的通用寄存器
2.REG不能是段寄存器
3.该指令不影响标志位
LDS REG,SRC#将源操作数的指定的4个连续字节中的内容作为地址,送到指定寄存器中,其中前两个字节作为偏移地址送到REG中,后两个字节作为段地址存入DS段寄存器中
LES REG,SRC#与LDS相似,只不过将后两个字节作为段地址存入ES段寄存器中。
说明:1.REG不能为段寄存器
2.两个指令均不影响标志位
标志寄存器传送指令
LAHF #将标志寄存器中的低八位传送至AH中。
SAHF#与上条指令相反:将AH中数据传送到标志寄存器的低八位,不影响高八位
PUSHF#把标志寄存器推入堆栈,同时修改SP减2,该指令不影响标志位
POP#将当前堆栈所指的字单元传送给标志寄存器,同时修改SP加2
数据交换指令
XCHG DST,SRC#将源操作数与目的操作数交换
说明:1.允许在寄存器之间,寄存器与存储器单元之间完成一个字或字节数据的交换
2.DST,SRC不能是段寄存器,立即数,IP寄存器
3.DST,SRC中,必须有一个是寄存器寻址,两个存储器单元不能交换数据
4.该指令不影响标志位
输入/输出指令
IN DST ,SRC#将端口数据传送到AL或AX寄存器中
OUT DST ,SRC#将AL或AX寄存器中的数据传送到端口中
说明:1.装数据的是AL或AX,装端口的是一个8位立即数
2.当端口地址较大,可将地址转入DX寄存器中间接寻址
算数运算指令
加法与减法指令
ADD DST,SRC# 不带进位加法,SRC+DST的值放到DST中
说明:操作数为带符号数
ADC DST,SRC#带进位加法,SRC+DST+CF的值放到DST中
说明:1.操作数为带符号数
2.用于多字节加法,可以加上低位的进位
INC DST#自增,DST+1的值放到DST中
说明:不影响CF标志位
SUB DST,SRC#不带进位减法,SRC-DST的值放到DST中
SBB DST,SRC#带进位减法,SRC-DST-CF的值放到DST中
DEC DST#自减,DST+1的值放到DST中
说明:不影响CF标志位
NEG DST#取相反数指令,DST-0的值放到DST中
说明:无论DST是正是负,对其每一位(包括符号位)取反加一
CMP DST,SRC#比较指令,SRC-DST并设置标志位
说明:1.仅仅改变标志寄存器内容
2.操作数可以是带符号数也可以是不带符号数
3.CMP AX,BX #当OF=SF则AX>BX;当OF!=SF则AX<BX
乘法除法指令
IMUL SRC#带符号乘法
说明:1.两个8位数相乘SRC*AL的值放到AX(高八位放AH,低八位放AL)中
2.两个16位数相乘SRC*AX的值放到AX和DX(高八位放DX,低八位放AX)中
MUL SRC#无符号乘法,SRC*AL的值放到AX中
IDIV SRC#带符号除法
说明:1.两个8位数相除AX/SRC的值放到AX(AL放商,AH放余数)中
2.两个16位数相除,DX与AX组成16位被除数/SRC的值放到AX与DX(AX放商,DX放余数)中
DIV SRC#无符号除法
逻辑运算指令
AND DST,SRC#源操作数与目的操作数进行与运算结果放到DST中
说明:1.可以用AND指令实现位清零:AND AL,0FH
TEXT DST,SRC#DST与SRC做与运算
说明:1.与AND的区别是不将运算结果放到DST
2.仅仅改变标志位
3.可以用来判断某位是否为0:TEXT AL,01H #判断AL最低位是否为0,若ZF=1则最低位为零
OR DST,SRC#源操作数与目的操作数进行或运算结果放到DST中
说明:1.可以使某些位置1,其余位不变:OR AL,80H
XOR DST,SRC#DST与SRC进行异或运算(相同为0,不同为1)
说明:1.异或值=两数相减值
2.与1做异或取反,与0做异或不变
NOT DST#DST中按位取反
说明:1.取反其实就是求补数(不是补码):FEBCH=0143H(0=F-F,1=F-E,4=F-B,3=F-C)
注意:NOT不影响标志位,其余四条指令使CF与OF为0,对AF无定义,结果设置SF,PF,ZF。
移位指令
移位指令
左移:
算数左移:SAL(arithmetic shift left) DST,COUNT#将DST按位向左移动,count为位移次数
逻辑左移:SHL (head shift left)DST,COUNT
说明:1.左移一位相当于DST*2,左移两位相当于DST*4
2.右边补0
3.如果COUNT为1,则在指令中可直接指出,如果大于1则由CL寄存器间接给出
右移:
算数右移:SAL DST,COUNT#将DST按位向右移动,count为位移次数
逻辑右移:SHL DST,COUNT#
说明:1.右移一位相当于DST/2
2.算数右移适用于有符号数,左侧补无效数字(若是负数补1,若是正数补0),逻辑右移适用于无符号数,左侧补0
注意:左移会发生溢出,右移不会
移位循环指令
循环左移:ROL(rotate left)DST,COUNT#最左侧一位移到最右侧;每移动一次,数据传到CF
循环右移:ROR DST,COUNT
带进位循环左移:RCL(rotate carry left)DST,COUNT#带着CF一起循环移动
带进位循环右移:RCR DST,COUNT
程序控制指令
转移指令
段内转移:
段内直接转移:
短转移:JMP SHORT OPR#8位位移量+IP, OPR为转移目标
近转移:JMP NEAR PTR OPT#16位位移量+IP
说明:直接转移只改变IP大小
段内间接转移:
JMP OPR1#通过OPR1间接转移
说明:1.OPR为16位寄存器或存储器寻址方式
2.OPR中的数据作为有效偏移地址直接赋给IP
3.段内寻址只改变IP的值
段间转移:
段间直接转移:远转移JMP FAR PTR ORP#
说明:将指定的转移目标地址的EA放到IP,段地址放到CS
段间间接转移:JMP DWORD PTR OPR #OPT为寄存器或者存储器寻址
说明:将OPR指定的EA赋值给IP,EA加2给到CS中
条件转移指令
简单条件转移指令
JC OPR#CF=1时跳转
JNC OPR#CF=0时跳转
JS OPR#SF=1时跳转
JNS OPR#SF=0时跳转
JO OPR#OF=1时跳转
JNO OPR#OF=0时跳转
JZ/JE OPR#ZF=1时跳转
JNZ/JNE OPR#ZF=0时跳转
JP/JPE OPR#PF=1时跳转
JNP/JPO OPR#PF=0时跳转
无符号条件转移指令
JA(above)/JNBE OPR#CF=0且ZF=0 大于/不小于等于
JAE/JNB OPR#CF=0且ZF=1 大于等于/不小于
JB(belw)/JNAE OPR#CF=1且ZF=0 小于/不大于等于
JBE/JNA OPR#CF=1且ZF=1 小于等于/不大于
带符号条件转移指令
JG/JNLE OPR#SF=OF且ZF=0 大于/不小于等于
JGE/JNL OPR#SF=OF或ZF=1 大于或等于/不小于
JL/JNGE OPR# SF!=OF且ZF=0小于/不大于等于
JLE/JNG OPR# SF!=OF 或ZF=1小于等于/不大于
循环控制指令
LOOP OPR#
说明:1.循环次数写进CX中,每次程序运行到该指令时CX里的次数减一,一直到CX减完为止
处理器控制指令
CLC(clear c)#CF置零
STC(set c)#CF置1
CLD#DF置0
STD#DF置1
CLI#IF置0
STI#IF置1