MOV 指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src
1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息
PUSH 入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word
入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word
出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.
执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word
执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据
3.存储器与存储器之间不能交换数据.
XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL)
指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.
LEA(Load Effective Address) 有效地址传送寄存器指令
LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc
注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。
执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。
LES (Load ES with pointer) 指针送寄存器和ES指令 LES REG , SRC //常指定DI寄存器
执行操作: REG=(SRC) , ES=(SRC+2) //与LDS大致相同,不同之处是将ES代替DS而已.
LAHF ( Load AH with Flags ) 标志位送AH指令
LAHF //将PSW寄存器中的低8位的状态标志(条件码)送入AH的相应位, SF送D7位, ZF送D6位......
执行操作: AH=PSW的低位字节。
SAHF ( Store AH into Flags ) AH送标志寄存器指令
SAHF //将AH寄存器的相应位送到PSW寄存器的低8位的相应位, AH的D7位送SF, D6位送ZF......
执行操作: PSW的低位字节=AH。 PUSHF ( PUSH the Flags) 标志进栈指令
PUSHF //将标志寄存器的值压入堆栈顶部, 同时栈指针SP值减2 执行操作: SP=SP-1,(SP)=PSW的高8位, SP=SP-1, (SP)=PSW的低8位 POPF ( POP the Flags ) 标志出栈指令
POPF //与PUSHF相反, 从堆栈的顶部弹出两个字节送到PSW寄存器中, 同时堆栈指针值加2
执行操作: PSW低8位=(SP), SP=SP+1, PSW高8位=(SP) , SP=SP+1
输入输出指令(IN,OUT):只限于使用累加器AX或AL与外部设备的端口传送信息. IN (INput)输入指令:信息从I/O通过累加器传送到CPU
IN AL , PORT //直接的字节输入,PORT是外设端口编号(即端口地址),只能取 00H ~ 0FFH共256个端口地址.
IN AX , PORT //直接的字输入,AX存储连续两个端口地址PORT+1,PORT IN AL , DX //间接的字节输入,端口地址范围可通过DX设置为0000H ~ 0FFFFH共65536个端口地址
IN AX , DX //间接的字输入
OUT( OUTput)输出指令 :信息从CPU通过累加器传送到I/O OUT PORT , AL //直接的字节输出,PORT规定与IN指令相同. OUT PORT , AX
OUT DX , AL //间接的字节输出 OUT DX , AX
MOV AL,05H OUT 27H, AL //将字节05H传送到地址27H的端口 ADD(ADD)加法指令 ADD DST , SRC //Byte/Word 执行操作: dst=dst+src
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=dst+src+CF //与ADD不同之处是还要加上进位标志位的值. INC ( INCrement) 加1指令 INC OPR //Byte/Word 执行操作: OPR=OPR+1
1.OPR可以是寄存器和存储器操作数, 但不能是立即数和段寄存器 2.影响标志位OF,SF,ZF,PF 和AF,不影响CF. 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 = 0- opr //将操作数按位求反后末位加1. CMP ( CoMPare ) 比较指令 CMP OPR1 , OPR2
执行操作:OPR1 - OPR2 //与SUB指令一样执行运算, 但不保存结果. 比较情况 无符号数 有符号数 A=B ZF=1 ZF=1
A>B CF=0 && ZF=0 SF^OF=0 && 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 ) 无符号数乘法指令 MUL SRC //Byte/Word .
执行操作:Byte => AX= AL *src //字节运算时目的操作数用AL, 乘积放在AX中 Word => DX=AX *src //字运算时目的操作数用AX, DX存放乘积的高位字, AX放乘积的低位字
1.目的数必须是累加器 AX 或AL,指令中不需写出
2. 源操作数SRC可以是通用寄存器和各种寻址方式的存储器操作数, 而绝对不允许是立即数或段寄存器.
IMUL (sIgned MULtiple) 有符号数乘法指令 IMUL SRC //与MUL指令相同,但必须是带符号数 DIV ( unsigned DIVide) 无符号数除法指令
DIV SRC //Byte/Word 其中: SRC的规定同乘法指令MUL
执行操作:Byte => AX / src //字节运算时目的操作数在AX中,结果的商在AL中 ,余数在AH中
Word=> DX,AX /src //字运算时目的操作数在DX高位字和AX低位字中,结果的商在AX中 ,余数在DX中
存储器操作数必须指明数据类型:BYTE PTR src 或 WORD PTR src IDIV (sIgned DIVied) 有符号数除法指令
IDIV SRC //Byte/Word 与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 十进制调整指令
当计算机进行计算时,必须先把十进制数转换为二进制数,再进行二进制数运算,最后将结果又转换为十进制数输出.
在计算机中,可用4位二进制数表示一位十进制数,这种代码称为BCD ( Binary Coded Decimal ).
BCD码又称8421码,在PC机中,BCD码可用压缩的BCD码和非压缩的BCD码两种格式表示.
压缩的BCD码用4位二进制数表示一个十制数,整个十进数形式为一个顺序的以4位为一组的数串.
非压缩的BCD码以8位为一组表示一个十进制数,8位中的低4位表示8421的BCD码,而高4位则没有意义. 压缩的BCD码调整指令
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寄存器中. MOVS ( MOVe String) 串传送指令
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值.
MOVS DST , SRC //同上,不常用,DST和SRC只是用来用类型检查,并不允许使用其它寻址方式来确定操作数.
1.目的串必须在附加段中,即必须是ES:[DI]
2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI]. STOS (STOre into String) 存入串指令 STOS DST
STOSB //存放字节串 ( DI ) = AL STOSW //存放字串 ( DI ) = AX
执行品作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容.