常用命令
数据传送指令
一 通用数据传送指令
指令
|
英文全拼
|
翻译
|
MOV
|
Move
|
传送
|
PUSH
|
Push onto the stack
|
进栈
|
POP
|
Pop from the stack
|
出栈
|
XCHG
|
Exchange
|
交换
|
MOV指令为双操作数指令,两个操作数中不能全为内存操作数
格式:MOV DST,SRC
执行操作:dst = src
注:
1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器).
2.立即数不能直接送段寄存器
3.不允许在两个存储单元直接传送数据
4.不允许在两个段寄存器间直接传送信息
PUSH入栈指令及
POP出栈指令:
堆栈操作是以“后进先出”的方式进行数据操作。
格式:PUSH SRC //Word
执行操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(SRC)
注:
1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。
2.入栈时高位字节先入栈,低位字节后入栈。
格式:POP DST //Word
执行操作:(DST)<-((SP+1),(SP))
(SP)<-(SP)+2
注:
1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。
2.执行POP SS指令后,堆栈区在存储区的位置要改变。
3.执行POP SP 指令后,栈顶的位置要改变。
XCHG(eXCHanG)交换指令:
将两操作数值交换。
格式:XCHG OPR1,OPR2 //Byte/Word
执行的操作:(OPR1)<-->(OPR2)
注:1.必须有一个操作数是在寄存器中
2.不能与段寄存器交换数据
存储器与存储器之间不能交换数据。
二 累加器专用传送指令
指令
|
英文全拼
|
翻译
|
IN
|
Input
|
输入
|
OUT
|
Output
|
输出
|
XLAT
|
Translate
|
换码
|
IN 输入指令
长格式为:IN AL,PORT(字节)
IN AX,PORT(字)
执行的操作:(AL)<-(PORT)(字节)
(AX)<-(PORT+1,PORT)(字)
短格式为:IN AL,DX(字节)
IN AX,DX(字)
OUT 输出指令
长格式为:OUT PORT,AL(字节)
OUT PORT,AX(字)
执行的操作:(PORT)<-(AL)(字节)
(PORT+1,PORT)<-(AX)(字)
短格式为:OUT DX,AL(字节)
OUT DX,AX(字)
执行的操作:((DX))<-(AL)(字节)
((DX)+1,(DX))<-AX(字)
XLAT(TRANSLATE)换码指令:
把一种代码转换为另一种代码。
格式:XLAT (OPR 可选) //Byte
执行操作:(AL)<-((BX)+(AL))
注:指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码。
三 有效地址送寄存器指令
指令
|
英文全拼
|
翻译
|
LEA
|
Load effective address
|
有效地址送寄存器
|
LDS
|
Load DS with Pointer
|
指针送寄存器和DS
|
LES
|
Load ES with Pointer
|
指针送寄存器和ES
|
LEA(Load Effective Address) :
有效地址传送寄存器指令
格式:LEA REG,SRC //指令把源操作数SRC的有效地址送到指定的寄存器中。
执行操作:(REG)<-SRC
注:1. SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器
2.MOV BX,OFFSET OPER_ONE 等价于LEA BX,OPER_ONE
3.MOV SP,[BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中
4.LEA SP,[BX] //将BX的内容作为存储器有效地址送入SP中
LDS(Load DS with pointer):
指针送寄存器和DS指令
格式:LDS REG,SRC //常指定SI寄存器。
执行的操作:(REG)<-(SRC)
(DS)<-(SRC+2)
注:把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。
LES(Load ES with pointer) 指针送寄存器和ES指令
格式:LES REG,SRC //常指定DI寄存器
执行的操作:(REG)<-(SRC)
(ES)<-(SRC+2)//与LDS大致相同,不同之处是将ES代替DS而已。
注:把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令常指定DI寄存器。
四 标志寄存器传送指令
指令
|
英文全拼
|
翻译
|
LAHF
|
Load AH with flags
|
标志送AH
|
SAHF
|
store AH into flags
|
AH送标志寄存器
|
PUSHF
|
push the flags
|
标志进栈
|
POPF
|
pop the flags
|
标志出栈
|
LAHF ( Load AH with Flags )
标志位送AH指令
格式:LAHF ......
执行操作:(AH)<-(PWS的低字节)
注:将PSW寄存器中的低8位的状态标志(条件码)送入AH的相应位,SF送D7位,ZF送D6位
SAHF( Store AH into Flags )
AH送标志寄存器指令
格式:SAHF
执行操作: (PWS的低字节)<-(AH)
注:将AH寄存器的相应位送到PSW寄存器的低8位的相应位,AH的D7位送SF,D6位送ZF。
PUSHF( PUSH the Flags)
标志进栈指令
格式:PUSHF
执行操作:(SP)<-(SP)-2
SP=SP-1,(SP)=PSW的高8位,SP=SP-1,(SP)=PSW的低8位
注:将标志寄存器的值压入堆栈顶部,同时栈指针SP值减2
POPF( POP the Flags )
标志出栈指令
格式:POPF
执行操作:(PWS)<-((SP)+1,(SP))
(SP)<-(SP+2)
PSW低8位=(SP),SP=SP+1,PSW高8位=(SP),SP=SP+1
注:与PUSHF相反,从堆栈的顶部弹出两个字节送到PSW寄存器中,同时堆栈指针值加2
算术指令
一 加法指令
指令
|
英文全拼
|
翻译
|
ADD
|
add
|
加法
|
ADC
|
add with carry
|
带进位加法
|
INC
|
increment
|
加1
|
ADD(ADD)加法指令
格式:ADD DST,SRC //Byte/Word
执行操作: (DST)<-(SRC)+(DST)
注:1.两个存储器操作数不能通过ADD指令直接相加,即DST 和SRC必须有一个是通用寄存器操作数。
2.段寄存器不能作为SRC 和DST.
3.影响标志位Auxiliary Crray Flag,Carry Flag,Overflow Flag,Parity Flag,Sign Flag 和Zero Flag,如下所示:
CF 根据最高有效位是否有进(借)位设置的:有进(借)位时CF=1,无进(借)位时CF=0.
OF 根据操作数的符号及其变化来设置的:若两个操作数的符号相同,而结果的符号与之相反时OF=1,否则为0.
ZF 根据结果来设置:不等于0时ZF=0,等于0时ZF=1
SF 根据结果的最高位来设置:最高位为0,则SF=0.
AF 根据相加时D3是否向D4进(借)位来设置:有进(借)位时AF=1,无进(借)位时AF=0
PF 根据结果的1的个数时否为奇数来设置:1的个数为奇数时PF=0,为偶数时PF=1
ADC( ADd with Carry)带进位加法指令
格式:ADC DST,SRC //Byte/Word
执行操作: (DST)<-(SRC)+(DST)+CF
注:与ADD不同之处是还要加上进位标志位的值。
INC( INCrement) 加1指令
格式:INC OPR //Byte/Word
执行操作: (OPR)<-(OPR)+1
注:1.OPR可以是寄存器和存储器操作数,但不能是立即数和段寄存器
2.影响标志位OF,SF,ZF,PF 和AF,不影响CF.
二 减法指令
指令
|
英文全拼
|
翻译
|
SUB
|
subtract
|
减法
|
SBB
|
subtract with borrow
|
带借位减法
|
DEC
|
Decrement
|
减1
|
NEG
|
Negate
|
求补
|
CMP
|
Compare
|
比较
|
SUB( SUBtract ) 不带借位的减法指令
格式:SUB DST,SRC //Byte/Word
执行操作:(DST)<-(DST)-(SRC)
注:1.DST和SRC寻址方式及规定与ADD相同。
2.影响全部标志位。(判断标志位参见ADD)
SBB ( SuBtract with Borrow) 带借位减法指令
格式:SBB DST,SRC //Byte/Word
执行操作:(DST)<-(DST)-(SRC)-CF
DEC( DECrement ) 减1指令
格式:DEC OPR //Byte/Word
执行操作:(OPR)<-(OPR)-1//除CF标志位,其余标志位都受影响。
NEG( NEGate ) 求补指令
格式:NEG OPR
执行操作:(OPR)<- -(OPR) //将操作数按位求反后末位加1.
CMP ( CoMPare ) 比较指令
格式:CMP OPR1,OPR2
执行操作:(OPR1)-(OPR2) //与SUB指令一样执行运算,但不保存结果。
注:该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志。
比较情况
|
无符号数
|
有符号数
|
A=B
|
ZF=1
|
ZF=1
|
A>B
|
CF=0 && ZF=0
|
SF^OF=0 && ZF=0
|
A<B
|
CF=1 && ZF=0
|
SF^OF=1 && ZF=0
|
A>=B
|
CF=0 || ZF=1
|
SF^OF=0 || ZF=1
|
A<=B
|
CF=1 || ZF=1
|
SF^OF=1 || ZF=1
|
三 乘法指令
指令
|
英文全拼
|
翻译
|
MUL
|
Unsigned Multiple
|
无符号数乘法
|
IMUL
|
Signed Multiple
|
带符号数乘法
|
MUL( unsigned MULtiple ) 无符号数乘法指令
格式:MUL SRC //Byte/Word .
执行操作:字操作:(AX)<-(AL)*(SRC) //字节运算时目的操作数用AL,乘积放在AX中
字节操作: (DX,AX)<-(AX)*(SRC) //字运算时目的操作数用AX,DX存放乘积的高位字,AX放乘积的低位字
注:1.目的数必须是累加器AX 或AL,指令中不需写出
源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数,而绝对不允许是立即数或段寄存器。
IMUL(sIgned MULtiple) 有符号数乘法指令
格式:IMUL SRC //与MUL指令相同,但必须是带符号数
四 除法指令
指令
|
英文全拼
|
翻译
|
DIV
|
Unsigned divide
|
无符号数除法
|
IDIV
|
Signed divide
|
带符号数除法
|
CBW
|
Convert byte to word
|
字节转换为字
|
CWD
|
Contert word to double word
|
字转换为双字
|
DIV ( unsigned DIVide) 无符号数除法指令
格式:DIV SRC //Byte/Word 其中:SRC的规定同乘法指令MUL
执行操作:字节操作:(AL)<-(AX)/(SRC)的商
(AH)<-(AX)/(SRC)的余数
字操作:(AX)<-(DX,AX)/(SRC)的商
(DX)<-(DX,AX)/(SRC)的余数
注:存储器操作数必须指明数据类型:BYTE PTR src 或WORD PTR src
IDIV (sIgned DIVied) 有符号数除法指令
格式:IDIV SRC
执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同。
CBW(Convert Byte to Word) 字节转换为字指令
格式:CBW
执行操作:AL中的符号位(D7)扩展到8位AH中,若AL中的D7=0,则AH=00H,若AL中的D7=1,则AH=FFH.
CWD(Convert Word to Double word) 字转换为双字指令
格式:CWD
执行操作:AX中的符号位(D15)扩展到16位DX中,若AX中的D15=0,则DX=0000H,若AX中的D15=1,则DX=FFFFH
注:这两条指令都不影响条件码。
逻辑指令
一逻辑运算指令
指令
|
英文全拼
|
翻译
|
AND
|
and
|
逻辑与
|
OR
|
or
|
逻辑或
|
NOT
|
not
|
逻辑非
|
XOR
|
exclusive or
|
异或
|
TEST
|
test
|
测试
|
AND,OR,XOR和
TEST都是双字节操作指令,操作数的寻址方式的规定与算术运算指令相同。
NOT是单字节操作指令,不允许使用立即数。
逻辑运算均是按位进行操作,真值表如下:
AND (位与&)
|
OR ( 位或| )
|
XOR ( 位异或^ )
|
1& 1 = 1
|
1 | 1 = 1
|
1 ^ 1 = 0
|
1 & 0 = 0
|
1 | 0 = 1
|
1 ^ 0 = 1
|
0 & 1 = 0
|
0 | 1 = 1
|
0 ^ 1 = 1
|
0 & 0 = 0
|
0 | 0 = 0
|
0 ^ 0 = 0
|
AND(and) 逻辑与指令
格式:AND DST,SRC //Byte/Word
执行操作:(DST)<-(DST)^(SRC)
注:1.AND指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位。
2.AND指令典型用法A:用于屏蔽某些位,即使某些位为0.
例子:屏蔽AL的高4位:即将高4位和0000B相与,低4位和1111B相与
MOV AL,39H //AL= 0011 1001B[39H]
ADD AL,0FH // AL= 0000 1001B[09H] 即0011 1001B[39H] & 0000 1111B[0FH] = 0000 1001B[09H]
AND指令典型用法B:取出某一位的值(见TEST)
OR(or) 逻辑或指令
格式:OR DST,SRC //Byte/Word
执行操作:(DST)<-(DST) | (SRC)
注:1.OR指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位。
2.常用于将某些位置1.
例子:将AL的第5位置1:
MOV AL,4AH // AL=0100 1010B[4AH]
OR AL,10H // AL=0101 1010B[5AH] 即0100 1010B[4AH] | 0001 0000B[10H] =0101 1010B [5AH]
XOR(eXclusive OR) 逻辑异或指令
格式:XOR DST,SRC //Byte/Word
执行操作:(DST)<-(DST)^(SRC)
注:1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志。
2.XOR指令使某些位维持不变则与'0' 相异或,若要使某些位取反则与'1'相异或。
例子:将AL的高4位维持不变,低4位取反:
MOV AL,B8H //AL=1011 1000B[B8H]
XOR AL,0FH //AL=1011 0111B[B7H] 即1011 1000B[B8H] ^ 0000 1111[0FH]=1011 0111B[B7H]
例子:测试某一个操作数是否与另一确定操作数相等:
XOR AX,042EH
JZ .... //如果AX==042EH,则ZF=TRUE(1),执行JZ...
NOT (not) 逻辑非指令
格式:NOT OPR //Byte/Word
执行操作:(OPR)<~(OPR) // ~ 01100101 [65H] =10011010 [9AH]
1.操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数。
2.NOT指令不影响任何标志位。
例子:将AL各位取反:
MOV AL,65H //AL=0110 0101B[65H]
NOT AL //AL=1001 1010B[9AH] 即~ 0110 0101B[65H]=1001 1010B[9AH]
TEST(test) 指令
格式:TEST OPR1,OPR2 //Byte/Word
执行操作:opr1 & opr2
注:1.两个操作数相与的结果不保存,结果影响标志位PF,SF和ZF,使CF=0,OF=0,而AF位无定义。
2.TEST指令常用于在不改变原有的操作数的情况下,检测某一位或某几位的条件是否满足。只要令用来测试的操作数对应检测位为1,其余位为0,相与后判断零标志ZF值的真假。
例:检测某位是否为1:
令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则JNZ...
TEST AL,0000 00001B //测试AL最低位是否为1:: 令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
JNZ THER //最低位若为1,则ZF=FALSE(0),执行JNZ THER,否则执行下一条指令。
或者:先对操作数求反,令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则JZ...
MOV DL,AL //将AL 传送到DL,主要是不要影响AL的值。 以下测试AL的b2位是否为1
NOT DL //先对操作数求反
TEST 0000 0100B //令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
JZ THER //若AL的b2位为1,则ZF=TRUE(1),执行JZ THER
B:移位指令[所有的移位指令都影响标志位
CF、OF、PF、SF和
ZF、AF无定义。]
非循环逻辑移位:把操作数看成无符数来进行移位。
移位指令
指令
|
英文全拼
|
翻译
|
SHL
|
shift logical left
|
逻辑左移
|
SAL
|
shift arithmetic left
|
算术左移
|
SHR
|
shift logical right
|
逻辑右移
|
SAR
|
shift arithmetic right
|
算术右移
|
ROL
|
Rotate left
|
循环左移
|
ROR
|
Rotate right
|
循环右移
|
RCL
|
Rotate left through carry
|
带进位循环左移
|
RCR
|
Rotate right through carry
|
带进位循环右移
|
SHL( SHift logical Left )逻辑左移指令
格式:SHL OPR,CNT //Byte/Word
执行操作:使OPR左移CNT位,并使最低CNT位为全0.
1.OPR操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数。
2.移位次数由CNT决定。每次将OPR的最高位移出并移到CF,最低位补0.
MOV CL,7 //若移位多次,先预置移位次数CL
SHL DX,CL //CNT可取1或CL寄存器操作数
SHR(SHift logical Right) 逻辑右移指令
格式:SHR OPR,CNT //Byte/Word
执行操作:同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.
非循环算术移位:将操作数看成有符号数来进行移位。
SAL(Shift Arithmetic Left) 算术左移指令
格式:SAL OPR,CNT //Byte/Word
执行操作:SAL指令与SHL指令完全相同
SAR(Shift Arithmetic Right) 算术右移指令
格式:SAR OPR,CNT //Byte/Word
执行操作:SAR指令每次移位时,将最高位移入次高位的同时最高位值不变,最低位D0移出并移到CF.
循环移位指令
ROL( ROtate Left) 循环左移指令
格式:ROL OPR,CNT //Byte/Word
执行操作:每次移位时,最高位移出并同时移到CF和最低位D0.
ROR (ROtate Right)循环右移指令
格式:ROR OPR,CNT //Byte/Word
执行操作:每次移位时,最低位D0移出并同时移到CF和最高位。
带进位循环移位指令
RCL(Rotate Left through Carry)带进位循环左移指令
格式:RCL OPR,CNT //Byte/Word
RCR (Rotate Right through Carry)带进位循环右移指令
格式:RCR OPR,CNT //Byte/Word
串处理指令
一 与REP相配合工作的MOVS,STOS和LODS指令
指令
|
英文全拼
|
翻译
|
REP
|
repeat
|
重复操作
|
MOVS
|
MOVe String
|
串传送指令
|
STOS
|
STOre into String
|
存入串指令
|
LODS
|
LOaD from String
|
从串取指令
|
CLD
|
Clear direction flag
|
使地址自动增量
|
STD
|
Set direction flag
|
使地址自动减量
|
REP(REPeat)重复操作前缀
格式:REP String Primitive
执行的操作:
1)如(CX)=0则退出REP,否则往下执行。
2)(CX)<-(CX)-1
3)执行其中的串操作
4)重复1)~3)
注:其中String Primitive可为MOVS,LODS或STOS指令
.MOVS 串传送指令
格式:MOVS ES:BYTE PTR[DI],DS:[SI]
可有三种
MOVS DST,SRC
MOVSB//字节串传送DF=0,SI = SI + 1,DI = DI + 1 ;DF = 1,SI = SI - 1,DI = DI
MOVSW//字串传送DF=0,SI = SI + 2,DI = DI + 2 ;DF = 1,SI = SI - 2,DI = DI - 2
MOVSD//双字串传送DF=0,SI = SI + 4,DI = DI + 4 ;DF = 1,SI = SI - 4,DI = DI - 4
MOVSX//符号传送
MOVZX//零传送
执行的操作:
1)如(CX)=0则退出REP,否则往下执行。
2)(CX)<-(CX)-1
3)执行其中的串操作
4)重复1)~3)
.MOVS 串传送指令
注:当方向标志DF=1时用,其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
1)((DI))<-((SI))
2)字节操作: (SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1//当方向标志DF=0时用
3)字操作: (SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2当方向标志DF=0时用//当方向标志DF=1时用-
该指令不影响条件码。
STOS(STOre into String) 存入串指令
格式:STOS DST
STOSB //存放字节串( DI ) = AL
STOSW //存放字串( DI ) = AX
执行操作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容。
字节操作:((DT))←(AL),(DI)←(DI)±1
字操作:((DI))←(AX),(DI)←(DI)±2
注:1.在执行该指令之前,必须把要存入的数据预先存入AX或AL中,必须预置DI的初值。
2.DI所指向的存储单元只能在附加段中,即必须是ES:[DI]
3.该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的
缓冲区中。
LODS ( LOaD from String ) 从串取指令
格式:LODS SRC
LODSB //从字节串取AL=(SI)
LODSW //从字串取AX= (SI±1) (SI)
执行操作:字节操作:(AL)<-((SI)),(SI)<-(SI)+-1
字操作:(AX)<-((SI)),(SI)<-(SI)+-2
把由SI指定的数据段中字节或字单元的内容送入AL或AX中,并根据DF值及数据类型修改SI的内容。
注:1.在执行该指令之前,要取的数据必须在存储器中预先定义(用DB或DW),必须预置SI的初值。
2.源串允许使用段超越前缀来改变数据存储的段区。
3.该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容。指令允许使用段跨越前缀来指定非数据段的存储区。该指令也不影响条件码。
4.一般说来,该指令不和REP联用。有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令。
CLD(CLear Direction flag) 清除方向标志指令
格式:CLD
执行操作:令DF=0,其后[SI],[DI]执行增量操作
该指令使DF=0,在执行串操作指令时可使地址自动增量
STD(SeT Direction flag) 设置方向标志指令
格式:STD
执行操作:令DF=1,其后[SI],[DI]执行减量操作
该指令使DF=1,在执行串操作指令时可使地址自动减量。
二与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令
指令
|
英文全拼
|
翻译
|
REPE/REPZ
|
Repeat Equal to Zero
|
等于零时重复操作
|
REPNE/REPNZ
|
Repeat Not Equal to Zero
|
不等于零时重复操作
|
CMPS
|
CoMPare String
|
串比较指令
|
SCAS
|
SCAn String
|
串扫描指令
|
.
REPE/REPZ 当相等/为零时重复串操作
格式:REPE(或REPZ) String Primitive
其中String Primitive可为CMPS或SCAS指令。
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
2)(CX)<-(CX)-1
3)执行其后的串指令
4)重复1)~3)
.
REPNE/REPNZ 当不相等/不为零时重复串操作
格式:REPNE(或REPNZ) String Primitive
其中String Primitive可为CMPS或SCAS指令
执行的操作:
除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同。
CMPS(CoMPare String) 串比较指令
格式:CMPS SRC,DST
CMPSB //字节串比较(SI)-(DI)
CMPSW //字串比较(SI+1)(SI) - (DI+1)(DI)
执行操作:把由SI指向的数据段中的一个字节或字与由DI指向的附加段中的一个字节或字相减,不保留结果,只根据结果置标志位。
1)((SI))-((DI))
2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1
字操作:(SI)<-(SI)+-2,(DI)<-(DI)+-2
注:指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同。
.
SCAS (SCAn String ) 串扫描指令
格式:SCAS DST
SCASB
SCASW
执行操作:把AX或AL的内容与由DI指向的在附加段中的一个字节或字相减,不保留结果,根据结果置标志位。
字节操作:(AL)-((DI)),(DI)<-(DI)+-1
字操作:(AL)-((DI)),(DI)<-(DI)+-2
注:该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码。指令的其他特性和MOVS的规定相同。
控制转移指令
一
JMP ( JuMP ) 无条件转移指令
名称
|
格式
|
执行操作
|
段内直接短跳转
|
JMP SHORT OPR
|
IP=IP+8 位偏移量
|
段内直接近转移
|
JMP NEAR PTR OPR
|
IP=IP+16位偏移量
|
段内间接转移
|
JMP WORD PTR OPR
|
IP=(EA)
|
段间直接转移
|
JMP FAR PTR OPR
|
IP=OPR 偏移地址,CS=OPR 段地址
|
段间间接转移
|
JMP DWORD PTR OPR
|
IP=(EA),CS=(EA+2)
|
1)段内直接短转移
格式:JMP SHORT OPR
执行的操作:(IP)<-(IP)+8位位移量
2)段内直接近转移
格式:JMP NEAR PTR OPR
执行的操作:(IP)<-(IP)+16位位移量
3)段内间接转移
格式:JMP WORD PTR OPR
执行的操作:(IP)<-(EA)
4)段间直接(远)转移
格式:JMP FAR PTR OPR
执行的操作:(IP)<-OPR的段内偏移地址
(CS)<-OPR所在段的段地址
5)段间间接转移
格式:JMP DWORD PTR OPR
执行的操作:(IP)<-(EA)
(CS)<-(EA+2)
1.无条件转移到指定的地址去执行从该地址开始的指令。
2.段内转移是指在同一代码段的范围内进行转移,只需改变IP寄存器内容。
3.段间转移则要转移到另一个代码段执行程序,此时要改变IP寄存器和CS段寄存器的内容。
二 条件转移指令:
指令
|
英文全拼
|
翻译
|
JZ/JE
|
Jump if zero,or equal
|
结果为零(或相等)则转移
|
JNZ/JNE
|
Jump if not zero,or not equal
|
结果不为零(或不相等)则转移
|
JS
|
Jump if sign
|
结果为负则转移
|
JNS
|
Jump if not sign
|
结果为正则转移
|
JO
|
Jump if overflow
|
溢出则转移
|
JNO
|
Jump if not overflow
|
不溢出则转移
|
JP/JPE
|
Jump if parity,or parity even
|
奇偶位为1则转移
|
JNP/ JPO
|
Jump if not parity,or parity odd
|
奇偶位为0则转移
|
JB/JNAE/JC
|
Jump if below,or not above or equal,or carry
|
低于,或者不高于或等于,或进位位为1则转移
|
JNB/JAE/JNC
|
Jump if not below,or above or equal,or not carry
|
不低于,或者高于或者等于,或进位位为0则转移
|
根据上一条指令所设置的条件码(标志位)来判断测试条件。
JZ(或
JE)(Jump if zero,or equal) 结果为零(或相等)则转移
格式:JE(或JZ) OPR
测试条件:ZF=1
.
JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移
格式:JNZ(或JNE) OPR
测试条件:ZF=0
.JS(Jump if sign) 结果为负则转移
格式:JS OPR
测试条件:SF=1
.JNS(Jump if not sign) 结果为正则转移
格式:JNS OPR
测试条件:SF=0
.JO(Jump if overflow) 溢出则转移
格式:JO OPR
测试条件:OF=1
.JNO(Jump if not overflow) 不溢出则转移
格式:JNO OPR
测试条件:OF=0
.JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移
格式:JP OPR
测试条件:PF=1
.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移
格式:JNP(或JPO) OPR
测试条件:PF=0
.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位位为1则转移
格式:JB(或JNAE,JC) OPR
测试条件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或进位位为0则转移
格式:JNB(或JAE,JNC) OPR
测试条件:CF=0
2)比较两个无符号数,并根据比较的结果转移
.JB(或JNAE,JC)
格式:同上
.JNB(或JAE,JNC)
格式:同上
.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移
格式:JBE(或JNA) OPR
测试条件:CFVZF=1
.JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移
格式:JNBE(或JA) OPR
测试条件:CFVZF=0
根据五个标志位:ZF、SF、OF、PF、CF的两种状态(0 FALSE或1 TRUE)产生10种测试条件。
名称
|
简写
|
格式
|
Flag == TRUE [1]
|
Flag ==FALSE [ 0]
|
Zero Falg
|
ZF
|
JE/JZOPR
|
结果为零转移
JNE/JNZOPR
|
结果不为零转移
|
Sign Falg
|
SF
|
JS OPR
|
结果为负转移
JNSOPR
|
结果为正转移
|
Overflow Flag
|
OF
|
JO OPR
|
溢出转移
JNOOPR
|
不溢出转移
|
Parity Flag
|
PF
|
JP/JPE OPR
|
结果为偶转移
JNP/JPOOPR
|
结果为奇转移
|
Carry Flag
|
CF
|
JC OPR
|
有进位转移
JNCOPR
|
无进位转移
|
情况
|
指令
|
满足条件
|
指令
|
满足条件
|
A < B
|
JC
|
CF==1
|
JL
|
SF^OF==1&& ZF==0
|
A ≥ B
|
JNC
|
CF==0
|
JNL
|
SF^OF==0 || ZF==1
|
A ≤ B
|
JNA
|
CF==1 || ZF==1
|
JLG
|
SF^OF==1 || ZF==1
|
A > B
|
JA
|
CF==0 && ZF==0
|
JG
|
SF^OF==0 && ZF==0
|
三 比较两个无符号数,并根据比较的结果转移
指令
|
英文全拼
|
翻译
|
JB/JNAE/JC
|
Jump if less,or not greater or equal
|
小于,或者不大于或者等于则转移
|
JNB/JAE/JNC
|
Jump if not less,or greater or equal
|
不小于,或者大于或者等于则转移
|
JBE/JNA
|
Jump if below or equal,or not above
|
低于或等于,或不高于则转移
|
JNBE/JA
|
Jump if not below or equal,or above
|
不低于或等于,或者高于则转移
|
.JB(或JNAE,JC)
格式:同上
.JNB(或JAE,JNC)
格式:同上
.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移
格式:JBE(或JNA) OPR
测试条件:CFVZF=1
.JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移
格式:JNBE(或JA) OPR
测试条件:CFVZF=0
四 比较两个带符号数,并根据比较的结果转移
指令
|
英文全拼
|
翻译
|
JL/LNGE
|
Jump if less,or not greater or equal
|
小于,或者不大于或者等于则转移
|
JNL/JGE
|
Jump if not less,or greater or equal
|
不小于,或者大于或者等于则转移
|
JLE/JNG
|
Jump if less or equal,or not greater
|
小于或等于,或者不大于则转移
|
JNLE/JG
|
Jump if not less or equal,or greater
|
不小于或等于,或者大于则转移
|
.JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移
格式:JL(或JNGE) OPR
测试条件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移
格式:JNL(或JGE) OPR
测试条件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移
格式:JLE(或JNG) OPR
测试条件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移
格式:JNLE(或JG) OPR
测试条件:(SFVOF)VZF=0
五 测试CX的值为0则转移指令
.JCXZ(Jump if CX register is zero) CX寄存器的内容为零则转移
格式:JCXZ OPR//CX==0时转移
测试条件:(CX)=0
注:条件转移全为8位短跳!
六 循环指令
LOOP(LOOP)循环指令
格式:LOOP OPR
测试条件:CX ≠ 0 //OPR在程序中实际是个标号
.
LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式:LOOPNZ(或LOOPNE) OPR
测试条件:(CX)<>0且ZF=0
注:这三条指令的步骤是:
1)(CX)<-(CX)-1
2)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充。
过程调用及返回指令
CALL(CALL) 过程调用指令
格式:CALL DST //DST在程序中实际是子程序标号
执行操作:先将过程的返回地址(即CALL的下一条指令的首地址)存入堆栈,然后转移到过程入口地址执行子程序。
调用方式
|
格式
|
断点保护入栈情况
|
过程入口地址
|
段内直接
|
CALL NEAR PTR PR1
|
(SP-1)(SP-2)←IP,CS不进栈CS值保持不变
|
IP←DST
|
段内间接
|
CALL WORD PTR (EA)
|
(SP-1)(SP-2)←IP,CS不进栈CS值保持不变
|
IP←(EA)
|
段间直接
|
CALL FAR PTR PR1
|
(SP-1)(SP-2)←CS,(SP-3)(SP-4)←IP
|
IP←DST偏移地址CS←DST段地址
|
段间间接
|
CALL DWORD PTR (EA)
|
(SP-1)(SP-2)←CS,(SP-3)(SP-4)←IP
|
IP←(EA),CS←(EA+2)
|
注:为了表明是段内调用,可使用NEAR PTR属性操作符作说明。
RET(RETurn)子程序返回指令
格式:RET
RET EXP //带立即数返回
注:子程序返回指令RET放在子程序末尾,它使子程序在执行完全部任务后返回主程序继续执行被打断后的程序。返回地址在子程序调用时入栈保存的断点地址-IP或IP和CS.
中断指令
.
INT指令
格式:INT TYPE
或INT
执行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(TYPE*4)
(CS)<-(TYPE*4+2)
.INTO 若溢出则中断
执行的操作:若OF=1则:
(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(10H)
(CS)<-(12H)
.IRET 从
中断返回指令
格式:IRET
执行的操作:(IP)<-((SP)+1,(SP))
(SP)<-(SP)+2
(CS)<-((SP)+1,(SP))
(SP)<-(SP)+2
(PSW)<-((SP)+1,(SP))
(SP)<-(SP)+2
处理机控制指令
一标志处理指令
指令
|
英文全拼
|
翻译
| |
CLC
|
Clear carry
|
进位位置0指令
|
CF<-0
|
CMC
|
Complement carry
|
进位位求反指令
|
CF<-CF
|
STC
|
Set carry
|
进位位置1指令
|
CF<-1
|
CLD
|
Clear direction
|
方向标志置0指令
|
DF<-0
|
STD
|
Set direction
|
方向标志置1指令
|
DF<-1
|
CLI
|
Clear interrupt
|
中断标志置0指令
|
IF<-0
|
STI
|
Set interrupt
|
中断标志置1指令
|
IF<-0
|
二其他处理机控制指令
指令
|
英文全拼
|
翻译
|
NOP
|
No Opreation
|
无操作
|
HLT
|
Halt
|
停机
|
WAIT
|
Wait
|
等待
|
ESC
|
Escape
|
换码
|
LOCK
|
Lock
|
封锁
|
处理器控制指令
CLC(CLear Carry) 进位位置0指令
格式:CLC //执行操作后,CF=0
CMC(CoMplement Carry) 进位位求反指令
格式:CMC //执行操作后,CF=!CF
STC (SeT Carry) 进位位置1指令
格式:STC //执行操作后,CF=1
HLT (HaLT) 停机指令
格式:HLT
执行操作:使机器暂停工作,使处理器CPU处于停机状态,以等待一次外部中断到来,中断结束后,程序继续执行,CPU继续工作。
注:该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序。
NOP(No Operetion) 无操作指令
格式:NOP //此指令不执行任何操作,其机器码占一个字节单元
该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代。
.WAIT等待指令
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续执行。
.
ESC换码指令
格式ESC mem
其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去。当然ESC指令不允许使用立即数和寄存器寻址方式。这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数。协处理机(如8087)则是为了提高速度而可以选配的硬件。
.
LOCK封锁指令
该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止。当CPU与其他处理机协同工作时,该指令可避免破坏有用信息。
十进制调整指令
当计算机进行计算时,必须先把十进制数转换为
二进制数,再进行二进制数运算,最后将结果又转换为十进制数输出。
在计算机中,可用4位二进制数表示一位十进制数,这种代码称为BCD ( Binary Coded Decimal ).
压缩的BCD码用4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串。
非压缩的BCD码以8位为一组表示一个十进制数,8位中的低4位表示8421的BCD码,而高4位则没有意义。
指令
|
英文全拼
|
翻译
|
DAA
|
Decimal Adjust for Addition
|
加法的十进制调整指令
|
DAS
|
Decimal Adjust for Subtraction
|
减法的十进制调整指令
|
AAA
|
ASCII Adjust for Addition
|
加法的ASCII调整指令
|
AAS
|
ASCII Adjust for Subtraction
|
减法的ASCII调整指令
|
DAA(Decimal Adjust for Addition) 加法的十进制调整指令
格式:DAA
执行操作:执行之前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中。
DAS(Decimal Adjust for Subtraction) 减法的十进制调整指令
格式:DAS
执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个压缩的BCD码相减,并氢结果存放在AL寄存器中。
非压缩的BCD码调整指令
AAA(ASCII Adjust for Addition) 加法的ASCII调整指令
格式:AAA
执行操作:执行之前必须先执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存话在AL寄存器中。
AAS(ASCII Adjust for Subtraction) 减法的ASCII调整指令
格式:AAS
执行操作:执行之前必须先执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减,并氢结果存放在AL寄存器中。
执行操作:[DI] = [SI],将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元,再修改SI和DI,从而指向下一个元素。
在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值。
格式:MOVS DST,SRC //同上,不常用,DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数。
1.目的串必须在附加段中,即必须是ES:[DI]
2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI].