1 / 219

第三章 80X86 的指令系统和寻址方式

第三章 80X86 的指令系统和寻址方式. 此章包含汇编语言的两个难点 1 、寻址方式 2 、 指令系统. 写在前面的知识. 1 、程序:使计算机完成一个任务的一组命令或指令序列。 2 、指令:使计算机执行某一特定操作的二进制编码。 3 、计算机的指令系统:计算机的指令的集合。 4 、计算机指令的组成 操作码字段和操作数字段部分。 操作码:计算机所要执行的操作。 操作数:指令执行过程中所需要的操作数。可以有多个。 5 、寻址方式 在指令中取得操作数地址所使用的方法。. 第一节 IBM PC 机的寻址方式.

sunila
Download Presentation

第三章 80X86 的指令系统和寻址方式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 80X86的指令系统和寻址方式 • 此章包含汇编语言的两个难点 • 1、寻址方式 • 2、指令系统

  2. 写在前面的知识 1、程序:使计算机完成一个任务的一组命令或指令序列。 2、指令:使计算机执行某一特定操作的二进制编码。 3、计算机的指令系统:计算机的指令的集合。 4、计算机指令的组成 操作码字段和操作数字段部分。 操作码:计算机所要执行的操作。 操作数:指令执行过程中所需要的操作数。可以有多个。 5、寻址方式 在指令中取得操作数地址所使用的方法。

  3. 第一节 IBM PC机的寻址方式 • 与数据有关的寻址方式 • 与转移有关的寻址方式

  4. 与数据有关的寻址方式 • 立即寻址方式 • 寄存器寻址方式 • 直接寻址方式 • 寄存器间接寻址方式 • 寄存器相对寻址方式 • 基址变址寻址方式 • 相对基址变址寻址方式 • 比例变址寻址方式 • 基址比例变址寻址方式 • 相对基址比例变址寻址方式

  5. 立即寻址方式 立即数:操作数直接存放在指令中,紧跟在操作码之后,它作为 指令的一部分存放在代码段里。在指令译码执行时,可以立即得到 可以是8位或16位或32位的。 16/32位的存放规则:高字节存放在高地址,低字节存放在低地址。 例子2:mov ax,3064h 执行前(ax) = ???? 执行后(ax) = 3064H 例子1:mov al,5 执行前(al) = ?? 执行后(al) = 5

  6. 存储器 AX OP 指令 指令 64 30 操作数 代码段 立即寻址示意图 OP表示该指令的操作码部分,3064则为立即数,它是指令的 一个组成部分。 思考:AX寄存器的各个位的信息是什么?

  7. 寄存器寻址方式 指令 寄存器 寄存器 操作数 操作数在寄存器中,在指令直接指定寄存器。 对于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

  8. 寄存器寻址示意图 AH 寄存器(源操作数 ) BL 寄存器(目的操作数) BL 例子:MOV BL,AH AH = 00101100B

  9. 除立即寻址和寄存器寻址方式外,其余的 在存储器中。 有效地址(EA):操作数的偏移地址。 有效地址(EA)的成分: 位移量:存放在指令中的一个8/16/32位的数,但它不是一个立即数,而是一个位移量。 基址:存放在基址寄存器的内容 变址:存放在变址址寄存器中的内容 比例因子:386及其后继机型新增加的术语。其值可为1,2,4,或8,可用变址寄存器的内容乘以比例因子来取得变址值。

  10. 16/32位寻址时有效地址4种成分的组成

  11. 直接寻址方式 直接寻址方式中,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]

  12. 直接寻址图示 RAM 代码段 30000H 32000H 数据段 (DS)=3000H 3000:0000

  13. 直接寻址的使用及限制 使用:适用于处理内存中的单个变量。 限制:两个操作数中必须有一个是寄存器。 例如:MOV AX,VALUE MOV TABLE,VALE MOV BX,[0200H]

  14. 寄存器间接寻址 操作数的有效地址存在于基址或变址寄存器中。 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 = ?

  15. 寄存器间接寻址图示 20000H AX 21000H DX 40000H 42000H

  16. 寄存器相对寻址 又名:直接变址寻址。 操作数的有效地址:一个基址或变址寄存器的内容和指令中指定的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 = ?

  17. 寄存器相对寻址图示 操作码 代码段 位移量 30000H AX 33000H 35000H

  18. 基址变址寻址 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。两个寄存器均由指令指定。 基址寄存器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 = ?

  19. 相对基址变址寻址 操作数的有效地址是:一个基址寄存器和一个变址寄存器的内容和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的值。

  20. 比例变址寻址方式 EA=(变址寄存器)×比例因子+位移量 例:MOV EAX,COUNT[ESI*4]

  21. 基址比例变址寻址 EA=(变址寄存器)×比例因子+(基址寄存器) 例:MOV EAX,ES:[EBX*2+ESI]

  22. 相对基址比例变址寻址方式 EA=(变址寄存器)×比例因子+(基址寄存器)+位移量 例:MOV EAX,TABLE[EBP][EDI*4]

  23. 注意:实模式时,段的最大长度为64K,所以必须保证CPU最终算出的有效地址不超过FFFFH,而且操作数最高字节单元的有效地址也不能超过FFFFH,否则执行寻址时系统将要瘫痪。注意:实模式时,段的最大长度为64K,所以必须保证CPU最终算出的有效地址不超过FFFFH,而且操作数最高字节单元的有效地址也不能超过FFFFH,否则执行寻址时系统将要瘫痪。 例1:MOV EBX,10000H MOV AL,[EBX] 例2:MOV SI,0FFFFH MOV AX,[SI]

  24. 与转移地址有关的寻址 • 段内直接转移 • 段内间接转移 • 段间直接转移 • 段间间接转移 用于确定转移指令及CALL指令的转移地址。

  25. 段内直接寻址 转向的有效地址是当前的IP寄存器的内容和指令中指定的8位或16位位移量的和。 指令 位移量 EA IP寄存器 指令中的位移量=转向的有效地址 – IP寄存器的值 使用范围:无条件转移和条件转移。 条件转移:8位的位移量。 无条件转移:8位或16位位移量。

  26. 段内 直接转移的例子 指令的汇编语言的格式: JMP NEAR PTR PROGIA (16位位移量) JMP SHORT QUEST(8位位移量) 近转移 短转移 80386以上机型(D=8/32位)

  27. 段内间接寻址 转向的有效地址是一个寄存器或一个存储器的内容。 这个寄存器或存储器的内容可以是数据寻址方式中除立即数 之外的任何一种寻址方式取得的。取得的有效地址代替IP。 不能用于条件转移方式。 寄存器 转向的有效地址 指令 数据寻址方式 根据数据寻址方式计算EA 或 转向的有效地址 存储单元

  28. 段内间接寻址的例子1 汇编语言格式:JMP BX JMP WORD PTR [BP+TABLE] 操作符:指定段内转移 转移的物理地址=10H*(CS) + EA 例子1:JMP BX 例子2:JMP TABLE [BX] 例子3:JMP [BX][SI]

  29. 段内间接寻址的例子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以上机型)

  30. 段间直接寻址 指令中直接提供了转向的段地址和偏移地址。 用指定的段地址取代CS的内容。 用指定的偏移地址取代IP的内容。 汇编语言格式:JMP FAR PTR NEXTROUTINT 指令 IP寄存器 偏移地址 段地址 指定段间转移 CS寄存器

  31. 段间间接寻址 用存储器的两个相继的字的内容来取代CS 和IP寄存器的内容。可以使用数据寻址中除立即数和寄存器以外的寻址方式。 格式:JMP DWORD PTR [INTERS + BX] IP 转向的偏移地址 转向的段地址 指令 计算EA CS 数据寻址方式 存储器中的两个相继的字

  32. 习 题 • 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)= ;

  33. 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]

  34. 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寄存器中。

  35. 80x86机器语言指令概况 指令长度:由指令操作码长度,操作数地址长度,操作数地址个数决定。 指令字长越多,所能表示的操作信息和地址信息也就越多,指令功能就越丰富,但位数多则指令所占存储空间就多,读取指令时间就增加。 指令字长越少,指令所占存储空间就越少,执行速度就越快。 80X86中采用变字长指令——即有的指令字长与机器基本字长相等,有的指令则是机器基本字长的整数倍。

  36. 8086机器指令格式

  37. 8086代码指令的通用格式 第三 字节 第四 字节 第五 字节 第六 字节 第二字节 第一字节 7 6 5 4 3 2 1 0 7 6 5 4 3210

  38. 第一字节在;操作码字节 OPCODE(2~7位):操作码 D(1位):操作数传输方向 D=0:REG中寄存器为源操作数 D=1:REG中寄存器为目的操作数 W(0位):操作数是字节还是字 W=0:字节 W=1:字 第二字节:寻址方式字节 MOD(7~6位):区分操作数是在寄存器中还是在存储器中。

  39. MOD域及说明

  40. REG(5~3位):指出指令中所有寄存器操作数的寄存器名。REG域及说明REG(5~3位):指出指令中所有寄存器操作数的寄存器名。REG域及说明

  41. 若指令字段中有缺少项,缺少项由后面的项向前顶替,以减少指令的长度。若指令字段中有缺少项,缺少项由后面的项向前顶替,以减少指令的长度。

  42. 例:写出以下指令的机器语言编码。(括号内为操作码)例:写出以下指令的机器语言编码。(括号内为操作码) (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)

  43. 指令的执行时间 一条指令的执行时间=取指令的时间+取操作数的时间+执行指令的时间+传送结果的时间 由于指令是存储在存储器中的,因此运算器要执行指令就需要先访问存储器,把指令取到控制器中进行分析。8086采用预取指令技术,故取指令的时间与其它阶段的时间是重叠的,可以不予考虑。 一条指令的执行时间=取操作数的时间+执行指令的时间+传送结果的时间

  44. 指令的基本执行时间举例

  45. 加法指令的执行时间

  46. 计算有效地址EA所需时间

  47. 例:假设时钟频率为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

  48. 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字段分别指定变址寄存器和基址寄存器。

More Related