Длина строки должна учитывать нулевое индексирование, поэтому;
mov esi, SIZEOF myString - 1 ; Should equal 8
mov ecx, SIZEOF myString ; Should equal 9
Завершающий символ 0x0 NULL необходимо записать до конца temp . Чтобы хоть немного оптимизировать, запись 4 NULL работает, так как EDI является только 32-битным регистром.
xor edi, edi
mov temp[ecx],edi ; Writing 4 chars
; Instead of
mov BYTE temp[ecx], 0
Единственное, что нужно изменить в вашем цикле;
@@:
mov al, myString [edi] ; Read char from source
mov temp[esi], al ; and write to destination
dec esi
inc edi
loop @B
Что случилось с вашей программой, так это
movzx eax, myString
mov temp, al
Перемещал первый символ источника в первую позицию назначения, и поскольку вы не смогли учесть нулевую индексацию, последующим символом, записанным в temp, был следующий завершающий символ из источника.