自己整理的指令Word下载.docx
《自己整理的指令Word下载.docx》由会员分享,可在线阅读,更多相关《自己整理的指令Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
堆栈的存取在16位指令中必须以字为单位(不允许字节堆栈),在32位指令中必须以双字为单位。
8086不允许PUSH指令使用立即数寻址方式,286及后继机型允许立即数进栈。
PUSHA/PUSHAD(pushallregisters)所有寄存器进栈//不影响标志位
PUSHA:
进栈次序:
AX,CX,DX,BX,指令执行前的SP,BP,SI,DI.指令执行后(sp)←(SP)-16仍指向栈顶
PUSHAD:
32位,进栈次序同PUSHA
POPA/POPAD(popallregisters)所有寄存器出栈//不影响标志位
POPA(16位)出栈次序:
DI,SI,BP,SP,BX,DX,CX,AX.指令执行后(sp)←(SP)+16仍指向栈顶
POPAD:
32位,进栈次序同POPA.
XCHG(exchange)交换//不影响标志
执行操作(OPR1)←→(OPR2)这两个操作数必有一个在寄存器中,不允许使用段寄存器。
该指令可用于除立即数外的任何寻址方式。
2累加器专用传送指令
IN(input)输入//不影响标志位
OUT(output)输出//不影响标志位
这两个指令只限于累加器EAX,AX,AL。
IN指令完成从I/O到CPU的信息传送,而OUT指令完成从CPU到I/O信息传送。
CPU只能用累加器接受或发送信息。
XLAT(translate)换码//不影响标志位
在使用这条指令前应先建立一个字节表格,其首地址提前存入BX/EBX,需要转换代码应该是相对于表格首地址的位移量也提前存放在AL中,表格内容则是所要换取的代码,指令执行完后就可在AL中得到转换后的代码。
32位:
(AL)←((EBX)+(AL)).
3地址传送指令
LEA(loadeffectiveaddresss)有效地址送寄存器//不影响标志位
目的操作数:
可用于16位或32位寄存器,但不能使用段寄存器。
源操作数:
除立即数和寄存器外的任一种存储器寻址方式。
注意1:
LEABX,[BX+SI+0F62H]这里BX寄存器得到的是有效地址而不是该存储单元内容。
如果是MOVBX,[BX+SI+0F62H],则BX中得到是偏移地址为ⅹⅹⅹ那个单元内容而不是其偏移地址。
注意2:
比较 LEABX,LIST和MOVBX,OFFSETLIST。
这两条指令功能上相同,且MOV指令速度快,但OFFSET只能与简单的符号地址相连,而不能和诸如LIST[SI]或[SI]等复杂操作数相连。
LDS(loadDSwithpointer)指针送寄存器和DS//不影响标志位
LES(loadESwithpointer)指针送寄存器和ES//不影响标志位
LFS(loadFSwithpointer)指针送寄存器和FS//不影响标志位
LGS(loadGSwithpointer)指针送寄存器和GS//不影响标志位
LSS(loadSSwithpointer)指针送寄存器和SS//不影响标志位
该组指令的源操作只能用存储器寻址方式。
目的寄存器不允许使用段寄存器。
4标志寄存器传送指令
LAHF(loadAHwithflags)标志送AH//不影响标志位
执行操作:
(AH)←(FLAGS低字节)
SAHF(storeAHintoflags)AH送标志寄存器//由装入值来确定标志位值
(FLAGS低字节)←(AH)
PUSHF/PUSHFD标志进栈//由装入值来确定标志位值
执行操作:
PUSHF (SP)←(SP)-2 ((SP)+1),(SP))←(FLAGS)
PUSHFD (ESP)←(ESP)-4 ((ESP+3),(ESP+2),(ESP+1),(ESP))←(EFLAGSAND OFCFFFFH)(清VM和RF位)
POPF/POPFD(poptheflagsoreflags)标志出栈//由装入值来确定标志位值
POPF(FLAGS)←((SP)+1),(SP))(SP)←(SP)+2
POPFD(EFLAGS)←((ESP)+3,(ESP+2),(ESP+1),(ESP))(ESP)←(ESP)+4
POPFD指令不影响VM,RF,IOPL,VIF和VIP的值。
5 类型转换指令
CBW(convertbytetoword) 字节转换为字//不影响标志位
AL的内容扩展到AH,形成AX中的字。
即如果(AL)的最高有效位为0,则(AH)=0;
如果为1(AH)=OFFH
CWD/CWDE(convertwordtodoubleword) 字转换为双字//不影响标志位
AX的内容扩展到DX,形成DX:
AX的双字。
即若(AX)的最高有效位为0,(DX)=0;
若为1,(DX)=0FFFFH
CDQ(convertdoubletoquad) 双字转换为4字//不影响标志位
EAX的内容扩展到EDX,形成EDX:
EAX中的4字。
BSWAP(byteswap) 字节交换//不影响标志位
BSWAPEAX。
字节次序变反,具体为1,4字节互换,2,3字节互换。
该指令只能用于486及其后继机型。
算术指令
1 加法指令
ADD(add) 加法//影响条件标志位
ADC(addwithcarry) 带进位加法//影响条件标志位
注:
ADC这条指令里,其中CF为进位位的值。
INC(increment) 加1//影响条件标志位(除了CF标志)
(上3条)可做字或字节运算。
OF位可以用来表示带符号数溢出,CF位则可以用来表示无符号数的溢出。
XADD(exchangeandadd) 交换并相加//影响条件标志位
该指令源操作数只能用寄存器寻址方式,目的操作数可用寄存器或任一种存储器寻址方式。
TEMP←(SRC)+(DST)(SRC)←(DST)(DST)←TEMP
2 减法指令
SUB(subtract)减法//影响条件标志位
SBB(subtractwithborrow) 带借位减法//影响条件标志位
(DST)←(DST)-(SRC)-CF
DEC(decrement) 减1//影响条件标志位(除了CF标志)
NEG(negate)求补//影响条件标志位
(OPR)←-(OPR)亦即把操作数按位求反后末位加1,因而执行可表示为(OPR)←0FFFFH-(OPR)+1
只有当操作数为0时,求补运算结果使CF=0,其他情况均为1。
CMP(compare) 比较//影响条件标志位
(OPR1)-(OPR2),不保存结果,只是根据结果设置条件标志位。
其后往往跟着条件转移指令。
CMPXCHG(compareandexchange)比较并交换//影响条件标志位
该指令只能用于486及其后继机型。
SRC只能用8,16,或32位寄存器。
DST则可用寄存器或任何一种存储器寻址方式。
累加器和DST比较。
CMPXCHG8B(compareandexchange8byte)比较并交换8字节//影响ZF标志位
该指令只能用于Pentium及其后继机型。
源操作数存放于EDX,EAX中64位字,目的操作数可用存储器寻址方式确定一个64位字。
执行操作EDX,EAX和DST相比较。
条件码。
OF标志位同加法指令,这里若两个数符号相反而结果的符号与减数相同,则OF=1;
除上述情况外OF=0。
OF=1说明带符号数的减法溢出,结果错误。
减法的CF值反映无符号运算中的借位情况,因此当作无符号数运算时,若减数&
gt;
被减数,此时有借位,则CF=1;
否则CF=0。
即有进位时CF=0,无进位时CF=1。
另外注意8086中处理双字的方法(也适用于386及其后继机型中对4字的处理)。
3 乘法指令
MUL(unsignedmultiple)无符号数乘法//对除CF和OF以外的条件码位无定义
IMUL(signedmultiple)带符号数乘法//对除CF和OF以外的条件码位无定义
字节操作数:
(AX)←(AL)*(SRC),字操作数和双字操作数操作同字节操作数。
目的操作数必须是累加器(累加器为隐含),字运算为AX,字节运算为AL。
两个8位数相乘得到16位数存放在AX中,两个16位数相乘得到32位数存放在DX,AX中,其中DX存放高位字,AX存放低位字。
386以后可做双字运算。
对于80286及其后继机型,IMUL除上述单操作数指令(累加器为隐含),还有双操作数和三操作数。
如:
IMUL REG,SRC IMUL REG,SRC,IMM
IMUL REG,SRC 执行操作:
字操作数:
(REG16)←(REG16)*(SRC) 双字操作数:
(REG32)←(REG32)*(SRC)
其中目的操作数必须是16位或32位寄存器;
源操作数可用任一种寻址方式取得和目的操作数长度相同
的数;
但如源操作数为立即数时,除相应地用16位或32位立即数外,指令中也可指定8位立即数,在运算时机器会自动把该数符号扩展成与目的操作数长度相同的数。
IMUL REG,SRC,IMM 执行操作:
(REG16)←(SRC)*IMM 双字操作数:
(REG32)←(SRC)*IMM
目的和源操作数同上,IMM表示立即数,可以为8,16,32,运算时必须和目的操作数长度一致。
对于MUL指令,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)或双字操作的(EDX)为0,则CF和OF均为0;
否则CF和OF均为1。
对于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF和OF均为0,否则就为1。
机器规定:
16位操作数相乘得到的乘积在16位之内或32位操作数相乘得到的乘积在32位之内时,OF和CF位置0,否则置1,这时的OF位