鱼C论坛

 找回密码
 立即注册
查看: 3367|回复: 1

汇编小白求助

[复制链接]
发表于 2019-3-23 14:29:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

求教段地址与基地址有没有区别?
如何理解bp寄存器表示堆栈中的基地址?
我看百度上有人说基地址=段地址左移四位,那样的话基地址就是20位了,怎么可能保存在16位寄存器中呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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 的用法和作用:
  1.         push bp
  2.         mov bp,sp
  3.         mov ax,0123h
  4.         push ax
  5.         mov ax, 04567h
  6.         push ax
  7.         mov ax, 089abh
  8.         push ax
  9.         mov ax,0cdefh
  10.         push ax
  11.         mov ax,[bp-2]  ; ax = 0123h
  12.         mov bx,[bp-4]  ; bx = 04567h
  13.         mov cx,[bp-6]  ; cx = 089abh
  14.         mov dx,[bp-8]  ; dx = 0cdefh
复制代码


        通过 16 位段地址(SEG)和偏移地址(OFF)计算得到 20 位内存地址的计算方法如下:
  1.         20 位内存地址 = SEG × 10h + OFF
复制代码

        式中,SEG × 10h 与楼主所说的段地址(SEG)左移 4 位的效果完全相同。例如,0123h 左移 4 位后的新值是 01230h

        楼主理解得很对,一个 16 位的寄存器根本不可能保存一个 20 位的地址。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 23:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表