注册 登录
编程论坛 汇编论坛

问一下大家,内存中的偏移地址是可变的,通过偏移地址的改变来确定内存中这个段要访问什么地址,我这样理解对吗?

anann 发布于 2015-06-15 13:13, 5408 次点击
问一下大家,内存中的偏移地址是可变的,通过偏移地址的改变来确定内存中这个段要访问什么地址,我这样理解对吗?
8 回复
#2
取名字2015-06-15 20:37
只读内存ROM和随机内存RAM构成了内存空间,包含多个存储单元,每个存储单元都有一个唯一的编号,这就是存储单元的地址,可以看出,内存空间中并不存在偏移地址一说。
在程序中,为了数据的分类存放,程序的模块化,同时也因为16位汇编下寻址范围的限制,人为地将内存空间划分出段,如数据段,堆栈段,代码段等,编译时编译器会给段中的每条指令计算出一个地址,这个地址是相对段起始地址的一个偏移量,所以也叫偏移地址。
16位汇编下利用“段地址*16+偏移地址”定位要访问的存储单元。
#3
hu9jj2015-06-16 06:49
偏移地址实际上是寻址操作中的概念,基址加偏移地址,得到最终的内存地址。
#4
anann2015-06-16 14:13
回复 2楼 取名字
那么这个偏移地址是和物理地址是由CPU给出什么地址来确定另一个地址的呢?
#5
取名字2015-06-16 14:22
#6
anann2015-06-16 14:48
以下是引用取名字在2015-6-15 20:37:42的发言:

只读内存ROM和随机内存RAM构成了内存空间,包含多个存储单元,每个存储单元都有一个唯一的编号,这就是存储单元的地址,可以看出,内存空间中并不存在偏移地址一说。
在程序中,为了数据的分类存放,程序的模块化,同时也因为16位汇编下寻址范围的限制,人为地将内存空间划分出段,如数据段,堆栈段,代码段等,编译时编译器会给段中的每条指令计算出一个地址,这个地址是相对段起始地址的一个偏移量,所以也叫偏移地址。
16位汇编下利用“段地址*16+偏移地址”定位要访问的存储单元。

这个指令的地址是怎么计算出来的呢?是已知什么偏移地址来计算出物理地址吗,还有,具体是怎么计算出偏移地址的呢
#7
取名字2015-06-16 15:28
偏移地址是编译器根据指令的长度计算出来的,如某段中第一条指令的偏移地址为0,这条指令的长度如果为3字节,则下一条指令的偏移地址为0+3(3)。
知道段地址和偏移地址之后,根据“段地址*16+偏移地址”计算出要访问的存储单元地址。如:
某段的段地址为0x164f,其中某条指令的偏移地址为0x0006,则该条指令的物理地址为:(0x164f)*(0x10)+(0x0006)=0x164f0+0x0006=0x164f6。其中0x10就是16。
#8
取名字2015-06-16 19:27
段地址*16+偏移地址本身合成的就是20位的地址。
至于32位系统,在实模式下,寻址方式与上面相同。保护模式下寻址范围可以达到2的32次方,即4G。
32位系统下,除段寄存器外,其他寄存器都是32位,也就是说利用一个寄存器就可以寻址到4G,所以不用上面的方法寻址。
1