汇编语言的两个小问题,望高手帮忙解决

时间:2022-02-05 01:28:41
问题一:  大家都知道,8086CPU给出地址的方法是  CPU提供16位段地址和16位偏移地址,这两个地址被送到地址加法器中,
 加法器将两个16位地址合成一个20位的物理地址,是这样的吧,我想请问这时这个20位物理地址是储存在哪里呢?
 8086CPU是16位呀,怎么可以储存20位物理地址呢?
[img=http://bbs.fishc.com/forum.php?mod=attachment&aid=MTcxNHw0YmI2N2IwNHwxMzE2MTc4ODkyfDEwNzA5Nnw0MzQ4&noupdate=yes][/img]

问题二:出栈后,之前栈中的内容到底有没有被清空呢?

13 个解决方案

#1


20位物理地址 是传在20条地址线上哦 

#2


80x86中的寄存器都是16位的,在实模式下,存储器地址采用存储空间的分段技术来解决寻址1MB的存储空间,即用分段技术来解决16位的寄存器寻址20位地址的问题,段地址与偏移地址组合形成20位物理地址。
分段方法:物理地址=段地址*16D(10H)+偏移地址;即:二进制的段地址左移四位+二进制的偏移地址。

#3


1。存储的物理地址是存于内存中;而段地址(也就是段基地址)存放在寄存器中;
2。对于数据段,代码段之类的“段”,是在内存中定义的一篇存储空间。

#4


计算之后的结果存在地址累加器的寄存器中,通过这个寄存器直接给20根地址线

#5


这个涉及到内存控制器中的两个寄存器MAR 和MDR了,  即地址寄存器和数据寄存器
如果是20条地址线,那么mar就是20位, 因为是16位数据线,mdr是16位
首先搞清楚一点,内存的数据或者说指令(指令也可以看作是数据,就是一坨0和1嘛),是怎么被取出来的,最简单的描述:CPU给出地址,送给内存,内存收到这个地址,把对应内存单元的数据输出

CPU在产生地址的时候 有个地址累加器(这个在地址变换机构里,是个专用的,并不使用CPU的累加器来算这个地址),这个累加器的功能就是将段地址左移4位加上偏移地址,同时在CPU的控制下将产生的20位地址送往20位的地址线(应该说20条地址线),同时CPU控制下内存MAR接收这20位数据。然后内存收到这20位数据,就把相应的数据送到MDR中了,中间的过程如果详细说更复杂些,关于时序,锁存之类的。楼主有兴趣的话可以查阅关于内存的一些资料。

#6


补充一点:话说现在内存控制器都做到CPU里去了,所以说MAR和MDR貌似都在CPU里了 - -

#7


谢谢各位的回答,大家可能没有听懂我的意思,是这样的,当地址加法器通过运算得到20位物理地址的时候,就是这个20位地址还没有被输入输出控制器输出时,它是储存在哪里的?

#8


该回复于2011-09-19 10:36:01被版主删除

#9


该回复于2011-10-27 16:53:25被版主删除

#10


我也刚学汇编,来学习一下,大二了啊。。。

#11


实模式分段管理物理地址!

比如说CS!CS是一个代码段寄存器,还有一个IP寄存器,这两个都是16位的!
CS存着段的基地址,IP存着段内的偏移

然后CPU要读这个CS段的某个IP位置的命令时,也就是要得到20位地址时:
物理地址  = CS * 16 + IP 这样就可以得到20位的物理地址了。


而你问20位地址是存放在哪里的,这个其实就是让CS与IP共同合作的结果了。一个段的基地址,一个存这个段的偏移量。
这样就可以用两个16位寄存器存放20位的地址了。

至于怎么分段的LZ可以看看书。

得到20位地址就用在了地址总线上了,就拿数据了吧。

#12


2 一般出栈后只是栈指针移动了,实际内容不动,可以随便写个什么调试下看看。
仅供参考……

#13


地址线20位 ,数据线 16位
11楼正解

#1


20位物理地址 是传在20条地址线上哦 

#2


80x86中的寄存器都是16位的,在实模式下,存储器地址采用存储空间的分段技术来解决寻址1MB的存储空间,即用分段技术来解决16位的寄存器寻址20位地址的问题,段地址与偏移地址组合形成20位物理地址。
分段方法:物理地址=段地址*16D(10H)+偏移地址;即:二进制的段地址左移四位+二进制的偏移地址。

#3


1。存储的物理地址是存于内存中;而段地址(也就是段基地址)存放在寄存器中;
2。对于数据段,代码段之类的“段”,是在内存中定义的一篇存储空间。

#4


计算之后的结果存在地址累加器的寄存器中,通过这个寄存器直接给20根地址线

#5


这个涉及到内存控制器中的两个寄存器MAR 和MDR了,  即地址寄存器和数据寄存器
如果是20条地址线,那么mar就是20位, 因为是16位数据线,mdr是16位
首先搞清楚一点,内存的数据或者说指令(指令也可以看作是数据,就是一坨0和1嘛),是怎么被取出来的,最简单的描述:CPU给出地址,送给内存,内存收到这个地址,把对应内存单元的数据输出

CPU在产生地址的时候 有个地址累加器(这个在地址变换机构里,是个专用的,并不使用CPU的累加器来算这个地址),这个累加器的功能就是将段地址左移4位加上偏移地址,同时在CPU的控制下将产生的20位地址送往20位的地址线(应该说20条地址线),同时CPU控制下内存MAR接收这20位数据。然后内存收到这20位数据,就把相应的数据送到MDR中了,中间的过程如果详细说更复杂些,关于时序,锁存之类的。楼主有兴趣的话可以查阅关于内存的一些资料。

#6


补充一点:话说现在内存控制器都做到CPU里去了,所以说MAR和MDR貌似都在CPU里了 - -

#7


谢谢各位的回答,大家可能没有听懂我的意思,是这样的,当地址加法器通过运算得到20位物理地址的时候,就是这个20位地址还没有被输入输出控制器输出时,它是储存在哪里的?

#8


该回复于2011-09-19 10:36:01被版主删除

#9


该回复于2011-10-27 16:53:25被版主删除

#10


我也刚学汇编,来学习一下,大二了啊。。。

#11


实模式分段管理物理地址!

比如说CS!CS是一个代码段寄存器,还有一个IP寄存器,这两个都是16位的!
CS存着段的基地址,IP存着段内的偏移

然后CPU要读这个CS段的某个IP位置的命令时,也就是要得到20位地址时:
物理地址  = CS * 16 + IP 这样就可以得到20位的物理地址了。


而你问20位地址是存放在哪里的,这个其实就是让CS与IP共同合作的结果了。一个段的基地址,一个存这个段的偏移量。
这样就可以用两个16位寄存器存放20位的地址了。

至于怎么分段的LZ可以看看书。

得到20位地址就用在了地址总线上了,就拿数据了吧。

#12


2 一般出栈后只是栈指针移动了,实际内容不动,可以随便写个什么调试下看看。
仅供参考……

#13


地址线20位 ,数据线 16位
11楼正解