《大学汇编课件第4章4.ppt》由会员分享,可在线阅读,更多相关《大学汇编课件第4章4.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、80 x86 CPU指令指令按操作数地址个数按操作数地址个数可划分为可划分为3种类型种类型:(1)双操作数指令双操作数指令 OPR DEST,SRC OPR表示指令操作码。指令中给出两个操作数地址,表示指令操作码。指令中给出两个操作数地址,SRC表示表示源操作数地址,简称源地址;源操作数地址,简称源地址;DEST表示目的操作数地址,简称目表示目的操作数地址,简称目的地址。的地址。(2)单操作数指令单操作数指令 OPR DEST 指令中只给出一个操作数地址指令中只给出一个操作数地址DEST。若指令只需一个操作数,。若指令只需一个操作数,则该地址既是源地址又是目的地址。若指令需两个操作数,则另则该
2、地址既是源地址又是目的地址。若指令需两个操作数,则另一个操作数地址由指令隐含指定。一个操作数地址由指令隐含指定。(3)无操作数指令无操作数指令 OPR一种情况是指令未给出操作数地址,但隐含指定了操作数的存一种情况是指令未给出操作数地址,但隐含指定了操作数的存放处。另一种情况是指令本身不需要操作数。放处。另一种情况是指令本身不需要操作数。4.3.2 80 x86 CPU指令系统指令系统80 x86指令按功能可分为指令按功能可分为6大类:大类:(1)传送类指令()传送类指令(Transfer Instructions)(2)算术运算类指令()算术运算类指令(Arithmetic Instructi
3、ons)(3)逻辑类指令()逻辑类指令(Bit Manipulation Instructions)(4)串操作类指令()串操作类指令(String Instructions)(5)程序转移类指令()程序转移类指令(Program Transfer Instructions)(6)处理器控制类指令()处理器控制类指令(Processor Control Instruction)下面分别介绍这几类指令下面分别介绍这几类指令(其中的第(其中的第5类指令将在第类指令将在第5章介绍),下述指令均章介绍),下述指令均采用汇编指令格式采用汇编指令格式描述。描述。1传送类指令传送类指令 传送类指令负责把数据
4、、地址或立即数传送到寄传送类指令负责把数据、地址或立即数传送到寄存器或存储单元中。它又可分为存器或存储单元中。它又可分为4种:种:数据传送数据传送指令、指令、地址传送地址传送指令、指令、标志位传送标志位传送指令和指令和类型转换类型转换指令指令。(1)数据传送指令)数据传送指令 MOV(MOVe)传送传送 PUSH(PUSH onto the stack)进栈进栈 POP(POP from the stack)出栈出栈 XCHG(eXCHanGe)交换交换 MOV传送指令传送指令 指令格式:指令格式:MOV DEST,SRC 指令功能:指令功能:DEST(SRC),即将源地址的内容),即将源地址
5、的内容(源操作数)传送到目的地址中。传送指令执行完后源(源操作数)传送到目的地址中。传送指令执行完后源操作数保持不变。操作数保持不变。受影响的状态标志位:无。受影响的状态标志位:无。MOV指令中的两个操作指令中的两个操作数可以同时是字节、字或双数可以同时是字节、字或双字,但两者位数必须一致。字,但两者位数必须一致。源操作数可存放在通用寄存源操作数可存放在通用寄存器、段寄存器、存储器中,器、段寄存器、存储器中,也可以是立即数;目的操作也可以是立即数;目的操作数则不能为立即数;并且两数则不能为立即数;并且两个操作数不能同时为存储器个操作数不能同时为存储器操作数。操作数。MOV指令的数据传指令的数据
6、传送方向如右图所示送方向如右图所示:例如,将立即数传送到通用寄存器或存储单元例如,将立即数传送到通用寄存器或存储单元 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_B
7、YTE;字节传送;字节传送 MOV TABBXDI,AX;字传送;字传送 【例例4-6】把把DA_WORD1字单元内容传送到字单元内容传送到DA_WORD2字字单元中,可用如下两条指令:单元中,可用如下两条指令:MOV AX,DA_WORD1 MOV DA_WORD2,AX 此外,此外,MOV指令中立即数不能直接传送给段寄存器,指令中立即数不能直接传送给段寄存器,而且段寄存器之间也不能直接传送数据,但可以通过通用而且段寄存器之间也不能直接传送数据,但可以通过通用寄存器来实现间接传送。寄存器来实现间接传送。【例例4-7】把立即数把立即数10A0H传送给段寄存器传送给段寄存器DS、ES,可用以,可
8、用以下下3条指令:条指令:MOV AX,10A0H MOV DS,AX MOV ES,AX PUSH进栈指令进栈指令 指令格式:指令格式:PUSH SRC 指令功能:指令功能:首先修改堆栈指针首先修改堆栈指针SP或或ESP的内容,然后将源操作的内容,然后将源操作数压入栈顶单元中。源操作数可以是立即数、寄存器(含段寄存数压入栈顶单元中。源操作数可以是立即数、寄存器(含段寄存器)或存储单元的内容,但器)或存储单元的内容,但8086不能使用立即数。具体操作可表不能使用立即数。具体操作可表示如下:示如下:操作数操作数16位:位:SP或或ESP(SP或或ESP)2 栈顶字单元栈顶字单元(SRC)受影响的
9、状态标志位:受影响的状态标志位:无。无。堆栈是以堆栈是以“后进先出后进先出”方式工作的一个存储区,它必须存在方式工作的一个存储区,它必须存在于堆栈段中,因而其于堆栈段中,因而其段基值或段选择器存放于段基值或段选择器存放于SS寄存器寄存器中。堆栈中。堆栈操作只能在栈顶进行,因此操作只能在栈顶进行,因此使用堆栈指针使用堆栈指针SP或或ESP来指示栈顶单来指示栈顶单元的地址,当堆栈地址长度为元的地址,当堆栈地址长度为16位时用位时用SP,当堆栈地址长度为,当堆栈地址长度为32位时用位时用ESP。应当注意,应当注意,堆栈的存取必须以字或双字为单位堆栈的存取必须以字或双字为单位。POP出栈指令出栈指令
10、指令格式:指令格式:POP DEST 指令功能:指令功能:首先将首先将SP或或ESP指向的栈顶单元的内容弹出到目的指向的栈顶单元的内容弹出到目的寄存器或存储单元中,然后修改寄存器或存储单元中,然后修改SP或或ESP指向栈顶。目的地址可指向栈顶。目的地址可采用寄存器(除采用寄存器(除CS外)或存储器寻址方式,但不能是立即寻址。外)或存储器寻址方式,但不能是立即寻址。具体操作可表示如下:具体操作可表示如下:操作数操作数16位:位:DEST 栈顶字单元内容栈顶字单元内容 SP或或ESP(SP或或ESP)+2 受影响的状态标志位:受影响的状态标志位:无。无。操作数长度操作数长度(位位)地址长度地址长度
11、(位位)执行的操作执行的操作1616SP(SP)2 字出栈或进栈字出栈或进栈 1632ESP(ESP)2 字出栈或进栈字出栈或进栈 3216SP(SP)4 双字出栈或进栈双字出栈或进栈 3232ESP(ESP)4 双字出栈或进双字出栈或进栈栈 PUSH/POP指令执行的操作指令执行的操作 PUSH和和POP指令的操作数地址长度为指令的操作数地址长度为16位时,使用位时,使用SP作为堆栈作为堆栈指针,指针,进出栈的可以是字,也可以是双字进出栈的可以是字,也可以是双字;同样地,地址长度为;同样地,地址长度为32位时,使用位时,使用ESP作为堆栈指针,进出栈的可以是双字,也可以是字。作为堆栈指针,进
12、出栈的可以是双字,也可以是字。如下表所示如下表所示。【例例4-12】指令指令“PUSH AX”的执行情况如下图所示:的执行情况如下图所示:【例例4-13】指令指令“POP AX”的执行情况如图所示:的执行情况如图所示:XCHG交换指令交换指令 指令格式:指令格式:XCHG DEST,SRC 指令功能:指令功能:(DEST)(SRC)。将源地址的内容与目的地址)。将源地址的内容与目的地址的内容相互交换。数据交换只能在通用寄存器之间或通用寄存器的内容相互交换。数据交换只能在通用寄存器之间或通用寄存器与存储单元之间进行,与存储单元之间进行,不允许使用段寄存器不允许使用段寄存器。指令允许字或字节。指令
13、允许字或字节操作,操作,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)地址传送指令)地址传送指令 这种指令完成将存储器操作数的地址传送给指定的这种指令完成将存储
14、器操作数的地址传送给指定的寄存器,而不是传送操作数。寄存器,而不是传送操作数。LEA(Load Effective 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)地址指针送寄存
15、器和地址指针送寄存器和SS。LEA有效地址送寄存器指令有效地址送寄存器指令 指令格式:指令格式:LEA DEST,SRC 指令功能:指令功能:DEST SRC的的EA,即将源操作数的有效地,即将源操作数的有效地址址EA传送到目的地址(传送到目的地址(16位或位或32位通用寄存器)中。位通用寄存器)中。受影响的状态标志位:受影响的状态标志位:无。无。LEA指令的源操作数必须是存储器操作数,而目的地址指令的源操作数必须是存储器操作数,而目的地址只能是只能是16位或位或32位通用寄存器名,不能使用段寄存器。位通用寄存器名,不能使用段寄存器。目的寄存器位数目的寄存器位数源操作数地址长度源操作数地址长度
16、执行的操作执行的操作1616计算得计算得16位有效地址,存入位有效地址,存入16位目的寄存器位目的寄存器1632计算得计算得32位有效地址,截取低位有效地址,截取低16位存入位存入16位目的寄存器位目的寄存器3216计算得计算得16位有效地址,零扩展后存入位有效地址,零扩展后存入32位目的寄存器位目的寄存器3232计算得计算得32位有效地址,存入位有效地址,存入32位目的寄存器位目的寄存器 由于存在着目的寄存器位数与源操作数有效地址长度的不同,由于存在着目的寄存器位数与源操作数有效地址长度的不同,该指令执行的操作如下表所示该指令执行的操作如下表所示:如下图所示,设指令如下图所示,设指令“LEA
17、 SI,BUF”中中BUF的有效地址的有效地址EA是是100H,因此该指令完成将,因此该指令完成将100H送入送入SI中,而不是把中,而不是把DS:100H所指所指向字单元的内容向字单元的内容00FFH送入送入SI中。中。LEA SI,BUF 指令的执行情况指令的执行情况 LDS、LES 地址指针送寄存器和段寄存器指令地址指针送寄存器和段寄存器指令 在前面曾介绍,一个存储单元的逻辑地址是由在前面曾介绍,一个存储单元的逻辑地址是由16位段基值位段基值(或段选择器)和(或段选择器)和16(或(或32)位偏移地址组成。因此,可用)位偏移地址组成。因此,可用4(或(或6)个字节单元来存放这个逻辑地址。
18、这)个字节单元来存放这个逻辑地址。这4(或(或6)个字节单)个字节单元构成元构成32(或(或48)位的)位的地址指针地址指针,段基值(或段选择器)存放在,段基值(或段选择器)存放在2个高字节单元中,偏移地址则存放在个高字节单元中,偏移地址则存放在2(或(或4)个低字节单元中。)个低字节单元中。32位的地址指针如右图所示:位的地址指针如右图所示:指令指令LDS的功能就是从作为地址指针的的功能就是从作为地址指针的4(或(或6)个存储单元)个存储单元中,同时取出段基值(或段选择器)与偏移地址,分别送到段寄中,同时取出段基值(或段选择器)与偏移地址,分别送到段寄存器存器DS和指定通用寄存器中。和指定通
19、用寄存器中。LDS指令格式:指令格式:LDS DEST,SRC LES、LFS、LGS、LSS指令与其格式相同,只是指定的段寄指令与其格式相同,只是指定的段寄存器不同。存器不同。LDS指令功能:指令功能:DEST(SRC)DS(SRC+2)或)或DS(SRC+4)受影响的状态标志位:受影响的状态标志位:无。无。【例例4-14】右图给出了指令右图给出了指令“LDS SI,ADRBX”的执行情况。的执行情况。由源地址由源地址ADRBX可以计算出可以计算出源操作数在数据段的有效源操作数在数据段的有效地址地址EA。这时。这时EA及及EA+2指向的字单元作为指向的字单元作为32位地位地址指针。址指针。E
20、A指向的字单元指向的字单元存放的是偏移地址存放的是偏移地址,应送,应送到指令指定的到指令指定的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,(1E4F
21、6H)=091DH。试给出以下指令的执行结果。试给出以下指令的执行结果。(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 o
22、r eflags)标志出栈。标志出栈。【例例4-25】指令指令“LDS SI,10H”执行前,如果(执行前,如果(DS)C000H,(,(C0010H)0180H,(,(C0012H)=2000H。则指令执行后:则指令执行后:(SI)0180H,(,(DS)=2000H。LAHF标志送标志送AH指令指令 指令格式:指令格式:LAHF 指令功能:指令功能:AH FLAGS的低字节,即将标志寄存器的的低字节,即将标志寄存器的低低8位内容传送到位内容传送到AH寄存器中,也就是把标志位寄存器中,也就是把标志位SF、ZF、AF、PF、CF送至送至AH中的第中的第7,6,4,2,0位。位。受影响的状态标志
23、位:受影响的状态标志位:无。无。SAHF AH送标志寄存器指令送标志寄存器指令 指令格式:指令格式:SAHF 指令功能:指令功能:FLAGS的低字节的低字节(AH),即将),即将AH寄存器寄存器的内容传送给标志寄存器的低的内容传送给标志寄存器的低8位。位。受影响的状态标志位:受影响的状态标志位:SF、ZF、AF、PF、CF。SAHF指令用以设置或恢复指令用以设置或恢复SF、ZF、AF、PF、CF 5个标志位。个标志位。它只影响标志寄存器的低它只影响标志寄存器的低8位,对高位,对高8位标志无位标志无影响。影响。PUSHF/PUSHFD标志进栈指令标志进栈指令 指令格式:指令格式:PUSHF 指令
24、功能:指令功能: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)类型转换指令)类型转换指令 这种指
25、令可将字节、字转换为字、双字,共有这种指令可将字节、字转换为字、双字,共有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。
限制150内