| 
 | 
 
 
发表于 2019-3-23 14:45:54
|
显示全部楼层
 
 
 
 本帖最后由 jackz007 于 2019-3-23 16:36 编辑  
 
      由于 8086 CPU 的数据总线是 16 位而地址总线是 20 位,于是就存在一个问题,无法用一个 16 位数来完整表达一个 20 位的内存地址,所以,就有了用两个 16 位数,也就是通过 段 + 偏移 的方式来表达内存地址的方法,这就有了段的概念。 
      在 8086 CPU 中,共设有 CS、DS、ES 和 SS 共 4 个段寄存器, 可以分别保存 4 个不同的段地址,分别满足程序应用中不同的内存寻址要求。 
       与 4 个段地址寄存器相比,基址寄存器 bp 是完全不同的一个寄存器,它主要用于保存在堆栈段内的一个偏移地址(指针),以便能够在不受堆栈操作(sp 变化)的影响下,通过这个指针(bp)稳定、可靠地索引、访问到保存在堆栈段中的数据内容。 
     
       楼主可以通过以下代码具体了解基址寄存器 bp 的用法和作用: 
-         push bp
 
 -         mov bp,sp
 
 -         mov ax,0123h
 
 -         push ax
 
 -         mov ax, 04567h
 
 -         push ax
 
 -         mov ax, 089abh
 
 -         push ax
 
 -         mov ax,0cdefh
 
 -         push ax
 
 -         mov ax,[bp-2]  ; ax = 0123h
 
 -         mov bx,[bp-4]  ; bx = 04567h
 
 -         mov cx,[bp-6]  ; cx = 089abh
 
 -         mov dx,[bp-8]  ; dx = 0cdefh
 
  复制代码 
 
        通过 16 位段地址(SEG)和偏移地址(OFF)计算得到 20 位内存地址的计算方法如下: 
-         20 位内存地址 = SEG × 10h + OFF
 
  复制代码 
        式中,SEG × 10h 与楼主所说的段地址(SEG)左移 4 位的效果完全相同。例如,0123h 左移 4 位后的新值是 01230h 
 
        楼主理解得很对,一个 16 位的寄存器根本不可能保存一个 20 位的地址。 |   
 
 
 
 |