第三章寻址方式与指令系统3.1数据类型及其存储规则3.1.1基本数据类型及存储一个存储单元——一个字节占用内存的一个地址。基本数据类型:字、双字、四字、双四字字——两个相邻字节组成的16位二进制;双字——4个相邻字节组成的32位二进制数;四字——8个相邻字节组成的64位二进制数;双四字——16个相邻字节组成的128位二进制数。高低高字低字高双字低双字字节字双字四字高四字低四字双四字70701581503116310633263012764NNN+1NN+2NN+4NN+8图3.1基本数据类型的结构形式9CH48H2BH6AH7AH1AHC3H23H72H92H8BH3AHABHA2H12H45H…NN+1N+2N+3N+4N+5N+6N+7N+8N+9N+10N+11N+12N+13N+14N+15单元地址图3.2基本数据类型存储规律3.1.2数字数据类型数据类型包含:无符号整数、带符号整数和浮点数。1.无符号整数(范围:0~2n-1)2.带符号整数(范围:-2n-1~+2n-1-1)带符号整数是用2的补码表示的二进制值。规定操作数的最高位为符号位。3.浮点数浮点数据类型可分为三种:单精度浮点、双精度浮点和双扩展的精度浮点。3.1.3指针数据类型在实方式下有两种类型的指针:近指针(16位)和远指针(32位)偏移Near指针310偏移段选择子Far指针或逻辑地址3104732(a)(b)图3.3指针数据类型(虚拟方式)3.1.4字符串、位及位串数据类型字符串包括字节串、字串和双字串。它们分别是字节、字和双字的相邻序列。707070150150150310310310字节串字串双字串NN+1N+MNN+2N+2MNN+4N+4M………图3.4字节、字、双字字符串数据类型3.2计算机指令格式指令包括两部分:指令操作码部分和地址码部分。指令操作码部分是给出该指令应完成何种操作。地址码部分是用来描述该指令的操作对象。指令格式可分为:零地址指令、一地址指令、二地址指令和三地址指令。零地址指令:只有操作码部分,而没有操作数的指令;一地址指令:只有目的操作数的单操作数指令;二地址指令:有两个地址指出两个操作数的地址;三地址指令优点:操作结束后,原两个操作数的内容均未被破坏;缺点:增加一个地址后,使得指令码加长,增加了存储空间,取指时间变长。3.2.1指令的助记符格式助记符格式可用以下通式表示:L:opD1,D2,D3其中:L是标号,在标识符后面跟有冒号(:)op是助记符,具有相同功能的指令操作码的保留名例如:MOVAX,[BX]操作码的助记符目的操作数源操作数3.2.280x86指令编码格式指令编码格式包含操作码和操作数两部分。操作码表示计算机执行什么操作。操作数指明参与操作的数的本身,或规定了操作数的地址。图3.58086CPU指令编码的一般形式1)操作码字节它是指令的第一字节,规定指令的操作类型,是指令的必选字节,字节内容如下:D7D6D5D4D3D2D1D0操作码字节寻址方式字节偏移量字节(1/2)立即数字节(1/2)OPDWOP:表示指令操作码,D:表示指令中数据传送的方向。W:表示操作数类型。2)寻址方式字节。它是指令的第二字节,规定操作数的寻址方式。是指令的可选字节,字节内容如下:D7D6D5D4D3D2D1D0MOD:表示方式域,D7、D6位能表示4种不同的方式。REG:表示寄存器域,D5、D4、D3位能表示8种不同的寄存器。R/M:表示寄存器/存储器域,D2、D1、D0位能表示8种不同的寄存器/存储器。MODREGR/M表3-1mod与r/m域所组合的寻址方式MODR/M存储器寻址寄存器寻址逻辑地址的计算公式W=0W=1MOD=00BMOD=01BMOD=10BMOD=11B000001010011100101110111DS:[BX+SI]DS:[BX+DI]SS:[BP+SI]SS:[BP+DI]DS:[SI]DS:[DI]DS:[disp16]Ds:[BX]DS:[BX+SI+disp8]DS:[BX+DI+disp8]SS:[BP+SI+disp8]SS:[BP+DI+disp8]DS:[SI+disp8]DS:[DI+disp8]DS:[disp16+disp8]Ds:[BX+disp8]DS:[BX+SI+disp16]DS:[BX+DI+disp16]SS:[BP+SI+disp16]SS:[BP+DI+disp16]DS:[SI+disp16]DS:[DI+disp16]DS:[disp16+disp16]Ds:[BX+disp16]ALCLDLBLAHCHDHBHAXCXDXBXSPBPSIDI3)偏移量字节是指令的第三、四字节,是指令的可选字节,给出了存储器操作数的偏移量。4)立即数字节是指令的可选字节,给出了指令的立即数。3.38086CPU的寻址方式寻址方式——寻找指令或操作数存放地址的方法。两种寻址方式:一种是用来对操作数进行寻址;另一种是用来对转移地址或调用地址进行寻址,即对指令地址进行寻址。3.3.1操作数的寻址方式1、立即寻址立即数寻址特点:指令执行速度快。立即数只能是整数,且只能作为源操作数。图3-6立即数寻址过程代码段1234┇MOVAX,3412H的指令代码34AXAHAL操作码122、寄存器寻址方式寄存器寻址方式的优点:不但可以减少指令码的长度,而且由于操作数已存于寄存器中,执行速度较快。寄存器既能作为源操作数,又能作为目的操作数。例如:MOVAX,CX该指令将CX(源操作数)的内容传送到AX寄存器(目的操作数)中,其中源操作数CX,目的操作数AX都是寄存器寻址方式。3、存储器寻址指令给出了操作数在数据区中的地址信息。五种不同的存储器寻址方式:(1)直接寻址方式例如:MOVAX,[7834H]该指令将有效地址EA=8064H单元中的内容传送到AX寄存器中。若(DS)=2000H,则该指令源操作数的存储单元的物理地址为20000H+7834H=27834H。代码段操作码34数据段┇2000DS20000+7834278343412AXMOVAX,[7834H]指令代码┇78┇┇1234图3-7直接寻址方式寻址过程(2)寄存器间接寻址操作数存放在存储单元中。注意两点:一是寄存器中的内容是操作数的有效地址,而不是操作数本身;二是只能用CPU中的基址寄存器BX、BP或变址寄存器DI、SI来间接寻址。如果指令前面没有用前缀指令指明操作数在哪一段,则通常默认段寄存器为DS。即:物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+[BP]例如:MOVAX,[DI]代码段操作码数据段1234┇┇1234DS2468BX12340+2468147A83412AXMOVAX,[BX]指令代码┇图3-8寄存器间接寻址示意图(3)寄存器相对寻址操作数存放在存储单元中物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+[BP]例如:MOVBX,[DI+10H]基址寻址——用BX、BP为基址寄存器进行寻址变址寻址——用SI、DI为变址寄存器进行寻址代码段操作码24数据段267868┇1234DS2732BX1234027321B2967826AXMOVAX,[BX+6824H]指令代码┇+6824┇图3-9寄存器相对寻址操作过程(4)基址加变址寻址方式操作数存放在存储单元中物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+例如:ADDAX,[BX+SI]+1026003412340代码段操作码数据段7856┇┇1234DS1026SI1339A5678AXMOVAX,[BX+SI]指令代码┇0034BX图3-10基址加变址寻址方式操作过程(5)相对的基址和变址寻址方式操作数存放在存储单元中物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+例如:MOVAH,[BX+SI+2468H]MOVAH,[BX+SI+2468H]指令代码0110010020000代码段操作码68数据段2623┇2000DS0110SI2267826AH┇0100BX+246824┇图3-11相对的基址和变址寻址方式操作过程过程4、I/O端口寻址操作数在I/O端口中。两种编址方式:与存储器统一编址方式独立的I/O空间编址方式与存储器统一编址方式,上述五种存储器寻址方式均可采用。独立的I/O空间编址方式则对I/O端口有两种寻址方式:(l)直接端口寻址方式端口地址的寻址范围是0~0FFH,端口地址直接由指令给出。(2)间接端口寻址方式端口地址的寻址范围是0~0FFFFH,端口地址由DX寄存器给出。3.3.2指令地址的寻址方式指令地址的寻址方式以下4种:(1)段内直接寻址方式转移的指令地址是由当前的IP内容和指令中规定的8位或16位偏移量之和给出。+2101012112340代码段操作码操作码0121┇┇1234CS14562段内直接转移指令代码┇0121IP目标指令代码图3-12段内直接寻址方式过程(2)段内间接寻址方式转移的指令地址是由用寄存器或一个字存储单元的内容给出。代码段操作码操作码数据寻址方式┇┇CS段内间接转移指令代码┇根据数据寻址方式计算EAIP目标指令代码Σ图3-13段内间接寻址方式过程(3)段间直接寻址方式转移的指令地址是由指令码字节直接给出。3412+78560代码段操作码操作码1234┇┇7856CS7B972段间直接转移代码┇3412IP目标指令代码5678图3-14段间直接寻址过程(4)段间间接寻址方式转移的指令地址由一个双字存储单元的内容给出。图3-15段间间接寻址方式过程代码段操作码操作码数据寻址方式┇┇段间间接转移指令代码┇目标指令代码DSCSIPΣΣ数据段┇12345678┇根据数据寻址方式计算EA3.48086指令系统指令系统按功能可分为6类:①数据传送类指令;②算术运算类指令;③逻辑运算与移位类指令;④字符串指令;⑤控制转移类指令;⑥处理器控制类指令。3.4.1数据传送类指令分为4种:①通用数据传送指令②累加器专用传送指令③地址传送指令④标志传送指令。1.通用数据传送指令(1)最基本的传送指令格式:MOV目的操作数,源操作数举例:①MOVBL,AL②MOVDS,AX③MOVDL,[DI]④MOV[BX],AX⑤MOVDX,[1000]⑥MOVBH,120⑦MOVDX,1234H(2)堆栈操作指令堆栈是一种数据结构,是在内存中开辟了一个比较特殊的存储区,这个区域中数据的存取采用“后进先出”的原则。1000SS0018SP┇605040302010┇100181001A栈顶栈底1000SS0016SP┇605040302010┇ABCD100181001A栈顶栈底1000SS001ASP┇40302010┇1001A栈顶栈底10016图3.168086系统椎栈及其操作(a)堆栈原始状态(b)执行pushAX(c)执行POPAX(AX)=CDABHPOPBX后的状态(a)(b)(c)堆栈段——8086CPU在存储器分段管理时,划分了一个专门的堆栈区。格式:PUSH源操作数POP目的操作数举例:①PUSHBX②PUSHES③PUSHDS④PUSH[SI]⑤POPAX⑥POPBX⑦POSH[DI](3)交换指令实现两个操作数之间进行直接交换,方便程序的编写。格式:XCHG目的操作数,源操作数举例:①XCHGAH,BL②XCHGDX,BX③XCHG[505H],AX2.累加器专用传送指令累加器是8086CPU进行数据传输的核心。有两类指令:①输入/输出指令②换码指令(1)输入/输出指令——工业控制中常用的指令格式:INAC,源操作数OUT目的操作数,AC举例:①INAL,20H②OUTDX,AX(2)换码指令该指令用来将一个代码值转换成相应的另一种代码值,格式:XLAT代码段D779数据段┇40┇780300BX0703008030707ALXLAT指令代码┇+80000┇┇8000