Задача
Вы рассматриваете свои символы ASCII как слова, а не как байты, поэтому в итоге вы меняете два символа одновременно:
Когда вы переворачиваете строку по два символа за раз, вы в конечном итоге записываете эти значения в буфер:
esi+0: p-
esi+1: lp
esi+2: el
esi+3: He
Во время каждой итерации ваш буфер выглядит так:
Help--
p-lp--
plpp--
plel--
pleHe-
Итак, вы заканчиваете тем, что записываете эту дополнительную е в буфер. Я предполагаю, что e не появляется в вашем цикле WriteChar.
Решение
Я не проверял ваш код, поэтому не могу знать наверняка, но, похоже, вам нужно изменить эту строку:
mov buffer[esi], ax ;Writes character to String
до
mov ptr byte buffer[esi], al ;Writes character to String
Вероятно, неплохо бы изменить и эту строку:
buffer WORD 81 DUP(0)
, поэтому вместо него используются байты:
buffer BYTE 81 DUP(0)