鱼C论坛

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

汇编小白求助

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

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

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

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

求教段地址与基地址有没有区别?
如何理解bp寄存器表示堆栈中的基地址?
我看百度上有人说基地址=段地址左移四位,那样的话基地址就是20位了,怎么可能保存在16位寄存器中呢?
想知道小甲鱼最近在做啥?请访问 -> 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 的用法和作用:
        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 位的地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 15:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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