jixiang 发表于 2009-7-3 21:20:40

存储器单元的地址和内容

首先声明本人是一个菜菜鸟,以下是我在自学汇编语言的过程中的一些学习笔记,发出来的目的是希望和有兴趣的朋友一起共同学习,共同进步。
存储器单元的地址和内容
在存储器中,字节是最基本的存储单元。为了正确地存取信息,就给每一个字节一个地址。
由于在8086/8088CPU的计算机中有20根地址总线,可以访问存储器的最大容量为2^20=1MB,但是在8086CPU中所有可以用来存放地址的寄存器都是16位的,为了能在16位字长的机器里提供20位的地址,就采取地址分段的方法,将存储器分为若干个段,每个段的大小为1~64KB,为什么每个段的额大小为这么多呢?大家想想,既然寄存器都是16位的,那么16位可以表示的最大数就是64KB(因为2^10=1024=1KB,2^6=64,所以2^16=64K了),在IBM-PC机器中规定从0地址开始,每16B为一个小段,1MB的地址空间可以分为65536个小段。
    第一小段:00000H,00001H,00002H,...,0000fH
    第二小段:00010H,00011H,00012H,...,0001fH
    第65536小段:ffff0H,ffff1H,ffff2H,...,fffffH
由于每一个小段的手地址中最低四位都为0,所以只需在cs,ds,es,ss中保存地址总线高16位即可。
CPU在寻找物理地址时就可以通过段存储器中存放的段基址和偏移指针寄存器(sp,bp)中存放的偏移量来决定。规则为:   物理地址=段基址×16+偏移地址。这样就可以通过16位的段基址和16位的偏移地址得到20位的物理地址了。
段寄存器的作用:
cs:在取指令时,自动取cs寄存器中的内容,再加上由ip给出的16位偏移地址得出下一条将要执行指令的物理地址。
ss:在涉及到栈的操作时,默认使用ss寄存器,ss指向栈基址,sp指向栈顶,通过ss和sp就可以确定一个栈并进行出栈和入栈操作。在栈中还可   以使用bp指针,用于指向栈中元素的偏移地址。
ds和es:当存取一个普通存储器操作数时,自动选择ds或者es,同时加上16位寄存器,得出存储器操作数的物理地址。
页: [1]
查看完整版本: 存储器单元的地址和内容