假设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将被删除。
假设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将被删除。
如果初始条件确实如您所描述的那样,我认为您的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”。
对我来说看起来没问题 - 在调试器中逐步查看它发生错误的位置。
另一个答案是更多的勺子喂养,但ASM程序员应该知道如何使用调试器来找到自己的错误。所以,+1 :) – Jester 2011-01-19 01:13:46
是的,你是对的。我已经改变了数据段中的温度偏移,并且每件事情都变得最好。 – 2011-01-19 04:54:14