计算机系统平台
上QQ阅读APP看书,第一时间看更新

2.3 指令系统举例

2.3.1 Intel 8086/8088指令系统

8086微处理器是由英特尔公司于1976年开始设计,1978年年中发布的Intel第一款16位微处理器,同时也是x86架构的开端。1979年,英特尔又推出了Intel 8088,8088在芯片的外部接口使用8位数据总线,使得8088成为8086的一个低成本的简化产品。而最初的IBM PC使用8088微处理器。

8086/8088指令系统的指令按功能可分为六大类:传送类指令、算术运算类指令、位操作类指令、串操作类指令、程序转移类指令、处理器控制类指令。下面分别介绍这几类指令。

1.数据传送指令

(1)通用数据传送指令

MOV(Move)传送

PUSH(Push onto the stack)进栈

POP(Pop from the stack)出栈

XCHG(Exchange)交换

MOV传送指令

格式为:MOV DST,SRC

执行的操作:(DST)←(SRC)

•PUSH进栈指令

格式为:PUSH SRC

执行的操作:(SP)←(SP)-2

((SP)+1,(SP))←(SRC)

•POP出栈指令

格式为:POP DST

执行的操作:(DST)←((SP+1),(SP))

(SP)←(SP)+2

•XCHG交换指令

格式为:XCHG OPR1,OPR2

执行的操作:(OPR1)↔(OPR2)

(2)累加器专用传送指令

IN(Input)输入

OUT(Output)输出

XLAT(Translate)换码

这组指令只限于使用累加器AX或AL传送信息。

•IN输入指令

长格式为:IN AL,PORT(字节)

IN AX,PORT(字)

执行的操作:(AL)←(PORT)(字节)

(AX)←(PORT+1,PORT)(字)

短格式为:IN AL,DX(字节)

IN AX,DX(字)

执行的操作:AL←((DX))(字节)

AX←((DX)+1,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(字)

IBM PC的外围设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH。其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用两个字节表示,第二个字节就是端口号。所以用长格式时可以在指令中直接指定端口号,但只限于前256个端口。当端口号≥256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息。

•XLAT换码指令

格式为:XLAT OPR

或:XLAT

执行的操作:(AL)←((BX)+(AL))

(3)有效地址传送寄存器指令

LEA(Load effective address)有效地址传送寄存器

LDS(Load DS with Pointer)指针传送寄存器和DS

LES(Load ES with Pointer)指针传送寄存器和ES

•LEA有效地址传送寄存器

格式为:LEA REG,SRC

执行的操作:(REG)←SRC

指令把源操作数的有效地址送到指定的寄存器中。

•LDS指针传送寄存器和DS指令

格式为:LDS REG,SRC

执行的操作:(REG)←(SRC)

(DS)←(SRC+2)

把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中,该指令常

指定SI寄存器。

•LES指针传送寄存器和ES指令

格式为:LES REG,SRC

执行的操作:(REG)←(SRC)

(ES)←(SRC+2)

把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中,该指令常

指定DI寄存器。

(4)标志寄存器传送指令

LAHF(Load AH with flags)标志传送AH

SAHF(store AH into flags)AH传送标志寄存器

PUSHF(push the flags)标志进栈

POPF(pop the flags)标志出栈

•LAHF标志传送AH指令

格式为:LAHF

执行的操作:(AH)←(PSW的低字节)

•SAHF AH传送标志寄存器指令

格式为:SAHF

执行的操作:(PSW的低字节)←(AH)

•PUSHF标志进栈指令

格式为:PUSHF

执行的操作:(SP)←(SP)-2

((SP)+1,(SP))←(PSW)

•POPF标志出栈指令

格式为:POPF

执行的操作:(PWS)←((SP)+1,(SP))

(SP)←(SP+2)

2.算术指令

(1)加法指令

ADD(add)加法

ADC(add with carry)带进位加法

INC(increment)加1

•ADD加法指令

格式:ADD DST,SRC

执行的操作:(DST)←(SRC)+(DST)

•ADC带进位加法指令

格式:ADC DST,SRC

执行的操作:(DST)←(SRC)+(DST)+CF

•INC加1指令

格式:INC OPR

执行的操作:(OPR)←(OPR)+1

(2)减法指令

SUB(subtract)减法

SBB(subtract with borrow)带借位减法

DEC(Decrement)减1

NEG(Negate)求补

CMP(Compare)比较

•SUB减法指令

格式:SUB DST,SRC

执行的操作:(DST)←(DST)-(SRC)

•SBB带借位减法指令

格式:SBB DST,SRC

执行的操作:(DST)←(DST)-(SRC)-CF

•DEC减1指令

格式:DEC OPR

执行的操作:(OPR)←(OPR)-1

•NEG求补指令

格式:NEG OPR

执行的操作:(OPR)←~(OPR)

•CMP比较指令

格式:CMP OPR1,OPR2

执行的操作:(OPR1)-(OPR2)

该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置相关的条件标志位。

(3)乘法指令

MUL(Unsigned Multiple)无符号数乘法

IMUL(Signed Multiple)带符号数乘法

•MUL无符号数乘法指令

格式:MUL SRC

执行的操作:(AX)←(AL)*(SRC)(字节)

(DX,AX)←(AX)*(SRC)(字)

•IMUL带符号数乘法指令

格式:IMUL SRC

执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数。

(4)除法指令

DIV(Unsigned divide)无符号数除法

IDIV(Signed divide)带符号数除法

CBW(Convert byte to word)字节转换为字

CWD(Convert word to double word)字转换为双字

•DIV无符号数除法指令

格式:DIV SRC

执行的操作:

字节操作:(AL)←(AX)/(SRC)的商

(AH)←(AX)/(SRC)的余数

字操作:(AX)←(DX,AX)/(SRC)的商

(AX)←(DX,AX)/(SRC)的余数

•IDIV带符号数除法指令

格式:DIV SRC

执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同。

•CBW字节转换为字指令

格式:CBW

执行的操作:AL的内容符号扩展到AH。即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH。

•CWD字转换为双字指令

格式:CWD

执行的操作:AX的内容符号扩展到DX。即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH。

这两条指令都不影响条件码。

3.逻辑指令

(1)逻辑运算指令

AND(and)逻辑与

OR(or)逻辑或

NOT(not)逻辑非

XOR(exclusive or)异或

TEST(test)测试

•AND逻辑与指令

格式:AND DST,SRC

执行的操作:(DST)←(DST)∧(SRC)

•OR逻辑或指令

格式:OR DST,SRC

执行的操作:(DST)←(DST)∨(SRC)

•NOT逻辑非指令

格式:NOT OPR

执行的操作:(OPR)←┓(OPR)

•XOR异或指令

格式:XOR DST,SRC

执行的操作:(DST)←(DST)⊕(SRC)

•TEST测试指令

格式:TEST OPR1,OPR2

执行的操作:(DST)∧(SRC)

两个操作数相与的结果不保存,只根据其特征置条件码。

(2)移位指令

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 OPR,CNT(其余的类似)

其中,OPR可以是除立即数以外的任何寻址方式。移位次数由CNT决定,CNT可以是1或CL。

循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2或除以2操作。其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用于无符号数运算,SHL用来乘2,SHR用来除以2。

4.串处理指令

(1)与REP相配合工作的MOVS,STOS和LODS指令

•REP重复串操作直到(CX)=0为止

格式:REP StringPrimitive

其中,StringPrimitive可为MOVS、LODS或STOS指令。

执行的操作:

①如(CX)=0则退出REP,否则往下执行。

②(CX)←(CX)-1。

③执行其中的串操作。

④重复①~③。

•MOVS串传送指令

格式(有三种):

MOVS DST,SRC

MOVS B(字节)

MOVS W(字)

其中第二、三种格式明确注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:

MOVS ES:BYTE PTR[DI],DS:[SI]

执行的操作:

①((DI))←((SI))。

②字节操作:

(SI)←(SI)+(或-)1,(DI)←(DI)+(或-)1

当方向标志DF=0时用“+”,当方向标志DF=1时用“-”。

③字操作:

(SI)←(SI)+(或-)2,(DI)←(DI)+(或-)2

当方向标志DF=0时用“+”,当方向标志DF=1时用“-”。

该指令不影响条件码。

CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;

STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量。

•STOS存入串指令

格式:STOS DST

STO SB(字节)

STOS W(字)

执行的操作:

字节操作:((DI))←(AL),(DI)←(DI)+/-1

字操作:((DI))←(AX),(DI)←(DI)+/-2

该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中。

•LODS从串取指令

格式:LODS SRC

LODS B

LODS W

执行的操作:

字节操作:(AL)←((SI)),(SI)←(SI)+/-1

字操作:(AX)←((SI)),(SI)←(SI)+/-2

该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容。指令允许使用段跨越前缀来指定非数据段的存储区。该指令也不影响条件码。

一般地,该指令不和REP连用。有时缓冲区中的一串字符需要逐次取出来测试时,可使用该指令。

(2)与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令

•REPE/REPZ当相等/为零时重复串操作

格式:REPE(或REPZ)StringPrimitive

其中StringPrimitive可为CMPS或SCAS指令。

执行的操作:

①如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行。

②(CX)←(CX)-1。

③执行其后的串指令。

④重复①~③。

•REPNE/REPNZ当不相等/不为零时重复串操作

格式:REPNE(或REPNZ)StringPrimitive

其中StringPrimitive可为CMPS或SCAS指令。

执行的操作:

除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同。

•CMPS串比较指令

格式:CMP SRC,DST

CMPS B

CMPS W

执行的操作:

①((SI))-((DI))

②字节操作:(SI)←(SI)+/-1,(DI)←(DI)+/-1

字操作:(SI)←(SI)+/-2,(DI)←(DI)+/-2

指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其他特性和MOVS指令的规定相同。

•SCAS串扫描指令

格式:SCAS DST

SCAS B

SCAS W

执行的操作:

字节操作:(AL)-((DI)),(DI)←(DI)+/-1

字操作:(AL)-((DI)),(DI)←(DI)+/-2

该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码。指令的其他特性和MOVS的规定相同。

5.控制转移指令

(1)无条件转移指令:JMP(jmp)跳转指令

①段内直接短转移

格式: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)

(2)条件转移指令

①根据单个条件标志的设置情况转移

•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

②比较两个无符号数,并根据比较的结果转移

•JB(或JNAE,JC)低于,或者不高于或等于,或进位位为1则转移

格式:CF=1

•JNB(或JAE,JNC)不低于,或者高于或者等于,或进位位为0则转移

格式:CF=0

•JBE(或JNA)(Jump if below or equal,or not above)低于或等于,或不高于则转移

格式:JBE(或JNA)OPR

测试条件:CF ⋁ ZF=1

•JNBE(或JA)(Jump if not below or equal,or above)不低于或等于,或者高于则转移

格式:JNBE(或JA)OPR

测试条件:CF ⋁ ZF=0

③比较两个带符号数,并根据比较的结果转移

•JL(或LNGE)(Jump if less,or not greater or equal)小于,或者不大于或者等于则转移

格式:JL(或JNGE)OPR

测试条件:SF ⋁ OF=1

•JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则

转移

格式:JNL(或JGE)OPR

测试条件:SF ⋁ OF=0

•JLE(或JNG)(Jump if less or equal,or not greater)小于或等于,或者不大于则转

格式:JLE(或JNG)OPR

测试条件:(SF ⋁ OF) ⋁ ZF=1

•JNLE(或JG)(Jump if not less or equal,or greater)不小于或等于,或者大于则转移

格式:JNLE(或JG)OPR

测试条件:(SF ⋁ OF) ⋁ ZF=0

④测试CX的值为0则转移指令

•JCXZ(Jump if CX register is zero)CX寄存器的内容为零则转移

格式:JCXZ OPR

测试条件:(CX)=0

注:条件转移全为8位短跳。

(3)循环指令

•LOOP循环指令

格式:LOOP OPR

测试条件:(CX)<>0

•LOOPZ/LOOPE当为零或相等时循环指令

格式:LOOPZ(或LOOPE)OPR

测试条件:(CX)<>0且ZF=1

•LOOPNZ/LOOPNE当不为零或不相等时循环指令

格式:LOOPNZ(或LOOPNE)OPR

测试条件:(CX)<>0且ZF=0

这三条指令的步骤是:

① (CX)←(CX)-1。

②检查是否满足测试条件,如满足则(IP)←(IP)+D8的符号扩充。

(4)子程序

•CALL调用指令

•RET返回指令

(5)中断

•INT指令

格式:INT TYPE

或INT

•INTO若溢出则中断

•IRET从中断返回指令

格式:IRET

6.处理机控制指令

(1)标志处理指令

•CLC进位位置0指令(Clear carry)CF←0

•CMC进位位求反指令(Complement carry)CF←CF

•STC进位位置1指令(Set carry)CF←1

•CLD方向标志置0指令(Clear direction)DF←0

•STD方向标志置1指令(Set direction)DF←1

•CLI中断标志置0指令(Clear interrupt)IF←0

•STI中断标志置1指令(Set interrupt)IF←0

(2)其他处理机控制指令

NOP(No Opreation)无操作

HLT(Halt)停机

WAIT(Wait)等待

ESC(Escape)换码

LOCK(Lock)封锁

这些指令可以控制处理机状态,它们都不影响条件码。

①NOP无操作指令

该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代。

②HLT停机指令

该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序。

③WAIT等待指令

该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续执行。

④ESC换码指令

格式ESC mem

其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去。当然ESC指令不允许使用立即数和寄存器寻址方式。这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器取得指令或操作数。协处理机(如8087)则是为了提高速度而可以选配的硬件。

⑤LOCK封锁指令

该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止。当CPU与其他处理机协同工作时,该指令可避免破坏有用信息。