1、80x86 CPU指令按操作数地址个数可划分为3种类型: (1)双操作数指令 OPR DEST,SRCOPR表示指令操作码。指令中给出两个操作数地址,SRC表示源操作数地址,简称源地址;DEST表示目的操作数地址,简称目的地址。 (2)单操作数指令 OPR DEST指令中只给出一个操作数地址DEST。若指令只需一个操作数,则该地址既是源地址又是目的地址。若指令需两个操作数,则另一个操作数地址由指令隐含指定。 (3)无操作数指令 OPR 一种情况是指令未给出操作数地址,但隐含指定了操作数的存放处。另一种情况是指令本身不需要操作数。,4.3.2 80x86 CPU指令系统,80x86指令按功能可分
2、为6大类:(1)传送类指令(Transfer Instructions) (2)算术运算类指令(Arithmetic Instructions) (3)逻辑类指令(Bit Manipulation Instructions) (4)串操作类指令(String Instructions) (5)程序转移类指令(Program Transfer Instructions) (6)处理器控制类指令(Processor Control Instruction)下面分别介绍这几类指令(其中的第5类指令将在第5章介绍),下述指令均采用汇编指令格式描述。,1传送类指令传送类指令负责把数据、地址或立即数传送到
3、寄存器或存储单元中。它又可分为4种:数据传送指令、地址传送指令、标志位传送指令和类型转换指令。 (1)数据传送指令MOV(MOVe) 传送PUSH(PUSH onto the stack) 进栈POP(POP from the stack) 出栈XCHG(eXCHanGe) 交换, MOV传送指令指令格式:MOV DEST,SRC指令功能:DEST (SRC),即将源地址的内容(源操作数)传送到目的地址中。传送指令执行完后源操作数保持不变。受影响的状态标志位:无。,MOV指令中的两个操作数可以同时是字节、字或双字,但两者位数必须一致。源操作数可存放在通用寄存器、段寄存器、存储器中,也可以是立即
4、数;目的操作数则不能为立即数;并且两个操作数不能同时为存储器操作数。MOV指令的数据传送方向如右图所示:,例如,将立即数传送到通用寄存器或存储单元MOV AL,1FH ;将8位立即数1FH传送到8位寄存器AL中MOV AX,2345H ;字传送MOV DA_BYTE,0FEH ;字节传送MOV ARYBX,1234H ;字传送,例如,寄存器之间的传送MOV AH,BL ;字节传送MOV DX,CX ;字传送MOV DS,AX ;字传送,例如,寄存器与存储单元之间的传送MOV CL,DA_BYTE ;字节传送MOV TABBXDI,AX ;字传送,【例4-6】 把DA_WORD1字单元内容传送到
5、DA_WORD2字单元中,可用如下两条指令:MOV AX,DA_WORD1MOV DA_WORD2,AX此外,MOV指令中立即数不能直接传送给段寄存器,而且段寄存器之间也不能直接传送数据,但可以通过通用寄存器来实现间接传送。 【例4-7】 把立即数10A0H传送给段寄存器DS、ES,可用以下3条指令:MOV AX,10A0HMOV DS,AXMOV ES,AX, PUSH进栈指令指令格式:PUSH SRC指令功能:首先修改堆栈指针SP或ESP的内容,然后将源操作数压入栈顶单元中。源操作数可以是立即数、寄存器(含段寄存器)或存储单元的内容,但8086不能使用立即数。具体操作可表示如下:操作数16
6、位:SP或ESP (SP或ESP)2栈顶字单元 (SRC)受影响的状态标志位:无。堆栈是以“后进先出”方式工作的一个存储区,它必须存在于堆栈段中,因而其段基值或段选择器存放于SS寄存器中。堆栈操作只能在栈顶进行,因此使用堆栈指针SP或ESP来指示栈顶单元的地址,当堆栈地址长度为16位时用SP,当堆栈地址长度为32位时用ESP。应当注意,堆栈的存取必须以字或双字为单位 。, POP出栈指令指令格式:POP DEST指令功能:首先将SP或ESP指向的栈顶单元的内容弹出到目的寄存器或存储单元中,然后修改SP或ESP指向栈顶。目的地址可采用寄存器(除CS外)或存储器寻址方式,但不能是立即寻址。具体操作
7、可表示如下:操作数16位:DEST 栈顶字单元内容SP或ESP (SP或ESP)+2受影响的状态标志位:无。,PUSH/POP指令执行的操作,PUSH和POP指令的操作数地址长度为16位时,使用SP作为堆栈指针,进出栈的可以是字,也可以是双字;同样地,地址长度为32位时,使用ESP作为堆栈指针,进出栈的可以是双字,也可以是字。如下表所示。,【例4-12】 指令“PUSH AX”的执行情况如下图所示:,【例4-13】 指令“POP AX”的执行情况如图所示:, XCHG交换指令指令格式:XCHG DEST,SRC指令功能:(DEST)(SRC)。将源地址的内容与目的地址的内容相互交换。数据交换只
8、能在通用寄存器之间或通用寄存器与存储单元之间进行,不允许使用段寄存器。指令允许字或字节操作,80386及其后继机型还允许双字操作。受影响的状态标志位:无。,源操作数的物理地址= 2F000+0200+0046=2F246 则该指令执行后 (BX)= 4154H ,(2F246H)= 6F30H,【例4-22】 指令“XCHG BX,BP+SI”执行前,设 (BX)= 6F30H,(BP)= 0200H,(SI)= 0046H, (SS)= 2F00H,(2F246H)= 4154H,(2)地址传送指令这种指令完成将存储器操作数的地址传送给指定的寄存器,而不是传送操作数。LEA(Load Eff
9、ective Address) 有效地址送寄存器。LDS(Load DS with pointer) 地址指针送寄存器和DS。LES(Load ES with pointer) 地址指针送寄存器和ES。LFS(Load FS with pointer) 地址指针送寄存器和FS。LGS(Load GS with pointer) 地址指针送寄存器和GS。LSS(Load SS with pointer) 地址指针送寄存器和SS。, LEA有效地址送寄存器指令指令格式:LEA DEST,SRC指令功能:DEST SRC的EA,即将源操作数的有效地址EA传送到目的地址(16位或32位通用寄存器)中。
10、受影响的状态标志位:无。LEA指令的源操作数必须是存储器操作数,而目的地址只能是16位或32位通用寄存器名,不能使用段寄存器。,由于存在着目的寄存器位数与源操作数有效地址长度的不同,该指令执行的操作如下表所示:,如下图所示,设指令“LEA SI,BUF”中BUF的有效地址EA是100H,因此该指令完成将100H送入SI中,而不是把DS:100H所指向字单元的内容00FFH送入SI中。,LEA SI,BUF 指令的执行情况, LDS、LES 地址指针送寄存器和段寄存器指令在前面曾介绍,一个存储单元的逻辑地址是由16位段基值(或段选择器)和16(或32)位偏移地址组成。因此,可用4(或6)个字节单
11、元来存放这个逻辑地址。这4(或6)个字节单元构成32(或48)位的地址指针,段基值(或段选择器)存放在2个高字节单元中,偏移地址则存放在2(或4)个低字节单元中。32位的地址指针如右图所示:,指令LDS的功能就是从作为地址指针的4(或6)个存储单元中,同时取出段基值(或段选择器)与偏移地址,分别送到段寄存器DS和指定通用寄存器中。LDS指令格式:LDS DEST,SRCLES、LFS、LGS、LSS指令与其格式相同,只是指定的段寄存器不同。LDS指令功能:DEST (SRC)DS (SRC+2)或DS (SRC+4)受影响的状态标志位:无。,【例4-14】 右图给出了指令“LDS SI,ADR
12、BX”的执行情况。由源地址ADRBX可以计算出源操作数在数据段的有效地址EA。这时EA及EA+2指向的字单元作为32位地址指针。EA指向的字单元存放的是偏移地址,应送到指令指定的SI中;EA+2字单元存放的是段基值,应送到DS中。该指令执行完后,DS的内容为新的段基值。,LDS SI,ADRBX指令功能,在实模式下,假设(DS)=091DH,(SS)=1E4AH, (AX)=1234H,(BX)=0024H,(CX)=5678H, (BP)=0024H,(SI)=0012H,(DI)=0032H, (09226H)=00F6H,(09228H)=1E40H, (1E4F6H)=091DH。试给
13、出以下指令的执行结果。(1)MOV BPDI,CX (2)LDS SI,BXDI,(3)标志位传送指令这种指令用于对标志寄存器进行存取操作,共有6条指令且都是无操作数指令。LAHF(Load AH with Flags) 标志送AH。SAHF(Store AH into Flags) AH送标志寄存器。PUSHF/PUSHFD(PUSH the Flags or eflags) 标志进栈。POPF/POPFD(POP the Flags or eflags) 标志出栈。,【例4-25】 指令“LDS SI,10H”执行前,如果(DS) C000H,(C0010H)0180H,(C0012H)=
14、 2000H。 则指令执行后: (SI) 0180H,(DS)= 2000H。, LAHF标志送AH指令指令格式:LAHF指令功能:AH FLAGS的低字节,即将标志寄存器的低8位内容传送到AH寄存器中,也就是把标志位SF、ZF、AF、PF、CF送至AH中的第7,6,4,2,0位。受影响的状态标志位:无。 SAHF AH送标志寄存器指令指令格式:SAHF指令功能:FLAGS的低字节(AH),即将AH寄存器的内容传送给标志寄存器的低8位。受影响的状态标志位:SF、ZF、AF、PF、CF。SAHF指令用以设置或恢复SF、ZF、AF、PF、CF 5个标志位。它只影响标志寄存器的低8位,对高8位标志无
15、影响。, PUSHF/PUSHFD标志进栈指令指令格式:PUSHF指令功能:PUSHF: SP (SP) 2。 栈顶字单元 (FLAGS),不影响任何状态标志位。, POPF/POPFD标志出栈指令指令格式:POPF指令功能:POPF: FLAGS 栈顶字单元内容。 SP (SP)+2。这组指令中的LAHF和PUSHF/PUSHFD不影响标志位。SAHF和POPF/POPFD则由装入的值来确定标志位的值,但POPFD指令不影响VM、RF、IOPL、VIF和VIP的值。,(4)类型转换指令这种指令可将字节、字转换为字、双字,共有4条指令且都是无操作数指令。CBW(Convert Byte to Word) 字节转换为字。CWD/CWDE(Convert Word to Double Word)字转换为双字。这组指令均不影响标志位。, CBW 字节转换为字指令指令格式:CBW指令功能:扩展AL的符号到AH,形成AX中的字。即如果(AL)的最高有效位为0,则(AH) 0;如果(AL)的最高有效位为1,则(AH) 0FFH。 CWD 字转换为双字指令指令格式:CWD指令功能:扩展AX的符号到DX,形成DX:AX中的双字。即如果(AX)的最高有效位为0,则(DX) 0;如果(AX)的最高有效位为1,则(DX) 0FFFFH。,