汇编网首页登录博客注册
scuzg的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
友情链接

[2009-09-27 20:53] 存储器寻址小议(三):存储器寻址方式和常量、变量及“准指针”

CPU 获得操作数的方式叫作寻址方式。
    和计算机三个核心部件(CPU、存储器和I/O接口)相对应,寻址方式自然地分成了(CPU内部的)寄存器寻址、存储器寻址和I/O接口寻址。
    由于 CPU 的寄存器数量极少,所以寻址方式非常简单;而实现计算机内核和外设间数据交换的 I/O 接口的寻址也没有复杂的必要,所以这两类寻址方式是很容易学习和掌握的;为管理大容量内存,便于组织串、数组等结构复杂的数据处理,存储器必须具有更灵活、也就相对复杂的寻址方式。
    通过上一单元的讨论我们知道,8086/8088 CPU 的物理地址是由逻辑地址间接给出的。逻辑地址的段基址部分直接用通用寄存器向段寄存器传递即可;又由于段寄存器的功能仅限于存放段基址(的高16位),所以支持内存寻址复杂功能的只能是来自 CPU 内部总线的偏移量了,这是我们学习寻址方式的重点。
    CPU 访问存储器最常见的目的不外乎两个:取指令和存取数据。
    取指令是由 CPU 控制器的“自动取指/执行循环”掌控的,段基址和偏移量分别由 CS 和 IP 给出。显然 CS 指向的段的内容必须是指令码,所以 CS 称为“代码段寄存器”,它指向的段即为“代码段”;代码段的偏移量专门由 IP 给出。
    最常见和最主要的且程序可控的内存数据访问方式有两种:堆栈操作和数据段访问。
    堆栈是按“后进先出”机制存取数据的存储器组织。CPU 以堆栈方式访问内存时,段基址(的高16位)来自堆栈段寄存器 SS,偏移量由 SP 给出。
    以 DS 的内容作为段基址(高16位)的存储器访问最为多样、灵活,这类访问方式是从存储器中取出要处理的数据或将处理结果存放到存储器中去,所以 DS 被称为“数据段寄存器”,用 DS 定位的段就是数据段。
    数据段寻址方式的多样灵活可以从下面形成偏移量的表达式看出:

    偏移量 = 位移量 + 基址指针 + 变址指针

    等号右边各偏移量分量的不同组合,就衍生出不同的寻址方式。显然这是其他类型寻址方式不具备的(指偏移量是三个分量的组合)。
    直接给出偏移量的寻址方式称为“直接寻址方式”(早期和其他类型 CPU 的计算机没有段,在寻址方式中直接给出物理地址的寻址方式被称为直接寻址方式);以地址指针寄存器(BX、SI、DI、BP)的内容为偏移量的寻址方式为“寄存器间接寻址方式”。至于“相对寄存器寻址方式”和“相对基址变址寻址方式”可视为“增强”的寄存器间接寻址方式,其核心机理是一样的。
    数据段的各种寻址方式访问的是存储在读写存储器中的数据,由于读写存储器的内容是可以改变的,这就说明上述寻址方式一定和编程语言的变量相关联。以后我们会看到:直接寻址方式更抽象的诠释,就是对变量的访问;而寄存器间接寻址方式及各种“增强型”变种,不外乎是以“准指针”方式对“变量”进行访问的寻址方式。
    编程语言的常量和哪一种寻址方式对应呢?对,正是我们还没有提到的“立即数寻址方式”。我的博文《汇编语言的常量、变量及其与寻址方式的关系》从另一角度,对常量、变量与寻址方式的关系作了进一步的说明。
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=19481&kindId=34937&postId=39967&readSg=1
评论次数(1)  |  浏览次数(1166)  |  类型(汇编语言) |  收藏此文  | 

[  regex   发表于  2010-01-15 15:52  ]

学习~~~

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码