Если начальные условия действительно такие, как вы описали, я думаю, что ваша область хранения 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».