1第3章8086/8088指令系统movax,12hcalldisplayJmp1234h2主要内容:指令系统的一般概念对操作数的寻址方式六大类指令的操作原理操作码的含义指令对操作数的要求指令执行的结果33.1概述指令——控制计算机完成指定操作的命令机器指令——指令的二进制代码形式。例如:CD21H汇编指令——助记符形式的指令。例如:INT21H指令系统——CPU所有指令及其使用规则的集合8088/8086指令系统:(1)指令向后兼容(x86系列)(2)应用广泛,资料易于寻找4指令按功能分为六大类(92种)(1)数据传送类;(2)算术运算类;(3)逻辑运算和移位;(4)串操作;(5)控制转移类;(6)处理器控制。参见表3-18086/8088CPU常用指令一览表P9553.1.1指令的基本构成说明要执行的是什么操作操作对象,可以有0个、1个或2个目的源6指令举例:ADDAX,[SI+6]MOVAX,BX操作码操作数INC[BX]HLT7部分8088/8086常用指令指令类型助记符数据传送数据传送MOV,PUSH/POP,XCHG等地址传送LEA,LDS,LES输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV逻辑AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET88088/8086的操作数分为4类1、立即数(常数)源操作数就是参加操作的数据本身,它们可以是8位或16位。取值范围如下表:8位16位无符号数00H-FFH(0-255)0000H-FFFFH(0-65535)带符号数80H-7FH(-128~127)8000H-7FFFH(-32768~32767)MOVAX,0FA00H;正确MOV8000H,DX;错误操作数数据(立即数)地址:寄存器(名称)、存储器单元(地址)I/O接口的端口(地址)92、寄存器操作数放在8个通用寄存器或4个段寄存器中的操作数16位AXAHAL16位BXBHBL16位CXCHCL16位DXDHDL表示参加运算的数存放在指令给出的寄存器中,可以是16位或8位。10只能存放字操作数段寄存器存放当前操作数的段基地址可作为源或目的操作数(但CS不作为目的操作数),不允许将立即数传送到段寄存器,可通过某个通用寄存器传递改变SIDIBPSPCSDSESSS113、存储器操作数存储器操作数字节字双字124类型存储单元个数一般不允许两个操作数同时为存储器操作数Flags标志寄存器:仅有个别指令可用它作为操作数IP不能用指令指针寄存器:它作为操作数,顺序执行时它自动加1,跳转执行时自动会跳转表示当前参加运算的数存放在存储器的某1/2/4个单元中12存储单元的物理地址=段基地址×16+偏移地址若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。表3.3段寄存器使用的一些基本约定P968086规定了访问存储器段的规则:–此规则定义了段地址寄存器和偏移地址寄存器的组合方式,其默认规则如下表:默认段地址偏移地址用于访问CSIP指令SSSP、BP(可超越)堆栈中的数据DS(可超越)BX、DI、SI、8位或16位数数据段中的数据ES串指令的DI目标串操作数13存储器操作数的偏移地址(也称有效地址EA)要用“[EA]”方括号括起来,它可以通过不同的寻址方式由指令给出;存储器操作数的段基地址(也称段头地址)一般省去,按隐含规则确定它们,也可直接给出进行段超越。例如若(BX)=2000H,(SI)=0A00H,(DI)=2A00H,则以下指令的结果是一样的:MOVAL,[2A00H];隐含段头为DS,直接寻址MOVAL,[BX+0A00H];隐含段头为DS,寄存器相对寻址MOVAL,[BX][SI];隐含段头为DS,基址-变址寻址MOVAL,[DI];隐含段头为DS,寄存器间接寻址但MOVAL,ES:[2A00H];段超越,段头为ES,与前4条不同存储单元的物理地址=段基地址×16+偏移地址注意:存储器数据表示形式:[]地址值或寄存器144、I/O接口操作数I/O接口操作数字节字12类型存储单元个数一般不允许两个操作数同时为I/O接口操作数I/O接口地址为16位,一般采用DX寄存器间接寻址给出;有时I/O接口地址仅用8位,这时可采用直接寻址。例如:INAL,[DX];括号习惯都省去写为INAL,DXOUT[80H],AL;括号习惯都省去写为OUT80H,AL注意:不要理解为:MOVAL,DX和MOV80H,AL,它们完全不同。表示当前参加运算的数存放在I/O接口的某1/2个端口中15一条指令的执行时间=∑3.1.2指令的执行时间取指令取操作数执行指令传送结果单位用时钟周期数T表示表3.4常用指令执行时间表3.5计算偏移地址EA所需时间结论:1)尽量使用寄存器作为操作数2)若有可能,用移位代替乘除法3)尽量使用简单的寻址方式执行16寻址方式——寻找操作数的方法寻找操作数的地址(一般指源操作数)寻找要执行的下一条指令的地址在8086指令系统中,操作数所在地址的寻址方式可分为8种:①立即寻址⑤寄存器相对寻址②直接寻址⑥基址-变址寻址③寄存器寻址⑦相对的基址-变址寻址④寄存器间接寻址⑧隐含寻址3.28086的寻址方式17操作数(为一常数)直接由指令给出(此操作数称为立即数)立即寻址只能用于源操作数例:MOVAX,1C8FHMOVBYTEPTR[2A00H],8FH错误例:×MOV2A00H,AX;错误!3.1.2立即寻址18立即数操作码低8位高8位存储器MOV操作码02H31HAHAL代码段代码段立即寻址指令在存储器中的存放形式AX指令操作例:MOVAX,3102H;AX3102H执行后,(AH)=31H,(AL)=02H用途:直接给出操作数据,立即数存放在内存的代码段中193.2.3寄存器寻址操作数放在某个寄存器中源操作数与目的操作数字长要相同寄存器寻址与段地址无关例:MOVAX,BXMOV[3F00H],AXMOVCL,AL错误例:×MOVAX,BL;字长不同×MOVES:AX,DX;寄存器与段无关20AXSI2233H2233H指令操作例:MOVSI,AX;SI(AX)指令执行前:(AX)=2233H指令执行后:(AX)=2233H,(SI)=2233H用途:操作数存放在寄存器中,根据寄存器名称寻找寄存器里面的数据。213.2.2直接寻址指令中直接给出存储器操作数的16位偏移地址或I/O接口仅8位端口地址存储器偏移地址也称为有效地址(EA,EffectiveAddress)存储器默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀存储器偏移地址也可用符号地址来表示,如ADDR、VAR例:MOVAX,[2A00H];段头隐含为DSMOVDX,ES:[2A00H];段超越MOVSI,TABLE_PTR;段头隐含为DS还有:INAL,[90H];括号要省去OUT[85H],AL;括号要省去22例:MOVAX,[3102H];AL(3102H),AH(3103H)如果(DS)=2000H,(23102H)=CDH,(23103H)=ABH则操作数的物理地址为:20000H+3102H=23102H指令执行后:(AX)=ABCDHMOV操作码02H31HAHAL23102HCDHABH存储器代码段数据段..23103H用途:用于操作数存放在存储器单元中或I/O接口地址仅为8位的的端口中233.2.4寄存器间接寻址操作数的偏移地址(有效地址EA)放在寄存器中只有SI、DI、BX和BP可作间址寄存器例:MOVAX,[BX]MOVCL,CS:[DI]INAL,[DX];括号省去OUT[DX],AL;括号省去错误例:×MOVAX,[DX]×MOVCL,[AX]EA=(BX)(BP)(SI)(DI)24指令操作例:MOVAX,[SI]若(DS)=6000H,(SI)=1200H,(61200H)=44H,(61201H)=33H则指令执行后,(AX)=3344H。44H33H60001200DSSI600006120061200HAX存储器数据段+)120044H33H用途:操作数存放在存储器或I/O接口地址为16位的的寻址253.2.5寄存器相对寻址EA=间址寄存器的内容+8/16位的位移量寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)EA=(BX)(BP)(SI)(DI)+8位16位位移量26例:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BP+1000H];默认段寄存器为SS指令操作例:MOVAX,DATA[BX]若(DS)=6000H,(BX)=1000H,DATA=2A00H,(63A00H)=66H,(63A01H)=55H则物理地址=60000H+1000H+2A00H=63A00H指令执行后:(AX)=5566H(见下页图示)27操作码00偏移量低2A偏移量高DS60000BX1000+DATA2A0063A0063A00HAHALAX代码段数据段.........66H55HMOVAX,DATA[BX]用途:操作数存放在存储器地址指定的单元中283.2.6基址-变址寻址若操作数的偏移地址:由基址寄存器(BX或BP)给出——基址寻址方式由变址寄存器(SI或DI)给出——变址寻址方式由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。EA=(BX)(BP)+(SI)(DI)同一组内的寄存器不能同时出现。基址寄存器变址寄存器29例:MOVAX,[BX][SI]MOVAX,[BX+SI]MOVAX,DS:[BP][DI]错误例:×MOVAX,[BX][BP]×MOVAX,[DI][SI]用途:操作数存放在存储器地址指定的单元中3083000操作码DS80000BX2000+SI100083000HAHALAX代码段数据段.........YYXX指令操作例:MOVAX,[BX][SI]假定:(DS)=8000H,(BX)=2000H,SI=1000H则物理地址=80000H+2000H+1000H=83000H指令执行后:(AL)=[83000H](AH)=[83001H]313.2.7相对的基址-变址寻址在基址-变址寻址的基础上再加上一个相对位移量注意事项同基址-变址寻址EA=(BX)(BP)+(SI)(DI)+8位16位位移量例:MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]MOVAX,[BX]BASE[SI]MOVAX,[BX+SI]BASE基址变址用途:操作数存放在存储器地址指定的单元中32指令操作例:MOVAX,DATA[DI][BX]若(DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H则指令执行后(AH)=[83021H],(AL)=[83020H]8320083200HAHALAX+DATA0200操作码代码段数据段.........YYXXDS80000BX2000DI100033使用相对的基址-变址寻址方式可以很方便地访问二维数组。基址寄存器数组首地址变址寄存器数组元素行址位移量数组元素列址(偏移地址)二维数组例:内存图示(按行存储)(行位移地址)(行内元素下标)183252409A=343.2.8隐含寻址指令操作数是隐含的,在指令中未显式地指明。例:MULBL指令隐含了被乘数AL及乘积AX类似的指令还有:XLAT、DIV、CBW、MOVS等(AL)×(BL)→AX用途:操作数存放在寄存器或存储器地址指定的单元中35