假設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