1•本章重点–掌握几种常用的指令寻址方式–掌握指令系统中指令的应用第3章8086指令系统2本章内容·概述·3.1基本数据类型·3.2IA-32的指令格式•3.38086的寻址方式•3.38086指令系统•习题3概述指令——控制计算机完成指定操作的命令机器指令——指令的二进制代码形式。例如:CD21H汇编指令——助记符形式的指令。例如:MOVAX,21H指令系统——CPU所有指令及其使用规则的集合•8088/8086指令系统指令向后兼容(x86系列)4指令按功能分为六大类(92种)•(1)数据传送类;•(2)算术运算类;•(3)逻辑运算和移位;•(4)串操作;•(5)控制转移类;•(6)处理器控制。5部分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/IRET63.1基本数据类型•本节介绍IA-32结构定义的数据类型。•IA-32结构的基本数据类型是字节、字、双字、四字和双四字,如图3-1所示。•一个字节是8位,一个字是两个字节(16位),双字是4字节(32位),四字是8字节(64位),双四字是16字节(128位)。•四字是在Intel80486处理器中引入IA-32结构的,双四字是在具有SSE扩展的PentiumⅢ处理器中引入的。78低字节(位0至位7)占用内存中的最低地址,该地址也是此操作数的地址。图3-2基本数据类在内存中的字节顺序93.1.2数字数据类型103.1.3指针数据类型指针是内存单元的地址·near指针是段内的32位偏移量(也称为有效地址)。Near指针在平面存储模式中用于所有存储器引用;或在分段存储模式中用于同一段内的存储器引用。·far指针是一个48位的逻辑地址,包含16位段选择子和32位的偏移量。far指针用于在分段存储模式中的跨段存储引用。113.2IA-32的指令格式要执行的操作操作的对象0个、1个或2个12.指令的格式(参考附录2,P416)(1)单字节指令无操作数指令单操作数指令NOP—90HPUSHAX—50HPUSHDS—1EHAX—000DS—111001000001010REG000SEG110(2)双字节指令无操作数指令1101010000001010AAM(BCD码乘法效正)D40AH单操作数指令1111111011000000INCALFEC0H1111111WMOD000R/MW——字节/字操作;0——字节,1——字MOD——方式;11——寄存器方式,00、01、10——存储器方式R/M——寄存器/存储器;由方式确定。8086微处理器的是变长指令格式。根据功能的不同,通常分为:单、双、三、四、五与六字节指令。13(3)三字节指令1011WREG数据(低八位)数据(高八位)MOVAX,4A35H101110000011010101001010B8354A(4)四字节指令1100011WMOD000R/M数据(低八位)数据(高八位)11000111000001110011010101001010MOV[BX],4A35HC707354A100000SWMOD101R/M数据(八位)SUBBL,35H100000001110101100110101080EB35(5)五、六字节指令(参考附录2,P.417)W——字节/字操作;0——字节,1——字MOD——方式;11——寄存器方式,00、01、10——存储器方式R/M——寄存器/存储器;由方式确定。S——数为字节/字;0——字节,1——字100000SWMOD101R/M数据(八位)SUBBX,35H100000111110101100110101083EB3514•一条指令的执行时间:二.指令的执行时间(时钟周期数)取指令取操作数执行指令传送结果常用指令执行时间P418结论:1)尽量使用寄存器作为操作数2)若有可能,用移位代替乘除法3)尽量使用简单的寻址方式15操作数1.立即操作数2.寄存器操作数3.存储器操作数161.立即数操作数•具有固定数值的数,即常数。表3-28位16位无符号数00H-FFH(0-255)0000H-FFFFH(0-65535)带符号数80H-7FH(-128~127)8000H-7FFFH(-32768~32767)立即数只能用作源操作数,如:MOVAX,0FA00H;正确MOV8000H,DX;错误17•2.寄存器操作数•放在8个通用寄存器或4个段寄存器中的操作数•既可以作为源操作数,也可以用作目的操作数•通用寄存器可存放字节操作数(如AH),也可存放字操作数(AX)•SI,DI,BP及SP只能存放字操作数•段寄存器只能存放当前操作数的段基地址•不允许将立即数传送到段寄存器18•3.存储器操作数存储器操作数字节字双字124类型存储单元个数一般不允许两个操作数同时为存储器操作数寻找存储器操作数:所在段+偏移地址191.若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。2.表3-2段寄存器使用的一些基本约定(P49)段寄存器寻址方式20•——寻找操作数地址的方法寻找操作数的地址(一般指源操作数)寻找要执行的下一条指令的地址在8086指令系统中,寻址方式可分为8种:①立即寻址⑤寄存器相对寻址②直接寻址⑥基址-变址寻址③寄存器寻址⑦相对的基址-变址寻址④寄存器间接寻址⑧隐含寻址3.3.4I/O寻址3.38086的寻址方式21操作数直接由指令给出——立即数立即寻址只能用于源操作数例:MOVAX,1C8FHMOVBYTEPTR[2A00H],8FHMOV2A00H,AX;错误!一.立即寻址22立即数操作码低8位高8位代码段立即寻址指令在存储器中的存放形式存储器MOV操作码02H31HAHAL代码段AX例3-1MOVAX,3102H执行后,AH=31H,AL=02H23二.直接寻址指令中直接给出操作数的16位偏移地址偏移地址也称为有效地址(EA,EffectiveAddress)默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀偏移地址也可用符号地址来表示,如ADDR例:MOVAX,[2A00H]MOVDX,ES:[2A00H]MOVSI,TABLE_PTR24例3-2MOVAX,[3102H]AL(3102H),AH(3103H)如果DS=2000H,(23102H)=CDH,(23103H)=ABH则操作数的物理地址为:20000H+3102H=23102H指令执行后:AX=ABCDHMOV操作码02H31HAHAL23102HCDHABH存储器代码段数据段..25三.寄存器寻址操作数在寄存器中源操作数与目的操作数字长要相同寄存器寻址与段地址无关例:MOVAX,BXMOV[3F00H],AXMOVCL,AL×MOVAX,BL;×MOVES:AX,DX;字长不同寄存器与段无关26AXSI2233H2233H例3-4MOVSI,AX;SIAX指令执行前:AX=2233H指令执行后:AX=2233H,SI=2233H2233H27四.寄存器间接寻址操作数的偏移地址(EA)放在间址寄存器中只有SI、DI、BX和BP可作间址寄存器物理地址=DS左移四位+BX或SI或DI物理地址=SS左移四位+BP例:MOVAX,[BX]MOVCL,CS:[DI]×MOVAX,[DX]×MOVCL,[AX]EA=BXBPSIDI28例3-5MOVAX,[SI]•若DS=6000H,SI=1200H,(61200H)=44H,(61201H)=33H则指令执行后,AX=334444H33H60001200DSSI600006120061200HAX存储器数据段+)120044H33H29EA=间址寄存器的内容加上一个8/16位的位移量寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)EA=BXBPSIDI+8位16位位移量(相对值)五.寄存器相对寻址30•物理地址=DS左移四位+BX或SI或•DI+位移量•物理地址=SS左移四位+BP+位移量•例:MOVAX,[BX]XYZ•MOVAX,XYZ[BX]•MOVAX,[BX+XYZ]•MOVAX,[SI]40H•MOVAX,40H[SI]•MOVAX,[SI+40H]31例:MOVAX,[BX+8]•MOVCX,TABLE[SI]•MOVAX,[BP];默认段寄存器为SS例3-7MOVAX,DATA[BX]•若DS=6000H,BX=1000H,DATA=2A00H,•(63A00H)=66H,(63A01H)=55H•则物理地址=60000H+1000H+2A00H=63A00H指令执行后:AX=5566H32操作码00偏移量低2A偏移量高DS6000BX1000+DATA2A0063A0063A00HAHALAX代码段数据段.........66H55HMOVAX,DATA[BX]33六.基址-变址寻址若操作数的偏移地址:由基址寄存器(BX或BP)给出——基址寻址方式由变址寄存器(SI或DI)给出——变址寻址方式由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。EA=BXBP+SIDI同一组内的寄存器不能同时出现。34•若基址寄存器用BX,则段寄存器用DS•物理地址=DS左移四位+BX+SI或DI•若基址寄存器用BP,则段寄存器用SS•物理地址=SS左移四位+BP35•例:•MOVAX,[BX][SI]•MOVAX,[BX+SI]•MOVAX,DS:[BP][DI]•×MOVAX,[BX][BP]•×MOVAX,[DI][SI]36例3-9MOVAX,[BX][SI]假定:DS=8000H,BX=2000H,SI=1000H则物理地址=指令执行后:AL=AH=80000H+2000H+1000H=83000H[83000H][83001H]83000操作码DS8000BX2000+SI100083000HAHALAX代码段数据段.........YYXX37七.相对的基址-变址寻址在基址-变址寻址的基础上再加上一个相对位移量注意事项同基址-变址寻址EA=BXBP+SIDI+8位16位位移量例:MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]MOVAX,[BX]BASE[SI]MOVAX,[BX+SI]BASE38例3-10MOVAX,DATA[DI][BX]若DS=8000H,BX=2000H,DI=1000H,DATA=200H则指令执行后AH=[83201H],AL=[83200H]8320083200HAHALAX+DATA0200操作码代码段数据段.........YYXXDS8000BX2000DI100039使用相对的基址-变址寻址方式可以很方便地访问二维数组。基址寄存器数组首地址变址寄存器数组元素行址位移量数组元素列址(偏移地址)40八.隐含寻址指令中的操作数是隐含的例:MULBL指令隐含了被乘数AL及乘积AX类似的指令还有:DIV、CBW、MOVS等AL×BL→AX413.3.4.输入/输出寻址(I/O寻址)•输入输出端口操作数•直接寻址–指令中直接给出I/O端口地址的低八位,只能访问256个I/O端口(00H~FFH)INAL,2FH•间接寻址–用寄存器DX的内容来指定I/O端口地址–适用十六位地址,能访问64K个I/O端口(0000H~FFFFH)INA