SI到DI复制错误反向

时间:2011-01-18 22:06:26

标签: assembly

假设我们的数字321 si 指向偏移 1 和temp的偏移量在 di

mov di,offset temp

现在我们要通过以下命令从si复制到di:

mov cx,3
reverse:
 mov dl,byte ptr [si]
 mov byte ptr[di],dl
 inc di
 dec si
loop reverse
mov byte ptr[di],'$'

但是输出113而不是123,这意味着整数2将被删除。

2 个答案:

答案 0 :(得分:2)

对我来说没问题 - 在调试器中逐步查看它是否出错。

答案 1 :(得分:1)

如果初始条件与您描述的完全一致,我认为您的temp存储区域必须与原始输入重叠:我不会看到您的循环如何导致重复的“1”。

具体来说,我猜测temp指向原始输入开始后的字节(作为一个非常疯狂的猜测:也许是在数据部分中保留“321”的缓冲区,并且已经意外地声明为只有一个字节,之后立即声明temp

即。最初:

   buffer for original number
     |
     |  temp (== di) actually points here
     |   |
     v   v
---+---+---+---+---+---
   | 3 | 2 | 1 |   |   
---+---+---+---+---+---
             ^
             |
        initial si

第一次迭代后,“1”覆盖了“2”:

        temp
         |
         v  di
---+---+---+---+---+---
   | 3 | 1 | 1 |   |   
---+---+---+---+---+---
        si

第二次迭代后,“1”(最初为“2”)被复制到原始“1”上:

        temp
         |
         v      di
---+---+---+---+---+---
   | 3 | 1 | 1 |   |   
---+---+---+---+---+---
    si

第三次迭代后,复制“3”:

        temp
         |
         v          di
---+---+---+---+---+---
   | 3 | 1 | 1 | 3 |   
---+---+---+---+---+---
si

...最后在最后使用$

        temp
         |
         v          di
---+---+---+---+---+---
   | 3 | 1 | 1 | 3 | $ 
---+---+---+---+---+---
si

...所以temp现在指向“113”。