本帖最后由 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 位的地址。 |