竹逸 发表于 2022-5-27 17:23:02

我可以这么理解寻址方式吗?

我可以这么理解寻址方式吗?

8086CPU寻址方式
                直接寻址idata是立即数
                        寄存器间接寻址
                        寄存器间接寻址
                        寄存器间接寻址
                        寄存器间接寻址
                寄存器相对寻址(bx是相对立即数idata的偏移地址)
                bx是偏移地址,段地址默认ds,si是相对bx的偏移地址
        bx是偏移地址,段地址默认ds,si是相对立即数idata的偏移地址

jackz007 发表于 2022-5-27 19:27:58

    一般的寄存器间接寻址,方括号内是偏移,默认段地址在 ds 寄存器,只有涉及到 bp 寄存器的间接寻址(方括号内的表达式中有 bp 寄存器)比较特殊,其段地址在 ss 寄存器中。

竹逸 发表于 2022-5-28 10:35:23

本帖最后由 竹逸 于 2022-5-28 10:41 编辑

jackz007 发表于 2022-5-27 19:27
一般的寄存器间接寻址,方括号内是偏移,默认段地址在 ds 寄存器,只有涉及到 bp 寄存器的间接寻址(方 ...

关于地址(比如段地址、基址、偏移地址、物理地址)我是这样理解的

物理地址:是唯一的内存地址

内存中每一个存储单元都是以线性排列的,为了方便区分谁是谁,我们用记标号的方式来定位每一个存储单元,第一个存储单元从0开始标号,以此类推,这些标号就是每一个存储单元在当前位置的地址值,存储单元都是实实在在存在的,所以把为这些存储单元分配的地址值称为物理地址

8086 CPU内部是16位的,也就是说各个总线的宽度均为16位,可是它与外部器件的地址总线宽度是20位,那么8086CPU是如何实现用内部16位的地址总线去寻址外部20位的物理地址呢?

CPU的设计师就想出了一个折中的办法,用两个16位的地址来合成一个20位的物理地址,其中一个16位的地址就称为段地址,另一个16位的地址就称为偏移地址,段地址和偏移地址都是16位的,用十六进制表示则是4位,他们通过地址加法器把4位的段地址左移一位来组成一个5位的基础地址,相当于原来的4位数*10H后变成了5位数,然后和偏移地址相加合成物理地址

段地址*10H + 偏移地址 = 物理地址

基础地址也是物理地址,是段首地址(一个段中连续内存单元的起始地址)

偏移地址是相对于基址的偏移量

段地址   基址   偏移地址   物理地址
0000   00000   0~F          00000~0000F
0001   00010   0~F          00010~0001F
0002   00020   0~F          00020~0002F
……

FFFF   FFFF0   0~F          FFFF0~FFFFF

可以看出段地址每增1,则基础地址增10H,也就说明上下段的间隔是16个存储单元,而这16个存储单元是通过偏移地址来索引的,基础地址负责定位每个段首地址,通过 段地址*10H+偏移地址 的方式就可以完美索引到外部20位(00000~FFFFF)物理地址

竹逸 发表于 2022-5-28 11:22:00

当然内存地址并没有被分段,这里的分段是由于内部总线位数的不足而引出的概念,偏移地址的索引范围也不是只有0~f,最大值应该是ffff,这是只是便于理解就将索引范围定为只有16个字节
页: [1]
查看完整版本: 我可以这么理解寻址方式吗?