鱼C论坛

 找回密码
 立即注册
查看: 3900|回复: 16

汇编 地址加法器如何实现地址相加 ,求原理解释 不是公式

[复制链接]
发表于 2013-7-30 08:51:48 | 显示全部楼层 |阅读模式
1鱼币
8086cpu内部为16位构造,地址加法器把段地址左移,不是相当于选择了20位的数据吗? 一个20位的和16位的相加? 还是说地址加法器内部不是依照16位运算。

最佳答案

查看完整内容

首先当时在那个年代内存很小很贵,8086所有的内部寄存器、内部及外部数据总线都是16位宽,因此是完全的16位微处理器。20位外部地址总线,因此物理寻址空间为1MiB (即220 = 1,048,576). 在Intel的8位、16位处理器中,由于寄存器的宽度为8或16比特,而地址总线的宽度一般是要大于寄存器的宽度,所以为了能访问整个地址空间,需要采取特殊的寻址计算——分段寻址。段式内存管理带来了显而易见的优势,程序的地址不再需要硬编码了 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-30 08:51:49 | 显示全部楼层
首先当时在那个年代内存很小很贵,8086所有的内部寄存器、内部及外部数据总线都是16位宽,因此是完全的16位微处理器。20位外部地址总线,因此物理寻址空间为1MiB (即220 = 1,048,576).

在Intel的8位、16位处理器中,由于寄存器的宽度为8或16比特,而地址总线的宽度一般是要大于寄存器的宽度,所以为了能访问整个地址空间,需要采取特殊的寻址计算——分段寻址。段式内存管理带来了显而易见的优势,程序的地址不再需要硬编码了,调试错误也更容易定位了,更可贵的是支持更大的内存地址。但是从80386开始的32位微处理器,地址总线宽度也是32比特,可以视作扁平(flat)地址空间,不再需要分段寻址。


CPU执行指令的步骤从内存中取指令----指令译码----读出操作数-----运算------回写

取指是从内存中取出指令进入CPU。
指令在内存中的地址由CS和IP共同提供的,再由地址加法器得到20位内存地址。
总线接口单元负责从内存取出这个指令代码,送入指令队列。


并不是20位数据和16位数据相加,从内存中取出的8086指令长度变化从1到6字节,20位的实际地址,也就实现了从16位内存地址到20位实际地址的转换,或者叫“映射”。20位只是地址总线的宽度,可以寻址的范围,获取的指令长度还是1到6字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-30 09:43:38 | 显示全部楼层
从逻辑地址计算成20位物理地址,和add指令的加法,由不同的部件来运算。add加法的限制当然不能用于地址的换算了。
地址加法器能把一个作为基址的16位数据和一个作为偏移地址的8位或16位数据合成一个物理地址,这个过种中的先乘后加法的运算也没有相应的乘法或位移和加法指令来供我们调用了,
大至是这样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-30 13:12:47 | 显示全部楼层

我可不可以这样理解,地址加法器 ,段地址左移后,对数据进行的仍然是16位的操作,输出的时候进行逻辑上的整和,构成20位的物理地址。比如1230H+00C8H,  在地址加法器里 12300H+00C8H ,先是2300H+00C8H  ,再和 12300中的 1 ,整合下,输出数据。
    或者是 这些数据都是由指令控制,指令对应的机器码为16位数据,多出来的 加上一段16位就行了。  可不可以看成  把12300中的  1和2300分别看成16进制数,再进行运算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-30 13:41:24 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-7-30 13:42 编辑
loveKD92 发表于 2013-7-30 13:12
我可不可以这样理解,地址加法器 ,段地址左移后,对数据进行的仍然是16位的操作,输出的时候进行逻辑上的 ...

因为需要合成一个20位的地址来进行寻址操作,段地址左移两位指的是乘以10h,那么后面增加一个0,1230H+00C8H=1230H*10H+00C8H=12300H+00C8H=123C8H
123C8便是最终合成的20位地址
因为16进制的一位等于4位二进制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-30 14:25:30 | 显示全部楼层
福禄娃娃 发表于 2013-7-30 13:41
因为需要合成一个20位的地址来进行寻址操作,段地址左移两位指的是乘以10h,那么后面增加一个0,1230H+00 ...

一位等于四位 ,这个我明白。只不过觉得 12800H 是20位的数据。  而8086cpu中都是16位的,也应该是按照16位进行分段识别的吧。 他怎么算?我就是这点弄不明白。公式什么的都明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-30 15:06:52 | 显示全部楼层
loveKD92 发表于 2013-7-30 14:25
一位等于四位 ,这个我明白。只不过觉得 12800H 是20位的数据。  而8086cpu中都是16位的,也应该是按照16 ...

在内存中存放的最小单元是字节
在内存中对于CPU来讲数据和指令都是一样的,都是二进制数据。
12800H是地址加法器合成的20位地址,用于内存寻址的。
8086CPU所有的内部寄存器、内部及外部数据总线都是16位宽,因此是完全的16位微处理器。20位外部地址总线,因此物理寻址空间为1MiB (即220 = 1,048,576)。
建议好好看看书,8086CPU支持分段寻址方式。
比如你在debug中d 1000:0  显示的是从10000H开始的128个字节的内容,因为当时设计CPU的时候内存还很小,8086支持1MB空间寻址已经很大了,当时最多使用640KB的内存。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-30 15:15:47 | 显示全部楼层
福禄娃娃 发表于 2013-7-30 15:06
在内存中存放的最小单元是字节
在内存中对于CPU来讲数据和指令都是一样的,都是二进制数据。
12800H是地 ...

我刚开始学习汇编。  听你说后,理解的差不多了。  概括下就是 分段处理。   非常谢谢{:2_30:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-30 15:17:31 | 显示全部楼层
福禄娃娃 发表于 2013-7-30 15:06
在内存中存放的最小单元是字节
在内存中对于CPU来讲数据和指令都是一样的,都是二进制数据。
12800H是地 ...

另 求助  :win 7 怎么在 cmd窗口 调用debug啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-30 15:29:00 | 显示全部楼层
loveKD92 发表于 2013-7-30 15:15
我刚开始学习汇编。  听你说后,理解的差不多了。  概括下就是 分段处理。   非常谢谢

不客气,其实分段寻址在当年是一种巧妙的方法,现在的CPU必须要和过去兼容有三种模式,实模式段地址寻址还是受限于64KB,保护模式能达到4GB,虚拟8086模式是仿真的实模式。
从80386开始,数据总线和地址总线都是32位了,在保护模式下,它的段范围不再受限于64K,可以达到4G。从寻址方式上说,就是从“实模式”到“保护模式”的变化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-30 15:30:26 | 显示全部楼层
loveKD92 发表于 2013-7-30 15:17
另 求助  :win 7 怎么在 cmd窗口 调用debug啊

有置顶的帖子,小甲鱼早就给出方法了,具体参照:http://bbs.fishc.com/thread-3581-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-30 15:34:22 | 显示全部楼层
福禄娃娃 发表于 2013-7-30 15:29
不客气,其实分段寻址在当年是一种巧妙的方法,现在的CPU必须要和过去兼容有三种模式,实模式段地址寻址还 ...

嘿嘿 ,先收下,现在知识比较浅。   帮忙指导下 win7 cmd我的怎么 调不出来debug啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-30 15:35:30 | 显示全部楼层
福禄娃娃 发表于 2013-7-30 15:30
有置顶的帖子,小甲鱼早就给出方法了,具体参照:http://bbs.fishc.com/thread-3581-1-1.html

刚看到 {:2_25:}  灰常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 13:41:48 | 显示全部楼层
学习一下{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 14:36:37 | 显示全部楼层
本帖最后由 5元 于 2013-7-31 14:41 编辑


段地址*10(十六进制)+偏移地址=物理地址】
8086中只有16跟地址总线不够索引内存,所以有了上面的表达式。可以变成20位最大是FFFFFH。
1230H = 1001000110000
12300H=1001000110000 0000(二进制左移四位)1230 0H
1230H*10H=12300H
比如1000:0001用时在把他变成FFFFFH格式。
先把1000变成20位,然后在加上偏移地址。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 15:20:14 | 显示全部楼层
学习了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-27 14:11:12 | 显示全部楼层
走过路过,一定要来看过、、、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 01:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表