汇编语言寻址方式及堆栈.ppt
8086汇编语言程序设计,1,寻址方式的概念和基本分类;7 种寻址方式及“两对”寻址方式的区别;寻址方式与常量、变量和指针的关系;堆栈概念、结构元素和操作指令。,本章要点,8086汇编语言程序设计,2,CPU 访问内存的两个目的:读取指令;存取数据。CPU 访问内存的三种方式:控制器自动取指循环;程序控制方式访问数据段;堆栈方式。,第三章 寻址方式及堆栈,8086汇编语言程序设计,3,一条汇编指令语句包含操作码和操作数两种信息,有些像自然文字的谓语和宾语:操作码字段为指令,描述语句的功能;操作数字段描述操作数或操作数的来源和去向;CPU 获得操作数的方式叫作寻址方式。,3.1 寻址方式,8086汇编语言程序设计,4,三类寻址方式的特点:寄存器寻址:存取数据在 CPU 内部进行,故速度最快;寄存器数量很少,寻址方式简单;存储器寻址:为便于组织串、数组等数据结构复杂的数据处理,必须有更灵活、也就相对复杂的寻址方式,是本节的重点;I/O端口寻址:I/O端口的任务是实现计算机核心和外界的数据交换,故寻址方式也相对简单。,8086汇编语言程序设计,5,3.1.1 寄存器寻址 当需要处理寄存器中的数据或将处理结果存入寄存器的时,使用“寄存器寻址”;在汇编语言中直接以寄存器名对寄存器寻址:MOV DS,AX 意即将 AX 的内容送入数据段寄存器 DS。,8086汇编语言程序设计,6,8086汇编语言程序设计,7,3.1.2 立即数寻址 先看一例子:MOVAX,201H 这条指令将 16 进制数 201 送入寄存器 AX。存放结果的 AX 的寻址方式是“寄存器寻址”,而后面的 201H 是一个常数,它是随指令从代码段来的。由于这类操作数就在指令中,“立即”可以参与运算,故称作“立即数寻址方式”。因立即数伴随指令在代码段中,所以这种寻址也应属存储器寻址。,8086汇编语言程序设计,8,8086汇编语言程序设计,9,存储器寻址 存储器寻址必然涉及段,即最终要以逻辑地址 段基址:偏移量 形成物理地址。由于在大多数使用场合地址指针的段基址是“现成的”和隐含的,所以本小节讨论的重点是“有效地址”偏移量的问题。偏移量是某存储单元和段基址间的距离,又被称作有效地址。,8086汇编语言程序设计,10,偏移量或有效地址的形成:偏移量位移量基地址变址量 上述三个分量的不同组合,演绎出存储器寻址的各种方式。直接寻址 是在指令中直接给出操作数地址偏移量的寻址方式。比如把 200H 单元的内容送入AL:MOV AL,200H,8086汇编语言程序设计,11,8086汇编语言程序设计,12,注意直接寻址和立即数寻址方式区别:方括号里的数字是操作数的有效地址,200H表示该单元的内容。显然,直接寻址方式是非常直观的存储器寻址方式,但不方便处理整块的数据。寄存器间接寻址 寄存器的内容是某存储单元的有效地址,以这种方式寻址就叫作寄存器间接寻址。,8086汇编语言程序设计,13,如要将 200H 单元的内容送入 AL,使用寄存器间接寻址需要这样:MOVBX,200H MOVAL,BX 所谓“间接”就是操作数的取得是通过寄存器间接获得的。应注意寄存器间接寻址方式和寄存器寻址相区别:后者在意的目标的是寄存器的内容,而前者是寄存器的内容作为偏移量的存储单元的内容。,8086汇编语言程序设计,14,8086汇编语言程序设计,15,两者的书写形式也不同,寄存器间接寻址时将用作间接寻址的寄存器用方括号括起来。能用作存储器间接寻址的有下述地址指针寄存器:BX,SI,DI,BP 显然,连续将上述寄存器的内容增一或减一,可方面地处理数据块,如处理一维数据或字符串,高精度数字运算等。可参与存储器寻址的寄存器又被成为“地址指针寄存器”,具备“准指针”的功能。,8086汇编语言程序设计,16,变址寻址和基址寻址(寄存器相对寻址)某地址指针寄存器的内容和指令中给出的位移量之和形成有效地址的寻址方式。它是直接寻址方式和寄存器间接寻址方式的一种组合,请看例子:MOV AL,BX+20HADD AL,10SI指令中10SI和SI+10是等价的。,8086汇编语言程序设计,17,8086汇编语言程序设计,18,和寄存器间接寻址方式相比,地址指针寄存器的内容可以从开始,这样地址指针寄存器可以兼作计数器。至于“变址寻址”和“基址寻址”的差异只涉及使用地址指针寄存器的不同,在编程应用上没有区别,故这两种寻址方式又统称为“寄存器相对寻址”。,8086汇编语言程序设计,19,相对基址变址寻址 有效地址是基址寄存器的内容、变址寄存器的内容和指令中给出的位移量之和,如:MOV AL,20HBXSIMOV AH,80BSDIMOV DX,100HBXDI 20HBXSI 也可以写成 20H+BX+SI。这种寻址方式能比较方便地处理二维数组等更复杂的结构数据。,8086汇编语言程序设计,20,8086汇编语言程序设计,21,由于基于 BP 的基址变址寻址的隐含段寄存器是堆栈段 SS,所以在数据段的这种寻址方式常是 BX分别和 SI 和 DI 配合。可以认为相对基址变址寻址方式是最一般的寻址方式,其他寻址方式都可以看作是基址变址寻址方式的特例。比如:MOV AL,100H+BX+SI 去掉其中任一个或二个分量就会是某种其他寻址方式。,8086汇编语言程序设计,22,寻址方式与常量、变量及“准指针”立即数寻址方式对应汇编语言的常量;存储器寻址方式对应汇编语言的变量;在各种地址指针寄存器参与的存储器寻址方式中,地址指针寄存器充当“准指针”的角色。串操作寻址和 I/O 寻址以后介绍。,8086汇编语言程序设计,23,物理地址、段、逻辑地址和寻址方式小结:物理地址是地址信号和译码逻辑对存储单元的唯一指定,本质上是组合逻辑电路的一种应用:,8086汇编语言程序设计,24,8088/8086寻址(或管理)1M的存储空间是通过段来实现的:段寄存器的内容存放和提供段基址的高 16 位,用于指定低四位为零的存储单元作为段的起点;16 位段内偏移量确定段内具体单元,段内管理64K 的存储空间;段寄存器的内容即段基址的高 16 位和段内偏移量合称为逻辑地址:段基址的高 16 位:段内偏移量,8086汇编语言程序设计,25,8088/8086 CPU 按代码段、数据段、堆栈段、附加段对内存进行分类管理:代码段:CS:IP;堆栈段:SS:SP;数据段:DS:位移量基址量变址量,8086汇编语言程序设计,26,寻址方式 寄存器寻址方式(访问 CPU 完成数据处理的接口,按“直呼其名”的方式进行);立即数寻址方式(伴随指令序列来自于代码段的常量);数据段寻址是三种偏移分量的组合:位移量基址量变址量,8086汇编语言程序设计,27,寻址方式与常量、变量及指针的关系:立即数寻址方式对应汇编语言的常量;存储器寻址方式对应汇编语言的变量;在各种地址指针寄存器参与的存储器寻址方式中,地址指针寄存器充当“准指针”的角色。,8086汇编语言程序设计,28,堆栈是由 CPU 控制的按“后进先出”顺序存取数据的存储结构,用于暂存子程序调用、中断断点的信息和数据。堆栈的用途在这里只作一点说明,只有在学习了子程序调用、中断断点的保护等才会知道为什么要使用堆栈这种特殊的存储结构。本节的重点是:堆栈的结构元素和操作指令。,3.2 堆栈,8086汇编语言程序设计,29,3.2.1 堆栈的构造,8086汇编语言程序设计,30,堆栈是在存储器中划出的一个部分;地址最高的字单元叫作“栈底(Bottom)”;入栈的数据从栈底开始逐个向地址低端存入;用堆栈指针 SP 指向最后入栈的数据,习惯上把 SP 所指的位置叫作“栈顶(Top)”;数据是按 SP 的指向出入堆栈,从而实现了“后进先出”的存取机制的。,8086汇编语言程序设计,31,3.2.2 8086 的堆栈 堆栈的组织,8086汇编语言程序设计,32,堆栈是由 SS 的内容为起点的一段存储区;SP 指向栈顶;以字为单位进行存取;当堆栈初始化或为空时,SP 的值是堆栈段的实际长度,SP 指向栈底之下的第二个字节;栈的最大空间是 64KB,栈的最大深度是 32K;入栈的字,低字节存放在 SP 所指的单元,高字节存放在 SP+1 所指的单元。,8086汇编语言程序设计,33,0H,堆栈初始化或空时栈顶“低于”栈底的情形,8086汇编语言程序设计,34,堆栈的操作 堆栈的操作都是通过 SP 在栈顶进行的;基本的操作有两个:压栈和出栈。压栈(数据入栈)PUSH SCR(SP)2 SP;SCR(SP).,8086汇编语言程序设计,35,出栈(习惯上又叫弹出)POP DEST(SP)SCR;(SP)+2 SP.问题:堆栈操作的寻址方式是什么?,8086汇编语言程序设计,36,本章小结:寻址方式是本节的重点。注意区分:立即数寻址和直接寻址;寄存器寻址和寄存器间接寻址。堆栈是按“后进先出”机制存取数据的有特殊功用的存储器组织;堆栈的结构完全是由 SS 和 SP 的初值决定的。,第五章 第 1、12 题,本章习题,汇编语言教程.chm,本章参考,