假设我们的数字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将被删除。
答案 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”。