- [游客] 说的不错,但是现在国人能有多少个学习这个的时候还能有开拓视野的想法。。。 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
[2009-09-23 21:49] 存储器寻址小议(二):8086/8088的物理地址、段机制和逻辑地址
这从全 0 到全 1 的每一个二进制数,很自然地可以作为内存字节单元的编号,即地址;由于使用这种地址能直接控制地址译码器在物理上唯一地选通某个字节单元,故被称做“物理地址”。
程序是不能直接给出 20 位地址信息的,这是因为 8086/8088 CPU 可编程的 14 个寄存器都是 16 位的,更没有通过编程直接输出20 位地址信息的其他途径。20 位地址输出是通过来自段寄存器的和 CPU 内部总线(16位)的两个 16 位地址分量“移位相加”得到的(见上图)。显然,通过改变这两个 16 位地址分量,就可实现 1M 字节的寻址。
不过来自段寄存器的和来自 CPU 内部总线的两个 16 位地址分量的作用是不同的。由于段寄存器的内容左移后空出的四位均被自动充 0,又假设来自 CPU 内部总线的地址信息为零的话,单靠段寄存器只能定位 1M 字节空间内地址低四位为 0 的那些单元,并且 8086/8088 CPU 也没有提供单独通过段寄存器直接访问内存单元的指令;与此相反,来自内部总线的 16 位地址分量支持连续、灵活的变化和内存访问——不过如果不依赖段寄存器内容的帮助,这个地址分量也只能局限在 64K 的范围之内。
因此我们可以看出,段寄存器的内容决定了内存某一“段”的起点,这正是段寄存器名称的由来:段寄存器的内容左移四位,加上低四位自动填充的 0,就决定了一个段的起点,这个起点被称作“段基址”。显然,段寄存器保存的是段基址的高 16 位:段的起点只能从物理地址低四位为零的字节单元开始。
来自 CPU 内部总线的 16 位地址分量以段基址为起点,利用其连续、灵活的变化,即可遍历本段 64K 字节单元。由于这个地址分量本质上是所访问的字节单元到本段段基址的距离,所以被称作“偏移量”。
可见,20 位的物理地址只能通过编程可控的是段寄存器的内容(段基址高 16位)和 16 位偏移量间接地给出。可能是为了技术讨论方便并且和物理地址相区别,就把这两个地址分量合称为“逻辑地址”,习惯上写成这样:
段基址(的高16位): 偏移量
尽管逻辑地址确定的物理地址只有 20 位,但却无奈地占用了 32 位即 4 个字节的空间。
和物理地址与字节单元一一对应的关系不同,一个物理地址有可能对应若干个逻辑地址。这是因为可以调整两个地址分量的值,但使其结果仍然和原来的 20 位地址值相等。比如:
2053H:0100H
和:
2043H:0200H
2063H:0000H
计算出来的物理地址均为 20630H。至于一个物理地址最多可能对应多少个逻辑地址?有没有物理地址只有一个逻辑地址相对应?如果有那么这种物理地址和逻辑地址一一对应的单元有多少?它们的物理地址范围在哪一段?这些问题就留给有兴趣的朋友思考。
[ huibian2009 发表于 2009-11-12 10:12 ]
还是有点看不太懂,希望以后能向您请教一些问题。
[ dwtqin 发表于 2010-02-26 17:26 ]
还是有点模糊, 不懂,为什么栈是64K,没有说明64K从哪里得知
[ scuzg 发表于 2010-03-01 10:05 ]
SP的初值=堆栈容量=栈底的偏移量+2。
而ss决定栈段起点。
即堆栈的所有结构元素都是由SS、SP决定的。
[ 游客 发表于 2010-11-07 21:25 ]
通过SS:SP访问堆栈内存,当SP初值为0000h,此时栈底的偏移量为0FFFEh,堆栈容量为64K。
若SP初值为0001h,则栈底的偏移量为0FFFh,那么栈底数据的高8位,应该访问不到了,不知道这样理解对吗?
[ 游客 发表于 2011-12-17 21:53 ]
请问 (由于段寄存器的内容左移后空出的四位均被自动充 0,又假设来自 CPU 内部总线的地址信息为零的话,单靠段寄存器只能定位 1M 字节空间内地址低四位为 0 的那些单元,并且 8086/8088 CPU 也没有提供单独通过段寄存器直接访问内存单元的指令) 这句话怎么理解?
如果只靠段寄存器访问内存,由于段寄存器是16位的,应该能定位 1M 地址空间的前16位组成的单元啊(或16k字节)!!!
[ 游客 发表于 2011-12-17 23:02 ]
请问scuzg老师,地址加法器是多少位的啊(物理连接结构)?寄存器是16位,地址线20位,地址加法器在中间是如何把线路转换的啊?16——20
[ powerofthinking 发表于 2011-12-18 13:40 ]
博主的文章不错,希望再多写几篇。
[ scuzg 发表于 2011-12-29 15:45 ]
20位,图中有说明。