【问题标题】:Where does the SI pointer point to when it is specified to point to an offset?当SI指针被指定指向一个偏移量时,它指向哪里?
【发布时间】:2019-08-08 07:51:48
【问题描述】:

如果这是一个重复的问题,请提前道歉。我对以下代码有点困惑:

list db 80h, 70h, 60h, 50h, 40h, 30h, 20h

       mov si, offset list
       move al,[si] 
repit: inc si
       add al,[si]
       jnc repit
fin:

我知道jnc表示在没有进位溢出的情况下我们将退出这个循环,即CF = 0。由于si 应该指向列表的第一个元素的索引,这不是80h 吗?然后如果si 增加,它应该指向 70h。将这些加在一起,答案应该是 F0,对吗?但是,当我运行这段代码时,我得到 AL 的值为 50。这怎么可能?我错过了什么?提前谢谢大家!

【问题讨论】:

  • 你的循环条件倒退了。只要没有结转,你就会一直循环。当c 条件 (CF==1) 为真时退出。

标签: pointers assembly indexing x86 memory-segmentation


【解决方案1】:

我知道jnc表示我们会在没有进位溢出的情况下退出这个循环,即CF=0。

这是不正确的。 JNC 会跳转,如果CF=0,什么意思如果没有无符号溢出会跳转。

既然 si 应该指向列表的第一个元素的索引,那么这不是 80h 吗?然后如果 si 增加,它应该指向 70h。将这些加在一起,答案应该是 F0,对吗?

到目前为止,是的。

但是,当我运行这段代码时,我得到 AL 的值为 50。这怎么可能?
我错过了什么?

50h的返回值为

80h + 70h + 60h = 50h + CARRY flag (unsigned overflow).

一步一步来

80h + 70h = F0h    (CF = 0 = JUMP)
F0h + 60h = 50h    (CF = 1 = NO JUMP = EXIT LOOP)

所以最后一个添加将 CARRY 标志设置为 1,因为 无符号溢出 从 FFh 到 00h(F0h + 0Fh 到 F0h + 10h(最后是 60h - 10h = 50h))。因为设置了 CARRY 标志,所以条件 JNC 跳转通过并且AL 确实包含“溢出”值 50h。

【讨论】:

    【解决方案2】:

    回答标题问题(与您的其他问题几乎没有关系):

    当SI指针被指定指向一个偏移量时,它指向哪里?

    在 x86 的分段内存模型中,近指针相对于段基址的偏移量。 mov si, OFFSET symbol 将 SI 设置为seg:off 地址的symbol 的偏移部分。

    如果symbol 是程序数据部分中的标签,并且您使用[SI]DS 段基= 该部分的开头,则[SI] 为您提供@ 处的字节987654328@作为内存操作数。

    SI 不指向偏移量,它持有mov si, OFFSET symbol 之后的偏移量。这一个指针。


    在简单的平面内存模型(如 32 位或 64 位代码)中,所有内容都使用 base=0,因此偏移量 = 线性地址。

    在具有“微小”内存模型(如.com)的 16 位代码中,CS=DS=ES=SS 因此所有内存引用都使用相同的基数。同样,只有 16 位偏移量用作完整的指针。实际的细分基础是什么并不重要,因为一切都与它相关。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 2011-08-02
      • 2011-08-04
      • 2011-02-18
      • 2012-12-13
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多