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=OPR1OPR1=OPR2OPR2=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 OUT27H,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=1ZF=1
A>B CF=0&&ZF=0SF^OF=0&&ZF=0
A<B CF=1&&ZF=0SF^OF=1&&ZF=0
A>=B CF=0||ZF=1SF^OF=0||ZF=1
A<=B CF=1||ZF=1SF^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的内容.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论