第5章 指令系统与寻址方式.ppt
微微 机机 原原 理理 与与 接接 口口 技技 术术1第第5章章 指令系统与寻址方式指令系统与寻址方式5.1 指令格式及操作数类型指令格式及操作数类型 5.2 寻址方式寻址方式5.3 Intel 8086的指令系统的指令系统微微 机机 原原 理理 与与 接接 口口 技技 术术2【重点难点】18086操作数寻址方式;2堆栈和子程序调用;3转移指令和循环结构。 本章以8086/8088 CPU为例介绍80 x86微型计算机的指令系统。包括指令的基本格式、指令的寻址方式和各类指令的功能。 微微 机机 原原 理理 与与 接接 口口 技技 术术35.1 指令格式及操作数类型指令格式及操作数类型 5.1.1 指令格式指令格式 指令是指示计算机完成特定操作的命令。 指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。 指令系统因机而异,没有通用性。微型计算机的指令由操作码(OP)和操作数两部分组成,如图5.1所示。操作码部分决定指令的操作类型,告诉计算机这条指令是让它做什么,比如加法、取数等;操作数部分可以是指令所需的操作数,也可以是操作数的地址或关于操作数地址的其他信息。微微 机机 原原 理理 与与 接接 口口 技技 术术4 指令在机器中用若干位二进制数表示。8086/8088指令为16个字节。第1个字节和第2个字节(部分位)表示操作码,其余为操作数。操作数不同的指令有所区别,通常一条指令包含一个或两个操作数,前者称为单操作数指令,后者称为双操作数指令。双操作数分别称为源操作数(SRC)和目的操作数(DST)。图图5.1 指令格式指令格式微微 机机 原原 理理 与与 接接 口口 技技 术术55.1.2 操作数类型操作数类型 8086/8088系统中操作数有三种可能的存放位置,分别称为三种类型的操作数:立即数、寄存器操作数和存储器操作数。 1.立即数立即数。作为指令代码的一部分出现在指令中,可以用数值,也可以用有确定值的表达式,通常作为源操作数使用。计算机取指令时就把操作数读出来了,执行时无需再去访问内存取操作数,得到操作数的速度快。微微 机机 原原 理理 与与 接接 口口 技技 术术6 2.寄存器操作数寄存器操作数。把操作数放在寄存器中,即用微处理器中的寄存器存放源操作数或目的操作数。有的指令给出寄存器名字,而有的指令则隐含在某个通用寄存器中。因寄存器在微处理器中,执行指令时也无需访问内存就可以获取操作数。 3.存储器操作数存储器操作数。把操作数存放在存储器的某个单元中,执行指令时如需操作数,计算机必须按20位的物理地址去访问内存取得操作数。 20位物理地址段基址位物理地址段基址16偏移量偏移量 偏移量也叫逻辑地址或有效地址 其中的段基址由由段寄存器给出,而存放操作数单元的偏移量由寻址方式计算得到。 微微 机机 原原 理理 与与 接接 口口 技技 术术75.2 寻址方式寻址方式 计算机可以对存储器、寄存器中的数据进行各种操作,如取数、存数、加运算、减运算等,这就需要找到数据的存放地址,再对其中的数据执行相应的操作,最后将运算结果送往指定的地址单元或寄存器。寻址方式就是寻找指令操作数所在地寻址方式就是寻找指令操作数所在地址的方式,以确定数据的来源和去处址的方式,以确定数据的来源和去处。寻址方式越多,灵活性就越大,使用时越方便。熟练地掌握寻址方式对学习指令系统和汇编语言程序设计具有重要作用。下面对三种操作数对应的寻址方式分别介绍,如不指明均指源操作数寻址。微微 机机 原原 理理 与与 接接 口口 技技 术术85.2.1立即数寻址方式立即数寻址方式 此方式中指令操作数部分直接给出指令的操作数,它与指令操作码相接,顺序存放在代码段中。立即数有位和位之分。例例5.1 MOV AH ,36H ;立即数36H送CPU寄存器AH CS:IP 机器码 指令 0100:0000 B436 MOV AH, 036h图图5.2 8位立即数寻址图位立即数寻址图 5.3 16位立即数寻址位立即数寻址微微 机机 原原 理理 与与 接接 口口 技技 术术9 该指令为两字节指令,指令逻辑地址为0100:0000,其中B4为操作码,说明指令的功能,36为源操作数,目的操作数AH隐含在操作码中,即将指令中所含操作数36H送寄存器AH,所需8位源操作数在指令代码中,CPU在取得指令后即取到了操作数,不需要访问主存。指令执行后AH内容为36H,目的操作数AH为寄存器器寻址,如图5.2所示。在debug调试状态下单步执行后CPU状态如下:AX=3600 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=0002 NV UP EI PL NZ NA PO NC可见,指令执行后,AX寄存器高字节AH更新为36H。 微微 机机 原原 理理 与与 接接 口口 技技 术术10例例5.2 MOV AX ,1234H ;立即数1234H送CPU寄存器AXCS:IP 机器码 指令0100:0002 BB3412 MOV BX, 01234h该指令为三字节指令,指令逻辑地址为0100:0002,其中BB为操作码,说明指令的功能,3412为源操作数,分别为源操作数据的低字节和高字节,如图 5.3所示,目的操作数BX隐含在操作码BB中,即将指令中操作码下16位字数据1234H送寄存器BX,因为16位源操作数在指令代码中,CPU在取得指令后即取到了操作数,不需要访问主存。目的操作数BX为寄存器器寻址,指令执行后BX寄存器内容更新为1234H。 微微 机机 原原 理理 与与 接接 口口 技技 术术11单步执行后CPU状态如下:AX=3600 BX=1234 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=0005 NV UP EI PL NZ NA PO NC指令执行后,BX寄存器更新为1234H。注意:注意: (1)立即数寻址方式只能用于源操作数,主要用于给寄存器或存储器赋初值。(2)立即数寻址方式不执行总线周期,执行速度快。微微 机机 原原 理理 与与 接接 口口 技技 术术12【思考】有某一指令执行前的单步状态如下:AX=0710 BX=0000 CX=2079 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0710 ES=0700 SS=0710 CS=0917 IP=0005 NV UP EI PL NZ NA PO NC0917:0005 B96400 MOV CX, 0064h 上述指令的IP值是_,该指令的物理地址是_,机器码中的6400是_,其中64是_(高/低)字节,物理地址是_,00是_(高/低)字节,物理地址是_,目的操作数隐含在操作码_中,指令执行前CX寄存器的值是_,执行后CX寄存器的值是_,下一条指令的IP值是_。 微微 机机 原原 理理 与与 接接 口口 技技 术术135.2.2寄存器寻址方式寄存器寻址方式 此方式的操作数放在寄存器内,由指令直接给出某个寄存器的名字,以寄存器的内容作为操作数。寄存器可以是16位的AX、BX、CX、DX、SI、DI、SP、BP寄存器,也可以是8位的AH、AL、BH、BL、CH、CL、DH、DL寄存器。例例5.3 MOV AX ,BX ;寄存器BX的内容送AX寄存器 指令执行前CPU状态如下:AX=1234 BX=0036 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=0005 NV UP EI PL NZ NA PO NC0100:0005 8BC3 MOV AX, BX微微 机机 原原 理理 与与 接接 口口 技技 术术14 该指令为两字节指令,指令逻辑地址为0100:0005,8BC3为操作码,说明指令的功能,目的操作数和源操作数均隐含在机器码中。指令执行前AX寄存器和BX寄存器的值分别为1234H、0036H,指令执行后将BX的内送寄存器AX,AX寄存器的内容更新为0036H,BX寄存器的内容不变,源操作数BX和目的操作数AX均为寄存器器寻址。 单步执行后CPU状态如下:AX=0036 BX=0036 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=0007 NV UP EI PL NZ NA PO NC微微 机机 原原 理理 与与 接接 口口 技技 术术15注意:注意: (1) 寄存器寻址方式的指令操作在CPU内部执行,不需要执行总线周期,执行速度快。(2) 寄存器寻址方式既适用于指令的源操作数,也适用于目的操作数,并且可同时用于源操作数和目的操作数。【思考】有指令执行前CPU状态如下:AX=0710 BX=0032 CX=0064 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0710 ES=0700 SS=0710 CS=0917 IP=000A NV UP EI PL NZ NA PO NC0917:000A 8BF8 MOV DI, AX 上述指令的IP值是_,指令长度为_字节,指令执行前AX寄存器和DI寄存器的的值分别是_、_,指令执行后DI寄存器的值是_,下一条指令的IP值是_。 微微 机机 原原 理理 与与 接接 口口 技技 术术165.2.3存储器操作数存储器操作数 存储器寻址方式表明操作数存放在内存中,要想得到操作数,CPU必须经过系统总线访问存储器。在编写程序时存储器的地址是以逻辑地址形式表示的,因此这一类寻址方式在指令中要表示出有效地址EA。需要注意的是,对于双操作数指令而言,两个操作数不允许同时用存储器寻址方式,即不允许两个操作数都是存储器操作数。1. 直接寻址直接寻址此方式的操作数在存储器中,指令中直接给出操作数所在存储单元的有效地址。有效地址(EA)也称为偏移地址,它代表操作数所在存储单元距离段首址的字节数。有效地址是一个无符号的16位二进制数。 微微 机机 原原 理理 与与 接接 口口 技技 术术17例例5.4 MOV AX,2000H ;将数据段有效地址2000H单元的字数据送CPU中寄存器AX 指令执行前CPU状态如下:AX=1234 BX=1234 CX=0012 DX=B123 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=000C NV UP EI PL NZ NA PO NC0100:000C A10020 MOV AX, 02000h DS:2000=4132h 图图5.4 数据段数据段(emu8086)微微 机机 原原 理理 与与 接接 口口 技技 术术18图图5.5 5.5 直接寻址读内存直接寻址读内存微微 机机 原原 理理 与与 接接 口口 技技 术术19 该指令为三字节指令,指令逻辑地址为0100:000C,其中A1为操作码,说明指令的功能,操作码后的0020为所需16位源操作数的有效地址2000H,默认在数据段中,如图5.4所示,即将有效地址2000H和2001H两个字节单元中的16 位数4132H送CPU寄存器AX。指令执行时将源操作数的逻辑地址0100:2000转换为内存物理地址03000H,CPU访问存储器取得16位的操作数4132H,经总线送CPU寄存器AX,目的操作数AX为寄存器寻址,如图5.5。 微微 机机 原原 理理 与与 接接 口口 技技 术术20例例5.5 MOV 3000H,BX ;BX寄存器内容送数据段有效地址3000H单元 指令执行前CPU状态如下:AX=0000 BX=1234 CX=0012 DX=B123 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=000F NV UP EI PL NZ NA PO NC0100:000F 891E0030 MOV 03000h, BX图图5.6数据段数据段微微 机机 原原 理理 与与 接接 口口 技技 术术21图图5.7 直接寻址写内存直接寻址写内存微微 机机 原原 理理 与与 接接 口口 技技 术术22 该指令为四字节指令,指令逻辑地址为0100:000F,其中891E为操作码,说明指令的功能,操作码后的0030为目的操作数有效地址3000H,默认在数据段中。如图5.6所示,指令执行后将BX寄存器的内容1234H经总线送存储器数据据段,其物理地址为0100H10H +3000H =04000H,如图5.7所示。 直接寻址方式除了用数值作为有效地址以外,还可以用符号地址的形式。为存储单元定义一个名字,该名字就是符号地址或称为变量。 在与内存有关的寻址方式中,操作数的段地址默认为数据段。若操作数存放在其他段中,称为段超越,需要在指令中用段超越前缀指出,即用操作数前加上段寄存器名和冒号表示,如例5.7。 微微 机机 原原 理理 与与 接接 口口 技技 术术23例例5.6 MOV AX ,VALUE ;取VALUE单元的字数据送寄存器AX。 从图5.8中可知VALUE字单元的有效地址为0106H,内容为2345H。 物理地址=(DS)10H+EA=07206H 指令执行后AX的内容更新为2345H 图图5.8 数据段数据段VALUE变量变量微微 机机 原原 理理 与与 接接 口口 技技 术术24例例5.7 MOV AX ,ES:1000H指令执行前CPU状态如下:0721:0011 26 ES:AX=2345 BX=0036 CX=0126 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0710 ES=0710 SS=0710 CS=0721 IP=0012 NV UP EI PL NZ NA PO NC0721:0012 A10010 MOV AX, 01000h ES:1000=4644h 图图5.9 附加段状态附加段状态 微微 机机 原原 理理 与与 接接 口口 技技 术术25 该指令为四字节指令,指令逻辑地址为0721:0011,首字节26说明使用附加段,操作码A1说明指令的功能,操作码后的0010为源操作数有效地址1000H。指令执行时将源操作数的逻辑地址ES:1000转换为内存物理地址:0710H10H+1000H=08100H,CPU访问存储器取得16位的操作数4644H,经总线送CPU寄存器AX。 微微 机机 原原 理理 与与 接接 口口 技技 术术26【思考】1. 有指令执行前CPU状态如下:AX=0710 BX=3478 CX=0064 DX=0000 SP=2040 BP=0000 SI=0000 DI=0710DS=0710 ES=0700 SS=0710 CS=0917 IP=0012 NV UP EI PL NZ NA PO NC0917:0012 891E1010 MOV 01010h, BX DS:1010=4834h 上述指令源操作数寻址方式为_;目的操作数寻址方式为_,逻辑地址为_,物理地址为_,执行后其内容为_。微微 机机 原原 理理 与与 接接 口口 技技 术术27图图5.10 数据段数据段2. 现有数据段如图5.10所示,执行指令MOV CX ,1053H 后 ,CX 的值是_。微微 机机 原原 理理 与与 接接 口口 技技 术术283. 指令 MOV ES:VAR,0A3B4H 执行前CPU状态如下:0712:000F 26 ES:AX=0036 BX=A3B4 CX=0037 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0700 ES=0710 SS=0710 CS=0712 IP=0010 NV UP EI PL NZ NA PO NC0712:0010 C7061600B4A3 MOV w.00016h, 0A3B4hES:0016=45h 上述指令的逻辑地址是_,第一字节26说明存储器操作数为_段,第二三字节C706为操作码,说明指令的功能,第四五字节1600为_操作数有效地址,第六七字节B4A3为_操作数立即数,从上述指令状态中可知变量VAR的偏移地址是_,物理地址是_,指令执行后变量VAR内容更新为_。 微微 机机 原原 理理 与与 接接 口口 技技 术术292. 寄存器间接寻址寄存器间接寻址 操作数在内存中,但其内存单元的有效地址存放在某一个寄存器中,指令形式如: MOV AX , BX 操作数的有效地址EA在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数的段基址在数据段DS或堆栈段SS中。如果有效地址由BX、SI、DI指出,则默认为对应于数据段。 (BX) 操作数的物理地址=(DS)10H + (SI) (DI)如果有效地址由BP指出则对应于堆栈段。 操作数的物理地址=(SS)10H + (BP) 由于有效地址EA是间接从寄存器中得到的,所以称为寄存器间接寻址方式。8086 CPU 只允许BX、BP、SI、DI这四个寄存器作为间址寄存器。 微微 机机 原原 理理 与与 接接 口口 技技 术术30例例5.8 MOV AX ,BX ;从BX指向的内存地址中读取一字数据送CPU 的AX寄存器中。 指令执行前CPU状态如下:AX=0000 BX=1234 CX=0012 DX=B123 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=0013 NV UP EI PL NZ NA PO NC0100:0013 8B07 MOV AX, BXDS:1234=5747h 该指令为两字节指令,0100:0013为指令逻辑地址,8B07为操作码,说明指令的功能,源操作数的有效地址由寄存器BX给出,默认在数据段中,即将有效地址1234H和1235H两个字节单元中的16 位数5747H送CPU寄存器AX。指令执行时根据段基址DS和寄存器BX的值计算出操作数物理地址02234H,CPU访问存储器取得16位的操作数5747H,经总线送CPU寄存器AX,目的操作数AX为寄存器寻址,如图5.11。微微 机机 原原 理理 与与 接接 口口 技技 术术31图图5.11 寄存器间接寻址读内存寄存器间接寻址读内存微微 机机 原原 理理 与与 接接 口口 技技 术术32单步执行后CPU状态如下:AX=5747 BX=1234 CX=0012 DX=B123 SP=FFFE BP=0000 SI=0000 DI=0000DS=0100 ES=0100 SS=0100 CS=0100 IP=0015 NV UP EI PL NZ NA PO NC 【思考】已知执行下述指令前CPU状态如下:AX=07A4 BX=0101 CX=0FF0 DX=0000 SP=0000 BP=0156 SI=0050 DI=0000DS=0710 ES=0759 SS=07A4 CS=080D IP=0018 NV UP EI PL NZ NA PO NC 分别求下列指令操作数的有效地址和物理地址。 mov ax,bx mov cx,bp mov si,dx mov es:bx,ax mov ax,ds:bp 微微 机机 原原 理理 与与 接接 口口 技技 术术333. 寄存器相对寻址寄存器相对寻址 操作数存放在内存中,其内存单元的有效地址由寄存器和偏移量两部分组成,指令形式如下: MOV AX ,BX+1234H 操作数的有效地址EA是一个寄存器的内容加上8位或16位偏移量之和。 (BX) 操作数的物理地址=(DS)10H +(SI) + 8位(16位)相对偏移量 (DI) 如果有效地址由BP指出则对应于堆栈段。操作数的物理地址=(SS)10H + (BP)+ 8位(16位)相对偏移量 由于有相对偏移量,所以称为寄存器相对寻址方式。此寻址方式常用于查表操作。可利用位移量做首地址,用变址寄存器SI、DI做指针来连续查表;或用基址寄存器BX、BP作首地址,用位移量作偏移地址来访问表中的某一个数据。 微微 机机 原原 理理 与与 接接 口口 技技 术术34例例5.9 MOV AX,TOPSI ;读取TOP表中SI指向的内存区字数据送AX寄存器,TOP相当于符号地址。指令执行前CPU状态如下:AX=0000 BX=1234 CX=0012 DX=B123 SP=0000 BP=0000 SI=0002 DI=0000DS=0710 ES=0700 SS=0710 CS=0715 IP=001D NV UP EI PL NZ NA PO NC0715:001D 8B4440 MOV AX, SI + 040h DS:0042=3344h 图图5.12 数据段数据段TOP表表微微 机机 原原 理理 与与 接接 口口 技技 术术35图图5.13 相对寻址读内存相对寻址读内存微微 机机 原原 理理 与与 接接 口口 技技 术术36 从图5.12可看出TOP变量的有效地址为40H。该指令为三字节指令,0715:001D为指令逻辑地址,8B44为指令操作码,说明指令的功能,40为源操作数相对寻址方式中的相对量,源操作数的有效地址由寄存器SI+相对量40H给出,默认在数据段中,即将有效地址0042H和0043H两个字节单元中的16 位数3344H送CPU寄存器AX。指令执行时根据段基址DS的值0710H、指令中的相对量40H、SI寄存器的值0002H计算出操作数物理地址07142H,CPU访问存储器取得16位的操作数3344H,经总线送CPU寄存器AX,目的操作数AX为寄存器器寻址,如图5.13。指令执行后CPU状态如下:AX=3344 BX=1234 CX=0012 DX=B123 SP=0000 BP=0000 SI=0002 DI=0000DS=0710 ES=0700 SS=0710 CS=0715 IP=0020 NV UP EI PL NZ NA PO NC 微微 机机 原原 理理 与与 接接 口口 技技 术术37【思考】已知执行下述指令前CPU状态如下:AX=07A2 BX=0101 CX=0F7C DX=0000 SP=0000 BP=0156 SI=0050 DI=0000DS=0713 ES=075A SS=07A2 CS=0710 IP=0019 NV UP EI PL NZ NA PO NC 设变量VAR有效地址为40H,求下列指令操作数的有效地址和物理地址。mov es:20hbx,ax mov dx,bp+4 mov ss:si+10H,di mov ax,es:bp+2 mov vardi,ax 微微 机机 原原 理理 与与 接接 口口 技技 术术384. 基址变址寻址基址变址寻址 指令形式:MOV AX ,BX+SI 操作数在内存中,其内存单元的有效地址EA为一个基址寄存器和一个变址寄存器之和。该寻址方式可用于二维表的处理。 操作数的物理地址=(DS)10H + 或: 操作数的物理地址=(SS)10H + 微微 机机 原原 理理 与与 接接 口口 技技 术术39例例5.10 MOV AX ,BX+DI;读取数据段以BX所指内存单元为首址,加偏移量为DI的内存单元字数据。 指令执行前CPU状态如下: AX=0000 BX=0240 CX=0212 DX=B123 SP=0000 BP=0000 SI=0000 DI=0002DS=0710 ES=0700 SS=0710 CS=0735 IP=0020 NV UP EI PL NZ NA PO NC0735:0020 8B01 MOV AX, BX + DIDS:0242=7896h 图图5.14 数据段状态数据段状态微微 机机 原原 理理 与与 接接 口口 技技 术术40有效地址:EA=(BX)+(DI)= 0240H+0002H=0242H物理地址=(DS)x 10H + EA = 07100H + 0270H=07370H指令执行后AX=7896H 该指令为二字节指令,0735:0020为指令逻辑地址,8B01为指令操作码,说明指令的功能,源操作数的有效地址EA由寄存器BX+DI计算得出,即将有效地址0242H和0243H两个字节单元中的16 位数7896H送CPU寄存器AX。指令执行时根据段段基址DS的值0710H、有效地址EA计算出操作数物理地址07370H,CPU访问存储器取得16位的操作数7896H,经总线送CPU寄存器AX。 微微 机机 原原 理理 与与 接接 口口 技技 术术415. 相对基址变址寻址相对基址变址寻址 指令形式:MOV AX ,BX+SI+1234H 操作数在内存中,其内存单元的有效地址EA为一个基址寄存器加一个变址寄存器再加一个位移量,三者之和。该寻址方式可用于二维表格和栈处理。 操作数的物理地址=(DS) 10H + 操作数的物理地址=(SS)10H +微微 机机 原原 理理 与与 接接 口口 技技 术术42例例5.11图图5.15 存放十六进制存放十六进制数的二维表数的二维表MOV AX ,MASKBX+SI;读取如图5.15所示二维表格,MASK以BX所指内存单元为首址(行首),相对行首偏移量为SI(列)的内存单元字数据。 图图5.15 存放十六进制数的二维表存放十六进制数的二维表指令执行前CPU状态如下:AX=4834 BX=0014 CX=2012 DX=B123 SP=0000 BP=0000 SI=0004 DI=0000 DS=0710 ES=0700 SS=0710 CS=0917 IP=0020 NV UP EI PL NZ NA PO NC0917:0020 8B804020 MOV AX, BX + SI + 02040hDS:2058=3534h 微微 机机 原原 理理 与与 接接 口口 技技 术术43 图图5.16 MASK表在数据段的存放状态表在数据段的存放状态有效地址:EA=MASK+(BX)+(SI)=2040H+0014H+0004H=2058H物理地址=(DS)x 10H+EA=0710H x 10H+2058H=09158H指令执行后:AX=3534H微微 机机 原原 理理 与与 接接 口口 技技 术术44 该指令为四字节指令,0717:0020为指令逻辑地址,8B80为指令操作码,说明指令的功能,4020为源操作数相对基址变址寻址方式中的相对量,源操作数的有效地址EA由寄存器BX+SI+相对量2040H计算得出,即将有效地址2058H和2059H两个字节单元中的16 位数3534H送CPU寄存器AX。指令执行时根据段段基址DS的值0710H、有效地址EA计算出操作数物理地址09158H,CPU访问存储器取得16位的操作数3534H,经总线送CPU寄存器AX。微微 机机 原原 理理 与与 接接 口口 技技 术术455.3 Intel 8086的指令系统的指令系统 指令系统包括六大类、133种基本指令,通过寻址方式的变化与数据形式(字节、字型)的组合,可构成上千条指令。指令系统按功能分为数据传送类、算术运算类、位操作类、串操作类、控制转移类、处理机控制类,本节将分别说明。5.3.1 数据传送类数据传送类 数据传送类指令用来实现寄存器和存储器间的字节或字的数据传送,其中包括传送指令、堆栈操作指令、交换指令、查表指令、地址传送指令、标志传送指令、输入/输出指令。除SAHF和POPF指令外,这组指令对各标志位没有影响。微微 机机 原原 理理 与与 接接 口口 技技 术术461. MOV传送指令传送指令 指令格式: MOV DST,SRC; (DST)(SRC)功能:将源操作数传送到目的操作数,其中SRC表示源操作数,DST表示目的操作数。 MOV指令可实现CPU内部通用寄存器和段寄存器、存储器、立即数之间的数据传送,如图5.17。 图图5.17 5.17 数据传送方向数据传送方向微微 机机 原原 理理 与与 接接 口口 技技 术术47例例5.12 MOV DS, AX MOV BX, AX MOV AX, CS MOV BX, DS MOV BX, AX MOV SI, 3456H MOV AX, 1234H注意注意,下述指令是非法的:MOV BX,20HSI ; 两个操作数不可同时为存储器操作数MOV BH,AX ;8位或16位数据类型必须一致MOV 1234H,AX ;不允许把立即数作目的操作数MOV DS,2000H ;不允许向段寄存器送立即数MOV DS,ES ;不允许在段寄存器之间传送数据MOV CS,AX ;不能把寄存器CS、IP用作目的操作数MOV IP,AX ;不能把寄存器CS、IP用作目的操作数 微微 机机 原原 理理 与与 接接 口口 技技 术术48【思考】1.设数据段内容如下:1000:0020 6A 60 63 47 64 00 00 00-00 00 00 00 00 00 00 00 jcGd. 执行下述指令后AX寄存器的内容是_。mov ax,1000hmov ds,axmov bx,20h mov ax,2bx2.判断下述指令的正误,若有错误,请说明错误的原因。MOV 1234H, AXMOV DS, 0B47HMOV 1000H, BXMOV DS, CSMOV 23H, ALMOV BX, ALMOV IP, AX微微 机机 原原 理理 与与 接接 口口 技技 术术493.根据要求写出对应的汇编指令 1)将AX寄存器的内容送BX所指的数据段。 2)立即数3456H送内存区SI所指的数据段。 3)读取BP所指的堆栈段字数据送AX寄存器。 4)AX寄存器的内容送DS寄存器。 5)立即数100H送DI寄存器。 6)基址寄存器BX和变址寄存器SI所指内存的字数据送AX寄存器。 微微 机机 原原 理理 与与 接接 口口 技技 术术502.出入栈指令出入栈指令 堆栈是按“先进后出、后进先出”的原则工作的一段特殊的存储器区域。8086/8088系统中,堆栈位于堆栈段,其段地址由SS寄存器指示。堆栈操作还与堆栈指针寄存器SP有关,SP的内容始终为当前栈顶所在的存储单元地址,栈顶将随进栈或出栈操作而变化。堆栈操作始终是针对栈顶单元,其物理地址是:SS10H+SP。 进栈指令格式:PUSH SRC ;(SP)(SP)-2、(SP)1,(SP)(SRC) 功能:先将堆栈指针SP减 2,再将操作数SRC入栈。要求SRC必须是16位字数据。 出栈指令格式:POP DST ;(DST)(SP)1,(SP)、(SP)(SP)2 功能:先将栈顶指针SP所指内存单元的内容送到目的操作数DST中,再将堆栈指针SP加 2。微微 机机 原原 理理 与与 接接 口口 技技 术术51例例5.13 已知(AX)=1122H,(BX)=3344H,(SP)=1010H,(SS)=1250H 执行指令:PUSHAX PUSHBX入栈过程示意如图5.18所示: 图图5.185.18微微 机机 原原 理理 与与 接接 口口 技技 术术52图图5.195.19指令执行前指令执行前 图图5.20 5.20 指令执行后指令执行后 在Emu8086中指令执行前后堆栈描述窗口如下,其中”表示当前栈顶指针。 微微 机机 原原 理理 与与 接接 口口 技技 术术53例例5.14接上例,若执行出栈指令 MOV AX, 0 MOV BX, 1 POP BX POP AX 在执行出栈指令前,AX和BX寄存器的值已改变,但由于他们的原值已保存在栈区了,因此可以很容易的恢复。出栈过程示意如图5.21。 出栈后(AX)=1122H,(BX)=3344H,需要注意的是这两个字仍然保存在堆栈单元中,但栈顶指针SP已经不指向他们了,表示这两个字可以被覆盖了。 出栈后Emu8086中堆栈区状态图图5.215.21微微 机机 原原 理理 与与 接接 口口 技技 术术54【思考】(1)有堆栈区状态如图5.22,当前栈顶的逻辑地址SS:SP=_。栈顶内容是_;若执行出栈指令POP AX后,栈顶指针SP更新为_,AX的内容更新为_。(2)已知(AX)=06A5H,(BX)=347EH,(SP)=002EH,(SS)=2325H,写出下列指令执行后,寄存器AX、BX、SP的值。 MOV AX,06A5H MOV BX,347EH MOV SP, 002EH PUSH AX PUSH BX POP AX POP BX图图5.22微微 机机 原原 理理 与与 接接 口口 技技 术术553. 交换指令交换指令指令格式: XCHG OPR1,OPR2 ;(OPR1)(OPR2)功能:实现两个操作数内容(8位或16位)的互换。例例5.15 XCHG AH, AL ;寄存器AX的高8位AH和低8位AL互换例例5.16 已知(BX)=1122H,(BP)=0123H,(DI)=0078H, (SS)=2200H,(2219BH)=3344H指令: XCHG BX ,BP+DI源操作数的物理地址=10H(SS)+( BP)+(DI) =22000H+0123H+0078H=2219BH指令执行结果为: (BX)=3344H,(2219BH)=1122H。注意:注意:两个操作数不能为段寄存器或立即数,并且不能同时为存储器操作数。CS、IP寄存器的内容不能交换。 微微 机机 原原 理理 与与 接接 口口 技技 术术564.换码指令(查表转换指令)换码指令(查表转换指令)此指令通过查表完成所需要的代码转换。指令格式: XLAT ;(AL)(BX)+(AL)例例5.17已知:(DS)=E000H ,(BX) =0030H,(AL)=01数据表:(E0030H)=30H,(E0031H)=31H,(E0032H)=32H 执行指令: XLAT 指令执行结果:(AL)=31H ,即将地址E0031H单元的内容31H送入寄存器AL中。AL中的代码由01H(十进制数字1)转换为31H (ASCII码)。 使用换码指令前,首先应建立被转换代码(字节型)的数据表,并将表格的首地址存入寄存器BX中;再将代码(相对于表格首地址的位移量)存入寄存器AL中;指令执行后,寄存器AL中的内容就是查表得到的转换代码。注意: 换码指令只能使用寄存器BX、AL,不影响标志位。 微微 机机 原原 理理 与与 接接 口口 技技 术术57【思考】mov bx,offset tab mov al,3 xlat tab db 0C0H,0F9H,0A4H db 0B0H,99H,92H db 82H,0F8H,80H db 90H,0FFH 上述指令执行后AL寄存器的值为_。5. 取有效地址指令取有效地址指令指令格式:LEA REG, SRC ;(REG)SRC 功能:存储器操作数SRC所在内存单元的有效地址送寄存器。例例5.18 MOV BX,20H LEA AX,200HBX 上述指执行后(AX)=220H例例5.19 LEA AX, VAR ORG 100H VAR DW 20H DUP(?) 上述指执行后 (AX)=100H 微微 机机 原原 理理 与与 接接 口口 技技 术术586 取逻辑地址取逻辑地址 指令格式: LDS REG,SRC;(REG)(SRC),(DS)(SRC+2) LES REG,SRC;(REG)(SRC),(ES)(SRC+2) 功能:将源操作数指定的4个连续字节单元的内容作为操作数的逻辑地址,分别送入指令指定的寄存器以及DS或ES中。例例5.20已知: (DS)=C000H (C2480H)=1357H (C2482H)=2468H 执行指令: LDS SI,2480H 指令执行结果: