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
- [游客] 说的不错,但是现在国人能有多少个学习这个的时候还能有开拓视野的想法。。。 04/08 09:13
- [scuzg] 0fch展开成二进制数: 11111100,其中最高位是符号位,所以: 7ch+4=80h=12 12/20 19:05
- [842460904] 理论是应该负数原码和补码数值之和等于128,可为什么。fc和它的补码-4相加,即252+(-4)=? 09/03 23:38
- [fpamc] 顶顶…… 05/25 09:49
- [scuzg] 20位,图中有说明。 12/29 15:45
- [scuzg] 表示8位二进制数的16进制数fdh,因高位是f,所以前面前缀0以区别于标识符,也就是说,当对应8位二 12/29 15:42
- [powerofthinking] 博主的文章不错,希望再多写几篇。 12/18 13:40
- [游客] 请问0fdh为什么不是0000 1111 1101 b ?如果最高位视为符号位,它就是一个带符号数, 12/17 23:08
- [游客] 请问scuzg老师,地址加法器是多少位的啊(物理连接结构)?寄存器是16位,地址线20位,地址加法器 12/17 23:02
- [游客] 地址译码逻辑是不是应该在CPU内部啊? 我也觉得文章有点问题,还有就是看了scuzg老师很多文章, 12/17 22:59
- [qqqun238564439] 厉害 04/10 10:57
- [suixin] 少了个你,呵呵 “看着你的回答真长见识” 12/01 09:31
- [suixin] 看着的回答真长见识 12/01 09:29
- [fangorc] 先弄个友情链接,老师这的好东西太多了,慢慢消化~ 08/07 22:03
- [zdpopup] 谢谢scuzg 的宝贵意见,我看了2次你的话 08/05 01:43
- [游客] 过来踩踩。哈哈!端他爸 08/03 11:28