1.15k likes | 1.33k Views
微机原理. 第三章 80 X86 指令系统. 概述(1). 指令系统是一台计算机所能识别和执行的全部指令的集合。 指令一般包括两个部分: 操作码域 和 地址域 。 操作码域存放指令的操作码,即指明该指令应由计算机完成何种操作。 地址域确定操作数的值或地址、操作结果的地址,有的指令的地址域还指出下一条指令的地址。. 概述(2). 1、机器指令:计算机能识别的代码,机器指令是由二进制数组成的。 例如 ADD CL,BH 机器指令为0000001011001111 B PUSH AX 机器指令为01010000
E N D
微机原理 第三章 80X86指令系统
概述(1) • 指令系统是一台计算机所能识别和执行的全部指令的集合。 • 指令一般包括两个部分:操作码域和地址域。 • 操作码域存放指令的操作码,即指明该指令应由计算机完成何种操作。 • 地址域确定操作数的值或地址、操作结果的地址,有的指令的地址域还指出下一条指令的地址。
概述(2) 1、机器指令:计算机能识别的代码,机器指令是由二进制数组成的。 例如ADD CL,BH 机器指令为0000001011001111B PUSH AX 机器指令为01010000 2、汇编语言:汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的。 3、汇编程序:MASM.EXE将汇编语言源程序翻译成机器语言,即目标程序。
第一节 寻址方式 • 根据指令内容确定操作数地址的过程,称为寻址。 • 根据寻址方式计算所得到的地址叫做有效地址EA,也就是段内偏移地址。有效地址还需要与相应的段基地址组合才是20位的物理地址PA ,该工作由CPU完成。 • 寻址方式在两种方式下被涉及:操作数的寻址方式和指令的寻址方式。
一、程序存储器寻址 • CS和IP寄存器用来保存段地址和偏移量,指出处理器要执行的下一条指令地址。CALL和JMP指令能够以下列3种方式改变CS和IP的值。 • 1、相对寻址:提供一个8位或16位的立即数与IP寄存器的值相加,结果作为IP寄存器的新值。此时CS值不变,称为段内操作。 • 2、直接寻址:指令提供16位立即数做为CS或IP寄存器的新值。此时可能改变CS,所以称为段间操作。 • 3、间接寻址:指令提供一16位的存储器地址,由该存储器单元的值改变IP或CS的值。若只改变IP,则是段内操作;若改变IP和CS,则是段间操作。
二、数据存储器寻址 • 1、立即寻址 操作数直接放在指令中。不 需要访问存储器。 例3.1 MOV AL,34H MOV AX,1234H 需要注意在16位操作时,两个字节数据的高低位存储 位置。立即数只能是源操作数。
2、寄存器寻址 • 操作数就放在CPU的内部寄存器中,AX、BX、CX、DX、DI、SI、SP和BP,不需要访问存储器。 例3.2:INC CX MOV AX,BX 若执行前(AX)=30A6H, (BX)=69EDH,(CX)=40D9H 则执行后, (AX)=69EDH,BX内容 不变。(CX)=40DAH
3、存储器寻址 • 操作数放在存储器中,执行部件EU计算出存储器操作数的偏移量,即有效地址EA。这是一个无符号数,由总线接口部件BIU的地址加法器计算出物理地址,然后执行存取该操作数所需的总线周期。 • 有效地址有4种成分: (1)位移量 (2)基址 (3)变址 (4)比例因子(386以上机器有,8086为1) EA=基址+(变址×比例因子)+位移量
对8086,EA=基址+变址+位移量 (1)直接寻址 有效地址由指令直接给出,有效地址只包含位移量。 MOV AL,[1234H] 默认的段寄存器是DS,也可以在指令中使用段超越前缀来指定段寄存器。 例3.3:MOV AL,ES:[1234H] 有效地址EA=1234H,在指令中直接给 出。 物理地址PA=(ES)×10H+1234H
例3.5 MOV AX,[2000H] 若(DS)=3000H,则执行情况如图3.3。 直接寻址也可用符号地址。 例3.4:MOV AX,VALUE 这里,VALUE就是存放操作数单元的符号地址。 AX=3050H
该指令也可写为 MOV AX,[VALUE] (2)寄存器间接寻址和寄存器相对间接寻址 操作数的地址在对应的寄存器中称为寄存器间接寻址; 若还有位移量(disp)则称为寄存器相对间接寻址。 EA取自基址寄存器BX,BP或变址寄存器SI,DI 中的一个,操作数在有效地址对应的存储单元中。 即EA=(BX、BP、SI、DI之一)+disp 例3.7 MOV AX,[BX] 若(DS)=2000H,(BX)=1000H 则EA=(BX)=1000H 物理地址PA=20000H+1000H=21000H, 执行情况如图3.4。(AX)=(21000H)=50A0H
例3.5A:INC BYTE PTR[BX] 对应BX、SI、DI隐含的段寄存器是DS 对应BP隐含的段寄存器是SS EA=(BX) PA=(DS) ×10H+(BX) 若是寄存器相对间接寻址,则要加上位移量。 例3.6:INC BYTE PTR[BX+disp] EA=(BX)+disp PA=(DS)×10H+(BX)+disp
例3.9 MOV AX,COUNT[SI] 若COUNT=3000H,(DS)=3000H (SI)=2000H,则物理地址=35000H,指令执行如图3.5所示,指令执行后(AX)=1234H EA=3000H+2000H =5000H PA=30000H+5000H =35000H AX=1234H
(3)基址寻址和基址相对寻址 操作数的地址在基址寄存器BX,BP中称为基址寻址;若还有位移量,则称为基址相对寻址 位移量可以是8位或16位。 例3.7A:MOV AX,[BX+disp] 使用BX,默认段寄存器是DS,而BP则默认的段寄存器为SS。 EA=(BX)或(BP)+disp PA=(DS)或(SS) ×10H+ disp
例3.8:MOV AX,COUNT[BX] 若(DS)=3000H,(BX)=2000H COUNT=3000H,(35000H)=1234H 则EA=2000H+3000H=5000H PA=30000H+5000H=35000H 执行该指令后, (AX)=1234H
(4)变址寻址和变址相对寻址 操作数的地址在变址寄存器SI、DI中称为变址寻址;若还有位移量,则称为变址相对寻址。 EA=(SI)或(DI)+disp 例3.9A: MOV AH,[SI+disp] (5)基址变址寻址和基址变址相对寻址 EA=BX或BP中的基址地址+SI、DI中的变址地址+disp;实际上这种寻址为(3)、(4)两种寻址的组合。 例3.10A: MOV AX,[BP+DI] ;此时隐含的段寄存器为SS,若用BX,则隐含的段寄存器为DS EA=(BX或BP)+(SI或DI)+disp PA=(DS)×10H+(BX)+(SI或DI)+disp PA=(SS)×10H+(BP)+(SI或DI)+disp
例3.10 MOV AX,[BX][DI] 若(DS)=2100H,(BX)=0158H (DI)=10A5H 则EA=0158H+10A5H=11FDH PA=EA+21000H=221FDH 指令执行情况如图 3. 6所示。 指令执行后, (AX)=1234H
例3.11:MOV AX,[MASK+BX+SI] 若(DS)=3000H,(BX)=2000H (SI)=1000H,MASK=0250H (33250H)=34H,(33251H)=12H 则 EA= 2000H+1000H+0250H=3250H PA=30000H+ 2000H+1000H+ 0250H=33250H 指令执行如图3.7 所示。 执行该指令后 (AX)=1234H
4、I/O端口寻址 8086采用输入/输出端口与存储器独立编址的方式。访问I/O端口需要专门指令IN和OUT。 (1)直接寻址 在指令直接给出I/O端口地址,此地址应在0-255(0-FFH)之间 IN AL,20H;从端口地址20H读入一个字节 (2)间接寻址,寄存器只能用DX 由DX给出I/O端口地址,此方式适用端口地址为0-65535(0-FFFFH)之间的任意值。 OUT DX,AL
以下三种是386以上机器有的寻址方式: 5、比例变址寻址方式 有效地址是变址寄存器内容乘以指令中指定的比例因 子,再加上位移量之和。 例3.12 MOV EAX,COUNT[ESI*4] 6、基址比例变址寻址方式 操作数有效地址是变址寄存器内容乘以指令中指定的比例因子,再加上基址寄存器的内容之和 例3.13 MOV EAX, [EBX][EDI*4] MOV ECX, [EAX][EDX*8] 7、相对基址比例变址寻址方式 有效地址是4种成分之和。 例3.14 MOV EAX ,TABLE[EBP][EDI*4]
三、寻址方式的书写格式 • 1、在方括号内部允许有一个或两个寄存器的名字,如果一对方括号内部有基址寄存器和变址寄存器,使用“+”作为连接。 • 2、在方括号内部允许有位移量,使用+或—号作为连接符号。 • 3、在方括号外部允许有位移量,可以在左边或右边。 MOV AX,[BX+SI+6] MOV AX,[BX+SI]6 MOV AX,6[BX+SI] MOV AX,[BX][SI]6 MOV AX,[BX+6][SI]
8086数据存储器寻址方式小结: 1、立即寻址,操作数直接放在指令中。 2、寄存器寻址(8个通用寄存器) 3、直接寻址,有效地址由指令直接给出, 即有效地址只包含位移量。 4、寄存器间接寻址和寄存器相对间接寻址 (4个寄存器,BX、BP、SI、DI,位移量) 5、基址寻址和基址相对寻址(BX、BP,位移量) 6、变址寻址和变址相对寻址(SI、DI,位移量) 7、基址变址寻址和基址变址相对寻址 (BX、BP,SI、DI,位移量) 其中1、2两种不用访问存储器。
四、与转移指令有关的寻址方式 (1)段内直接寻址 不改变CS,在IP上加一个位移量,则 EA=(IP)+disp 例如: JMP NEAR PTR PROGIA ;段内近转移 JMP SHORT QUEST ;段内短转移 JMP 25H ;段内短转移 JMP 1025H ;段内近转移 其中PROGIA 和QUEST是转向的符号地址,在机器指令中,用位移量来表示。 (2)段内间接寻址 转向的有效地址是一个寄存器或一个存储单元的
内容。这个寄存器或存储单元的内容可用除立 即数寻址以外的任何一种寻址方式得到。转向 的有效地址用来取代IP。这时CS值不变。 例3.15:JMP BX;段内间接转移(IP)=(BX) JMP WORD PTR[BX+TABLE] 若(BX)=1256H,(DS)=2000H TABLE=20A1H,(232F7H)=3280H 则执行JMP BX后,(IP)=EA=1256H 执行JMP WORD PTR[BX+TABLE]后, EA=(BX)+disp=1256H+20A1H=32F7H (IP)=(PA)=(20000H+32F7H) =(232F7H)=3280H
3、段间直接寻址 指令中提供了转向的段地址和偏移地址,所以用段地址取 代CS,用偏移地址取代IP。 例3.16:JMP 3500H:080BH;段间直接转移 (CS)=3500H,(IP)=080BH 例3.17:JMP FAR PTR NEXT_PROG 其中NEXT_PROG是转向的符号地址;FAR PTR为段间转移 的操作符。 执行该指令后, NEXT_PROG所在段的段地址送CS, NEXT_PROG在该段内的偏移量送IP。 例3.18:C1 SEGMENT … JMP FAR PTR NEXT_PROG … C1 ENDS
C2 SEGMENT … NEXT_PROG : … … C2 ENDS 执行JMP FAR PTR NEXT_PROG 后,C2段的段地址送CS,在C2段内 NEXT_PROG的偏移量送IP。 4、段间间接寻址 用存储器中两个相继字的内容来取代IP和CS,达到段间转移 的目的。低地址中内容送IP,高地址中内容送CS。 例3.18:JMP DWORD PTR [INTERS+BX] 其中[INTERS+BX]说明寻址方式为基址相对寻址方式; DWORD PTR 是双字操作符。
例3.19:JMP DWORD PTR[BX+DI+ALPHA] 这是基址变址相对寻址。 EA=(BX)+(DI)+ALPHA PA=(DS)×10H+EA (IP)=(PA) ;低地址内容送IP (CS)=(PA+2);高地址内容送CS 转移的物理地址是: PA=(CS) ×10H+(IP) 段间间接转移,目标地址存放在PA开始的4个连续 单元中,其中低地址两个单元放IP内容,高地址两个 单元放CS内容。 与转移地址有关的寻址方式如图3.9所示。
第二节 指令编码格式 一、概述 机器指令:计算机能识别和执行的指令的 二进制代码。如:1011000001100010 汇编指令:用助记符表示机器指令的操作 码和操作数,例如上面指令的汇编指令是 MOV AL,62H
二、指令编码 1、编码格式 8086的机器指令长度为1-6字节。
2、指令前缀 • 前缀是一条指令,当它执行时,并不导致处理器产生一个立即的动作,而只是指示处理器改变其后面指令的执行。 • 前缀一字节长,一条指令可有多个前缀。 1)重复前缀:REPcond(重复条件)与串指令结合使用,说明重复执行次数。 2)锁定前缀:LOCK在多处理器时使用。
3、段超越前缀 所有访问内存的指令都有一个隐含的段寄存器 来计算物理地址,段超越前缀可以改变默认的段 寄存器。 例3.20:MOV AX,ES:[13AAH];将ES段的 13AAH和13ABH两个单元的内容装入到AX。 4、操作码 操作码用来指示该指令的操作,一般一字节。如 PUSH AX 01010 000 此外,还有5个标志位:D,W,S,V,Z,见表3-3
5、寻址方式编码 • 寻址方式字节中存放关于操作数类型和操作数寻址的信息。如前图分为3个域。 1)mod域:即方式域,决定如何解释r/m域和位移量域。见表3-4 2)reg域:寄存器域,指定一个寄存器操作数,也可作为额外的操作码位。见表3-5 3)r/m域:当mod=11时,本域指示一个寄存器操作数,当mod≠11时,本域指出存储器操作数的有效地址计算方法。见表3-6
6、位移量 指令编码中的位移量部分给出一个8位或16位的数用来进行有效地址计算。 16位位移量是低字节在前,高字节在后。 7、立即数 指令编码中的立即数部分给出一个8位或16位的立即数。 注意:16位数是低字节在前,高字节在后。
三、指令编码举例 例1:MOV [BX+DI-6],CL 机器码: 10001000, 01001001,11111010 =88H,49H,FAH 例2:ADD AX,BX 机器码:00 00 00 1 1 1100 00 11 操作码 D W 寻址 AX BX =03H,C3H
第三节 指令执行时间 一、概述 一条指令的完整执行包括取指令,计算操作数地址,取操作数,执行指令,存放操作结果等步骤,各步所需时间的总和就是指令执行时间。 二、有效地址计算 存取操作数前,需计算出有效地址EA,它需要的时钟周期根据寻址方式不同而不同。 参见表3-7。
三、指令执行时间计算 假定指令已预取在指令队列中,因而取指令时间不考虑。 指令执行时间=计算有效地址时间+基本执行时间+访问内存时间
第四节 8086汇编指令系统 8086汇编指令系统包括100多条指令,分为6大类: 数据传送指令 14 算术运算指令 20 逻辑运算和移位指令 13 串操作指令 13 转移指令 28 处理器控制指令 12
一、数据传送指令 共14条,分为4组
1 、通用传送指令(1) MOV 目的,源 • ① 源和目的操作数不能都是存储器操作数 • ② 目的操作数不能是立即数,也不能是CS寄存器 • ③ 不允许两个段寄存器之间传送数据 • ④ 立即数不能直接送段寄存器 • ⑤ 不影响标志位 功能: (源) (目的) 例1:MOV AX,10ACH;10ACH (AX)
MOV WORD PTR[BX+2000H],12ABH BX=1200H,CS=1800H,IP=0500H,DS=3000H
以下两条指令只有386以上机器有: MOVSX 目的,源 带符号扩展传送指令。 例2 MOVSX EAX,CL 例3 MOVSX EDX,[EDI] MOVZX 目的,源 带零扩展传送指令 例4 MOVZX DX, AL 例5 MOVZX EAX,DATA
(2) PUSH 源 ;压栈 (SP)-2 (SP),(源) ((SP+1),(SP)) (3) POP 目的 ;出栈 ((SP+1),(SP)) (目的),(SP+2) (SP) ① 以上2条指令只能对字操作 ② 不能POP CS 下面举例:
例6 PUSH BX CS=1000H,IP=0030H,SS=2000H, SP=0040H,BX=2340H
以下4条指令只有386以上机器有: (4) PUSHA/PUSHAD PUSHA ;16位通用寄存器依次进栈 执行操作:(SP)-16 (SP) PUSHAD ;32位通用寄存器依次进栈 执行后(ESP)-32 (ESP) (5) POPA/POPAD POPA ;16位通用寄存器依次出栈 执行后(SP)+16 (SP) POPAD ;32位通用寄存器依次出栈 执行后(ESP)+32 (ESP)
(6) XCHG 目的,源 该指令将源和目的的值互换 • ① 两个操作数必须有一个在寄存器中,可以是字节或字 • ②可以在寄存器之间或寄存器和存储器之间交换数据 • ③ 不允许使用段寄存器 例7:XCHG BX,[BP+SI] 若(BX)=6F30H,(BP)=0200H,(SI)=0046H (SS)=2F00H,(2F246H)=4154H 源操作数的物理地址=2F000H+0200H+0046H=2F246H 执行该指令后: (BX)=4154H,(2F246H)=6F30H
2、累加器专用传送指令(1) XLAT ;换码指令 把一种编码表示转换为另一种编码表示。XLAT指令在使用前 需将编码表的首地址装入BX,将表的一个索引值装入AL,索引 值为0-255。 例8:设(DS)=A000H A000:0010 30H (BX)=0010H 31H 表的起始地址为A0010H,表中放 数字0-9的ASCII码 MOV BX,0010H MOV AL,06H XLAT A000:0016 36H 执行该程序后,(AL)=36H
(2) IN 累加器,端口地址 (3) OUT 端口地址,累加器 • 以上指令的累加器可为AL或AX • 当端口地址在0-255之间时可用立 即寻址方式,否则需将端口地址先放入 DX中,然后使用间接寻址方式。 例9: IN AL,20H MOV DX,0AB4H;注意字母不能是开头 OUT DX,AL
3、地址传送指令(1) LEA 目的,源 • 用来把源操作数的偏移地址传送给目的操作数。LEA指令中目的操作数必须是16位的通用寄存器。 例10:LEA BX,[BX+DI+6] 指令执行前若(BX)=1000H,(DI)=0200H 则指令执行后,(BX)=1206H (2) LDS 目的,源 • 将源操作数指定的存储器中4个连续字节传送给目的操作数和DS。传送时低2字节装入目的操作数,高2字节装入DS。 (3) LES 目的,源 • 与LDS相似,只是高字节装入ES。
例11:LDS SI,[DI+100AH] 若CS=1000H,IP=0640H,DS=2000H,DI=2400H 执行完后: DS=2230H SI =0180H