A>=BCF=0||ZF=1SF^OF=0||ZF=1
A<=BCF=1||ZF=1SF^OF=1||ZF=1
MUL(unsignedMULtiple)无符号数乘法指令
MULSRC//Byte/Word.
执行操作:
Byte=>AX=AL*src//字节运算时目的操作数用AL,乘积放在AX中
Word=>DX=AX*src//字运算时目的操作数用AX,DX存放乘积的高位字,AX放乘积的低位字
1.目的数必须是累加器AX或AL,指令中不需写出
2.源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数,而绝对不允许是立即数或段寄存器。
IMUL(sIgnedMULtiple)有符号数乘法指令
IMULSRC//与MUL指令相同,但必须是带符号数
DIV(unsignedDIVide)无符号数除法指令
DIVSRC//Byte/Word其中:
SRC的规定同乘法指令MUL
执行操作:
Byte=>AX/src//字节运算时目的操作数在AX中,结果的商在AL中,余数在AH中
Word=>DX,AX/src//字运算时目的操作数在DX高位字和AX低位字中,结果的商在AX中,余数在DX中
存储器操作数必须指明数据类型:
BYTEPTRsrc或WORDPTRsrc
IDIV(sIgnedDIVied)有符号数除法指令
IDIVSRC//Byte/Word与DIV指令相同,但必须是带符号数
CBW(ConvertBytetoWord)字节转换为字指令
CBW
执行操作:
AL中的符号位(D7)扩展到8位AH中,若AL中的D7=0,则AH=00H,若AL中的D7=1,则AH=FFH.
CWD(ConvertWordtoDoubleword)字转换为双字指令
CWD
执行操作:
AX中的符号位(D15)扩展到16位DX中,若AX中的D15=0,则DX=0000H,若AX中的D15=1,则DX=FFFFH
十进制调整指令
当计算机进行计算时,必须先把十进制数转换为二进制数,再进行二进制数运算,最后将结果又转换为十进制数输出。
在计算机中,可用4位二进制数表示一位十进制数,这种代码称为BCD(BinaryCodedDecimal).
BCD码又称8421码,在PC机中,BCD码可用压缩的BCD码和非压缩的BCD码两种格式表示。
压缩的BCD码用4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串。
非压缩的BCD码以8位为一组表示一个十进制数,8位中的低4位表示8421的BCD码,而高4位则没有意义。
压缩的BCD码调整指令
DAA(DecimalAdjustforAddition)加法的十进制调整指令
DAA
执行操作:
执行之前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存话在AL寄存器中。
DAS(DecimalAdjustforSubtraction)减法的十进制调整指令
DAS
执行操作:
执行之前必须先执行SUB或SBB指令,减法指令必须把两个压缩的BCD码相减,并氢结果存放在AL寄存器中。
非压缩的BCD码调整指令
AAA(ASCIIAdjustforAddition)加法的ASCII调整指令
AAA
执行操作:
执行之前必须先执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存话在AL寄存器中。
AAS(ASCIIAdjustforSubtraction)减法的ASCII调整指令
AAS
执行操作:
执行之前必须先执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减,并氢结果存放在AL寄存器中。
MOVS(MOVeString)串传送指令
MOVB//字节串传送DF=0,SI=SI+1,DI=DI+1;DF=1,SI=SI-1,DI=DI-1
MOVW//字串传送DF=0,SI=SI+2,DI=DI+2;DF=1,SI=SI-2,DI=DI-2
执行操作:
[DI]=[SI],将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI所指出的存储单元,再修改SI和DI,从而指向下一个元素。
在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值。
MOVSDST,SRC//同上,不常用,DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数。
1.目的串必须在附加段中,即必须是ES:
[DI]
2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI].
STOS(STOreintoString)存入串指令
STOSDST
STOSB//存放字节串(DI)=AL
STOSW//存放字串(DI)=AX
执行品作:
把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容。
1.在执行该指令之前,必须把要存入的数据预先存入AX或AL中,必须预置DI的初值。
2.DI所指向的存储单元只能在附加段中,即必须是ES:
[DI]
LODS(LOaDfromString)从串取指令
LODSSRC
LODSB//从字节串取AL=(SI)
LODSW//从字串取AX=(SI±1)(SI)
执行操作:
把由SI指定的数据段中字节或字单元的内容送入AL或AX中,并根据DF值及数据类型修改SI的内容。
1.在执行该指令之前,要取的数据必须在存储器中预先定义(用DB或DW),必须预置SI的初值。
2.源串允许使用段超越前缀来改变数据存储的段区。
REP(REPeat)重复操作前缀
REPStringPrimitive//其中:
StringPrimitive可为MOVS,STOS或LODS指令
执行操作:
使REP前缀后的串指令重复执行,每执行一次CX=CX-1,直至CX=0时退出REP.
方向标志设置
CLD(CLearDirectionflag)清除方向标志指令
CLD
执行操作:
令DF=0,其后[SI],[DI]执行增量操作
STD(SeTDirectionflag)设置方向标志指令
STD
执行操作:
令DF=1,其后[SI],[DI]执行减量操作
CMPS(CoMPareString)串比较指令
CMPSSRC,DST
CMPSB//字节串比较(SI)-(DI)
CMPSW//字串比较(SI+1)(SI)-(DI+1)(DI)
执行操作:
把由SI指向的数据段中的一个字节或字与由DI指向的附加段中的一个字节或字相减,不保留结果,只根据结果置标志位。
SCAS(SCAnString)串扫描指令
SCASDST
SCASB
SCASW
执行操作:
把AX或AL的内容与由DI指向的在附加段中的一个字节或字相减,不保留结果,根据结果置标志位。
AND,OR,XOR和TEST都是双字节操作指令,操作数的寻址方式的规定与算术运算指令相同。
NOT是单字节操作指令,不允许使用立即数。
逻辑运算均是按位进行操作,真值表如下:
AND(位与&)OR(位或|)XOR(位异或^)
1.&1=11|1=11^1=0
1.&0=01|0=11^0=1
0&1=00|1=10^1=1
0&0=00|0=00^0=0
A:
逻辑运算指令
AND(and)逻辑与指令
ANDDST,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相与
MOVAL,39H//AL=00111001B[39H]
ADDAL,0FH//AL=00001001B[09H]即00111001B[39H]&00001111B[0FH]=00001001B[09H]
3.AND指令典型用法B:
取出某一位的值(见TEST)
OR(or)逻辑或指令
ORDST,SRC//Byte/Word
执行操作:
dst=dst|src
1.OR指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位。
2.常用于将某些位置1.
将AL的第5位置1:
MOVAL,4AH//AL=01001010B[4AH]
ORAL,10H//AL=01011010B[5AH]即01001010B[4AH]|00010000B[10H]=01011010B[5AH]
XOR(eXclusiveOR)逻辑异或指令
XORDST,SRC//Byte/Word
执行操作:
dst=dst^src
1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志。
2.XOR指令使某些位维持不变则与'0'相异或,若要使某些位取反则与'1'相异或。
将AL的高4位维持不变,低4位取反:
MOVAL,B8H//AL=10111000B[B8H]
XORAL,0FH//AL=10110111B[B7H]即10111000B[B8H]^00001111[0FH]=10110111B[B7H]
测试某一个操作数是否与另一确定操作数相等:
XORAX,042EH
JZ....//如果AX==042EH,则ZF=TRUE
(1),执行JZ...
NOT(not)逻辑非指令
NOTOPR//Byte/Word
执行操作:
opr=~opr//~01100101[65H]=10011010[9AH]
1.操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数。
2.NOT指令不影响任何标志位。
将AL各位取反:
MOVAL,65H//AL=01100101B[65H]
NOTAL//AL=10011010B[9AH]即~01100101B[65H]=10011010B[9AH]
TEST(test)指令
TESTOPR1,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...
TESTAL,000000001B//测试AL最低位是否为1:
:
令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
JNZTHER //最低位若为1,则ZF=FALSE(0),执行JNZTHER,否则执行下一条指令。
或者:
先对操作数求反,令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则JZ...
MOVDL,AL//将AL传送到DL,主要是不要影响AL的值。
以下测试AL的b2位是否为1
NOTDL//先对操作数求反
TEST00000100B//令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令
JZTHER//若AL的b2位为1,则ZF=TRUE
(1),执行JZTHER
B:
移位指令[所有的移位指令都影响标志位CF、OF、PF、SF和ZF、AF无定义。
]
非循环逻辑移位:
把操作数看成无符数来进行移位。
SHL(SHiftlogicalLeft)逻辑左移指令
SHLOPR,CNT//Byte/Word
执行操作:
使OPR左移CNT位,并使最低CNT位为全0.
1.OPR操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数。
2.移位次数由CNT决定。
每次将OPR的最高位移出并移到CF,最低位补0.
MOVCL,7//若移位多次,先预置移位次数CL
SHLDX,CL//CNT可取1或CL寄存器操作数
SHR(SHiftlogicalRight)逻辑右移指令
SHROPR,CNT//Byte/Word
同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.
非循环算术移位:
将操作数看成有符号数来进行移位。
SAL(ShiftArithmeticLeft)算术左移指令
SALOPR,CNT//Byte/Word
SAL指令与SHL指令完全相同
SAR(ShiftArithmeticRight)算术右移指令
SAROPR,CNT//Byte/Word
SAR指令每次移位时,将最高位移入次高位的同时最高位值不变,最低位D0移出并移到CF.
循环移位指令
ROL(ROtateLeft)循环左移指令
ROLOPR,CNT//Byte/Word
每次移位时,最高位移出并同时移到CF和最低位D0.
ROR(ROtateRight)循环右移指令
ROROPR,CNT//