反向

2011-01-18 127 views
0

假设SI迪复制错误我们拥有数321 SI点,以抵消 和临时的偏移量是反向

mov di,offset temp 

现在,我们想从SI复制到迪这个命令:

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将被删除。

回答

1

如果初始条件确实如您所描述的那样,我认为您的temp存储区域必须与原始输入重叠:否则,您的循环将不会导致重复的“1”。

具体来说,我猜0123OO指向原始输入开始后立即的字节(作为一个真正的猜测:也许是在数据部分保留“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”。

+0

是的,你是对的。我已经改变了数据段中的温度偏移,并且每件事情都变得最好。 – 2011-01-19 04:54:14

2

对我来说看起来没问题 - 在调试器中逐步查看它发生错误的位置。

+0

另一个答案是更多的勺子喂养,但ASM程序员应该知道如何使用调试器来找到自己的错误。所以,+1 :) – Jester 2011-01-19 01:13:46