【问题标题】:Assembly: Segment register & offset register汇编:段寄存器和偏移寄存器
【发布时间】:2016-11-11 15:39:36
【问题描述】:

我很难理解 10H 值的来源?该示例说 ds=1275H (?segment reg.) 和 bx:457H (?offset) 为什么 ds 乘以 10H。他们是否意味着 1275 是十六进制值(所以 dec. 值是 4725)?

【问题讨论】:

  • 请不要张贴文字图片。该网站上的一些用户是盲人。

标签: assembly cpu-registers x86-16


【解决方案1】:

段寄存器指向一个16字节的内存块...

这就是混乱的开始。段寄存器指向一个 65536 字节的内存块,偏移量寄存器告诉要添加多少字节到这个 65536 字节块的开头。在 16 字节块的开头添加字偏移是没有意义的!

这些 64KB 块在内存中大量重叠。它们的起始地址仅相差 16 个字节!您可以将这些 64KB 块视为形成一个数组,然后段寄存器包含的内容是对其元素的从零开始的索引。

因此,这些块之间的间距才是您所询问的 10H 的真正含义。

为了获得内存位置的线性(真实)地址,我们需要将段寄存器中的值乘以 16(这在十六进制表示法中表示为 10h),然后加上偏移量。

【讨论】:

    【解决方案2】:

    这里的关键词是“段寄存器指向一个 16 字节的内存块”。如果您将整个内存安排在 16 字节块中,则段寄存器(例如 DS)将包含该块的编号。

    从段寄存器的值到线性地址,要乘以16,和十六进制数10一样,一般写成10H。

    计算出段的起始地址后,加上偏移寄存器。

    是的,1275H 是一个十六进制数字,这就是“H”的含义。对应十进制的4725。

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 2020-01-30
      • 1970-01-01
      • 2012-01-11
      • 2014-04-25
      • 2011-01-22
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多