muloyo 发表于 2019-3-23 14:29:42

汇编小白求助

本帖最后由 muloyo 于 2019-3-23 14:34 编辑

求教段地址与基地址有没有区别?
如何理解bp寄存器表示堆栈中的基地址?
我看百度上有人说基地址=段地址左移四位,那样的话基地址就是20位了,怎么可能保存在16位寄存器中呢?

jackz007 发表于 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,; ax = 0123h
      mov bx,; bx = 04567h
      mov cx,; cx = 089abh
      mov dx,; dx = 0cdefh

      通过 16 位段地址(SEG)和偏移地址(OFF)计算得到 20 位内存地址的计算方法如下:
      20 位内存地址 = SEG × 10h + OFF
      式中,SEG × 10h 与楼主所说的段地址(SEG)左移 4 位的效果完全相同。例如,0123h 左移 4 位后的新值是 01230h

      楼主理解得很对,一个 16 位的寄存器根本不可能保存一个 20 位的地址。
页: [1]
查看完整版本: 汇编小白求助