您的位置:首页 > 其它

【汇编学习(一)】8086CPU-段地址-偏移地址简要理解

2014-06-12 15:25 246 查看
这只是新手学习汇编的一个小笔记,帮助自己理解的,不建议观看!

最近刚开始学习汇编,看到了8086 CPU的寻址方式:物理地址=段地址*16+偏移地址,于是有了如下的一些问题:

一、为何8086 CPU会采用这种寻址方式?

因为8086 CPU是一个16位CPU,那么决定了它有如下几个特点:
1、运算器一次最多可以处理16位的数据;
2、寄存器的最大宽度为16位;
3、寄存器和运算器之间的同路为16位;
即是说,在8086的内部,能有一次性处理、传输、暂时存储的信息最大长度为16位;而8086有20根地址总线,但是内部只能产生16位的数据,如果不用另外的方式,那么只能寻址2^16=65536(字节)/1024=64 kb;所以,当CPU要读取内存数据时,会先在内部产生两个16位的地址数据,然后通过地址加法器,按照 物理地址=段地址*16+偏移地址 进行计算要访问的外部内存的物理地址,这个算法实际上依赖于对二进制数据的左移操作;

二、内存中“段”的概念:

内存其实是一个连续整体,这里的连续可以理解为物理地址的连续吧;出现这种“段”的概念,实际上还是由于8086 CPU是16位的,它不可能一次生成一个20位的地址数据,所以分两次产生,每一次都是一个16位的地址,一个被当作公式中的基(段)地址,另一个就是偏移地址;由他们俩个共同决定要访问的物理地址(20位);2^16肯定小于2^20,所以为了能访问外部内存的所有地址,所以产生了基地址和偏移地址之说;(语言表述不太清楚,应该只有自己能明白这意思吧)

三、段地址:

段地址的长度没有明确的规定,我们可以随意划分,但是最长不能超过10000 H;
常常有如下的说法:

1、偏移地址为16位,那么一个段的最大长度为64 kb:

8086 cpu在产生偏移地址时,是一个16位的二进制数据,那么它的最大值为2^16=65536,除以1024就得到64 kb,如果转换成16进制,则是:10000 H;

2、一个段的起始地址总是16的倍数?

因为8086有20根地址总线,所以最大的寻址空间(内存最大值)2^20=1048576,转换成16进制为:100000 H;根据上面计算的,偏移地址最大为10000 H,所以这块内存最少可以被分成10段,分别为:
000000 H------010000 H
010000 H------020000 H
.......
然后从000000 H地址开始,物理地址都是段地址*16+偏移地址,偏移地址也是16的倍数,所以最后不管这个段有多长,下一个段的起始地址还是16的倍数;
用更准确的说发应该是:起始地址为16的倍数,因为:
首先,起始地址=基(段)地址 * 16 得来,所以起始地址是16的倍数肯定没问题!这里和偏移地址以及这个内存段的大小都没有关系;例如:划分两个大小为2H的内存段,比如10000H--10001H;那么可以认为基地址为:1000H,所以起始地址就为:1000H*16=10000H;那么下一个内存段可以分为:10002H--10003H;基地址为:1000H,还是和第一段内存一样;即是,只要内存段的长度不超过偏移地址的最大表示长度,那么划分的任何内存段,它们的基地址都一样!

其实对上面这10段内存段来说,我们访问时,是包含左值,不包含右值的;很简单的道理,如果偏移地址的二进制为16个0,那么物理地址就是基地址*16,如果基地址的二进制也为16个0,那么这个物理地址就是第一段的左值了,相反,如果偏移地址的二进制为16个1,那么结果为FFFF H,也就是偏移地址的最大值,这时的物理地址不是010000 H,即访问不了右值;

这只是新手学习汇编的一个小笔记,帮助自己理解的,不建议观看!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: