2.19k likes | 2.51k Views
第三章 80X86 的指令系统和寻址方式. 此章包含汇编语言的两个难点 1 、寻址方式 2 、 指令系统. 写在前面的知识. 1 、程序:使计算机完成一个任务的一组命令或指令序列。 2 、指令:使计算机执行某一特定操作的二进制编码。 3 、计算机的指令系统:计算机的指令的集合。 4 、计算机指令的组成 操作码字段和操作数字段部分。 操作码:计算机所要执行的操作。 操作数:指令执行过程中所需要的操作数。可以有多个。 5 、寻址方式 在指令中取得操作数地址所使用的方法。. 第一节 IBM PC 机的寻址方式.
E N D
第三章 80X86的指令系统和寻址方式 • 此章包含汇编语言的两个难点 • 1、寻址方式 • 2、指令系统
写在前面的知识 1、程序:使计算机完成一个任务的一组命令或指令序列。 2、指令:使计算机执行某一特定操作的二进制编码。 3、计算机的指令系统:计算机的指令的集合。 4、计算机指令的组成 操作码字段和操作数字段部分。 操作码:计算机所要执行的操作。 操作数:指令执行过程中所需要的操作数。可以有多个。 5、寻址方式 在指令中取得操作数地址所使用的方法。
第一节 IBM PC机的寻址方式 • 与数据有关的寻址方式 • 与转移有关的寻址方式
与数据有关的寻址方式 • 立即寻址方式 • 寄存器寻址方式 • 直接寻址方式 • 寄存器间接寻址方式 • 寄存器相对寻址方式 • 基址变址寻址方式 • 相对基址变址寻址方式 • 比例变址寻址方式 • 基址比例变址寻址方式 • 相对基址比例变址寻址方式
立即寻址方式 立即数:操作数直接存放在指令中,紧跟在操作码之后,它作为 指令的一部分存放在代码段里。在指令译码执行时,可以立即得到 可以是8位或16位或32位的。 16/32位的存放规则:高字节存放在高地址,低字节存放在低地址。 例子2:mov ax,3064h 执行前(ax) = ???? 执行后(ax) = 3064H 例子1:mov al,5 执行前(al) = ?? 执行后(al) = 5
存储器 AX OP 指令 指令 64 30 操作数 代码段 立即寻址示意图 OP表示该指令的操作码部分,3064则为立即数,它是指令的 一个组成部分。 思考:AX寄存器的各个位的信息是什么?
寄存器寻址方式 指令 寄存器 寄存器 操作数 操作数在寄存器中,在指令直接指定寄存器。 对于32位操作数,寄存器可以是EAX,EBX,ECX,EDX ESI,EDI,ESP,EBP等 对于16位操作数,寄存器可以是AX,BX,CX,DX SI,DI,SP,BP等。 对于8位操作数,寄存器可以是AL,AH,BL,BH,CL CH,DL,DH. 特点:运算速度快。 例子:MOV AX,BX 执行前(ax) = ? (bx) = 1234H 执行后(ax) = 1234H (bx) = 1234H
寄存器寻址示意图 AH 寄存器(源操作数 ) BL 寄存器(目的操作数) BL 例子:MOV BL,AH AH = 00101100B
除立即寻址和寄存器寻址方式外,其余的 在存储器中。 有效地址(EA):操作数的偏移地址。 有效地址(EA)的成分: 位移量:存放在指令中的一个8/16/32位的数,但它不是一个立即数,而是一个位移量。 基址:存放在基址寄存器的内容 变址:存放在变址址寄存器中的内容 比例因子:386及其后继机型新增加的术语。其值可为1,2,4,或8,可用变址寄存器的内容乘以比例因子来取得变址值。
直接寻址方式 直接寻址方式中,EA在指令中,存放在代码段中指令操作码 之后,操作数存放在数据段中。 如何取得数据段中的操作数?? 如何取得数据段以外的段中的操作数?? 取得物理地址:PA = (DS)* 10H + EA PA = (ES)*10H + EA PA = (SS)*10H + EA 例如:MOV AX,[2000H] 图示: 执行前(DS)=3000H (AX)=? 执行后(AX) = 3050H 符号地址代替数值地址。 MOV AX,VALUE 段跨越前缀的使用: MOV AX,ES:VALUE MOV AX,ES:[2000H]
直接寻址图示 RAM 代码段 30000H 32000H 数据段 (DS)=3000H 3000:0000
直接寻址的使用及限制 使用:适用于处理内存中的单个变量。 限制:两个操作数中必须有一个是寄存器。 例如:MOV AX,VALUE MOV TABLE,VALE MOV BX,[0200H]
寄存器间接寻址 操作数的有效地址存在于基址或变址寄存器中。 16位:BX,SI,DI或BP。其中:BX,SI,DI默认使用数据段,BP默认使用堆栈段。 32位:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP其中:ESP,EBP默认使用堆栈段。其余默认数据段 默认情况下: EA=(BX) PA=10H*(DS)+(BX) EA=(SI) PA=10H*(DS)+(SI) EA=(DI) PA=10H*(DS)+(DI) EA=(BP) PA=10H*(SS)+(BP) EA及PA的计算: 例子1(图示): MOV AX,[BX] 执行前(DS)=2000H,(BX)= 1000H EA = (BX)=1000H PA = 10H*(DS) +EA = 10H*2000H+1000H =21000H 例子2:MOV DX,ES:[BX] 执行前(DS)=2000H (ES)=4000H (BX)=2000H EA = ? PA = ?
寄存器间接寻址图示 20000H AX 21000H DX 40000H 42000H
寄存器相对寻址 又名:直接变址寻址。 操作数的有效地址:一个基址或变址寄存器的内容和指令中指定的8位或16位的位移量之和。EA = (BX)+D8或EA=(BX)+D16 PA=10H*(DS) + (BX) + D8 PA=10H*(DS)+(BX) + D16 例子:MOV AX,COUNT[BX] (MOV AX,[COUNT+BX]) COUNT为16位位移量的符号地址。如果(DS)=3000h (BX)=2000h COUNT = 3000H PA = 35000H 问题1:其他的寄存器的EA = ? PA = ? 问题2:使用段跨越前缀时,EA = ? PA = ?
寄存器相对寻址图示 操作码 代码段 位移量 30000H AX 33000H 35000H
基址变址寻址 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。两个寄存器均由指令指定。 基址寄存器BX对应数据段;基址寄存器BP对应堆栈段。 EA = (BX) +(SI) 或 EA = (BX) + (DI) EA = (BP) +(SI) 或 EA = (BP) + (DI) PA = 10H*(DS)+(BX) + (SI) 例子: MOV AX,[BX][SI] (MOV AX,[BX+SI]) (DS) = 2100H (BX) = 0158H (SI) = 10A5H EA = ? PA = ? 问题1:所有的组合的PA = ? 问题2:带段跨越前缀的PA = ?
相对基址变址寻址 操作数的有效地址是:一个基址寄存器和一个变址寄存器的内容和8位或16位偏移量的和。 EA = (BX)+(SI)+D8 或EA = (BX)+(SI) + D16 问题:其他的组合的EA = ? PA =? 例子:MOV AX,MASK[BX][DI] (MOV AX,[MASK+BX+DI]) (MOV AX,MASK[BX+DI]) 若(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H, (33250H)=34H,(33251H)=12H,求指令执行后,AX的值。
比例变址寻址方式 EA=(变址寄存器)×比例因子+位移量 例:MOV EAX,COUNT[ESI*4]
基址比例变址寻址 EA=(变址寄存器)×比例因子+(基址寄存器) 例:MOV EAX,ES:[EBX*2+ESI]
相对基址比例变址寻址方式 EA=(变址寄存器)×比例因子+(基址寄存器)+位移量 例:MOV EAX,TABLE[EBP][EDI*4]
注意:实模式时,段的最大长度为64K,所以必须保证CPU最终算出的有效地址不超过FFFFH,而且操作数最高字节单元的有效地址也不能超过FFFFH,否则执行寻址时系统将要瘫痪。注意:实模式时,段的最大长度为64K,所以必须保证CPU最终算出的有效地址不超过FFFFH,而且操作数最高字节单元的有效地址也不能超过FFFFH,否则执行寻址时系统将要瘫痪。 例1:MOV EBX,10000H MOV AL,[EBX] 例2:MOV SI,0FFFFH MOV AX,[SI]
与转移地址有关的寻址 • 段内直接转移 • 段内间接转移 • 段间直接转移 • 段间间接转移 用于确定转移指令及CALL指令的转移地址。
段内直接寻址 转向的有效地址是当前的IP寄存器的内容和指令中指定的8位或16位位移量的和。 指令 位移量 EA IP寄存器 指令中的位移量=转向的有效地址 – IP寄存器的值 使用范围:无条件转移和条件转移。 条件转移:8位的位移量。 无条件转移:8位或16位位移量。
段内 直接转移的例子 指令的汇编语言的格式: JMP NEAR PTR PROGIA (16位位移量) JMP SHORT QUEST(8位位移量) 近转移 短转移 80386以上机型(D=8/32位)
段内间接寻址 转向的有效地址是一个寄存器或一个存储器的内容。 这个寄存器或存储器的内容可以是数据寻址方式中除立即数 之外的任何一种寻址方式取得的。取得的有效地址代替IP。 不能用于条件转移方式。 寄存器 转向的有效地址 指令 数据寻址方式 根据数据寻址方式计算EA 或 转向的有效地址 存储单元
段内间接寻址的例子1 汇编语言格式:JMP BX JMP WORD PTR [BP+TABLE] 操作符:指定段内转移 转移的物理地址=10H*(CS) + EA 例子1:JMP BX 例子2:JMP TABLE [BX] 例子3:JMP [BX][SI]
段内间接寻址的例子2 已知(DS) = 2000H (BX) = 1256H (SI) = 528FH 位移量 = 20A1H (232F7H) = 3280H (264E5H) = 2450H JMP BX 执行后: IP = (BX) = 1256H JMP TABLE[BX] 执行后(IP) =(10H*(DS)+(BX)+TABLE) =(20000+1256+20A1) =(232F7) = 3280H JMP [BX][SI] 执行后:(IP) = (10H*(DS)+(BX)+(SI) =(20000+1256+528F) = (264E5) =2450H (80386以上机型)
段间直接寻址 指令中直接提供了转向的段地址和偏移地址。 用指定的段地址取代CS的内容。 用指定的偏移地址取代IP的内容。 汇编语言格式:JMP FAR PTR NEXTROUTINT 指令 IP寄存器 偏移地址 段地址 指定段间转移 CS寄存器
段间间接寻址 用存储器的两个相继的字的内容来取代CS 和IP寄存器的内容。可以使用数据寻址中除立即数和寄存器以外的寻址方式。 格式:JMP DWORD PTR [INTERS + BX] IP 转向的偏移地址 转向的段地址 指令 计算EA CS 数据寻址方式 存储器中的两个相继的字
习 题 • 1. 已知(CS ) = 1500H, (IP) = 0110H, 则8086执行指令的物理地址为 ,如果该指令是长度为2字节的加法指令,则在无中断产生的情况下,执行完该指令后IP = 。 • 2.设寄存器(ES)=1100H, (DS)=2100H ,(SS)=3200H, (BX)=5000H ,(BP)=6000H, (DI)=0001H,(FS)=7000H,存储单元(38001H)=5678H, (12000H)=1234H,(17001H)=4536H, • (26000H)=5678H, (41002H)=789AH 。则 • MOV AX, ES:[1000H] 执行后(AX)=; MOV AL,[BP+DI] 执行后(AX)= ; • MOV AL,ES:[BP+DI] 执行后(AX)= ;
3.(SS)=1000H,(ES)=2000H,(DS)=3000H, (12344H)=23H, (12345H)=22H,(12346H)=33H, (22344H)=89H,((22345H)=44H,(22346H)=55H, (32344H)=53H(32345H)=66H,(32346H)=77H,请说出下列指令源操作数的寻址方式,并写出执行完指令后,目的操作数的值。 MOV AX,3344H MOV AX,[2345H] MOV BX,2345H MOV BP,BX MOV AX,ES:[BX] MOV AX,[BP] MOV AX,[BX] DEC BX DEC BX MOV BP,BX MOV SI,2 MOV DI,1 MOV AX,[BX+SI] MOV AX,ES:[BX+2] MOV AX,[BX+2] MOV AL,[BX+SI-1] MOV AL,[BP+DI+2]
4、请指出以下指令的寻址方式? (1) JNC NEXT (2) JMP BX (3) JMP FAR PTR LOP1 (4) JMP WORD PTR ES:[2000H] (5) JMP DWORD PTR [BX+10H] (6) JMP NEAR PTR TOWHERE 5、请用5种以上方法将内存21000H单元的内容送到AL寄存器中。
80x86机器语言指令概况 指令长度:由指令操作码长度,操作数地址长度,操作数地址个数决定。 指令字长越多,所能表示的操作信息和地址信息也就越多,指令功能就越丰富,但位数多则指令所占存储空间就多,读取指令时间就增加。 指令字长越少,指令所占存储空间就越少,执行速度就越快。 80X86中采用变字长指令——即有的指令字长与机器基本字长相等,有的指令则是机器基本字长的整数倍。
8086代码指令的通用格式 第三 字节 第四 字节 第五 字节 第六 字节 第二字节 第一字节 7 6 5 4 3 2 1 0 7 6 5 4 3210
第一字节在;操作码字节 OPCODE(2~7位):操作码 D(1位):操作数传输方向 D=0:REG中寄存器为源操作数 D=1:REG中寄存器为目的操作数 W(0位):操作数是字节还是字 W=0:字节 W=1:字 第二字节:寻址方式字节 MOD(7~6位):区分操作数是在寄存器中还是在存储器中。
REG(5~3位):指出指令中所有寄存器操作数的寄存器名。REG域及说明REG(5~3位):指出指令中所有寄存器操作数的寄存器名。REG域及说明
若指令字段中有缺少项,缺少项由后面的项向前顶替,以减少指令的长度。若指令字段中有缺少项,缺少项由后面的项向前顶替,以减少指令的长度。
例:写出以下指令的机器语言编码。(括号内为操作码)例:写出以下指令的机器语言编码。(括号内为操作码) (1)MOV [BX+DI-6],CL(100010) (2) MOV AH,[BX+DI+50H](100010) (3) ADD AX,[BX+DI+0826H](000000) (4) MOV AX,1234H(1011) (5)ADD CL,BH(000000)
指令的执行时间 一条指令的执行时间=取指令的时间+取操作数的时间+执行指令的时间+传送结果的时间 由于指令是存储在存储器中的,因此运算器要执行指令就需要先访问存储器,把指令取到控制器中进行分析。8086采用预取指令技术,故取指令的时间与其它阶段的时间是重叠的,可以不予考虑。 一条指令的执行时间=取操作数的时间+执行指令的时间+传送结果的时间
例:假设时钟频率为5MHZ,则一个时钟周期即为0.2us.例:假设时钟频率为5MHZ,则一个时钟周期即为0.2us. 则寄存器-寄存器方式的ADD指令的执行时间为:3×0.2=0.6us 相对相对基址变址寻址方式-寄存器方式的ADD指令的执行时间为:(9+EA)×0.2=(9+12)×0.2=4.2us 如果在此种寻址方式下,求得存储器的有效地址为奇数,则根据8086的规定,需要多访问一次存储器,要增加4个时钟周期,则执行时间为: (9+EA+4)×0.2=(9+12+4)×0.2=5us 寄存器-相对基址变址方式的ADD指令的执行时间为:(16+EA)×0.2=(16+12)×0.2=5.6us 如果在此种寻址方式下,求得存储器的有效地址为奇数,需要多访问两次存储器,要增加8个时钟周期,则执行时间为: (16+EA+8)×0.2=(16+12+8)×0.2=7.2us
32位指令格式简介 0~1B 0~1B 1~2B 0~1B 0~1B 0~4B 0~4B 比例变址字节SIB 7 6 5 4 3 2 1 0 SS=00:比例因子为1; SS=01:比例因子为2; SS=10:比例因子为4; SS=11:比例因子为8; Index和Base字段分别指定变址寄存器和基址寄存器。