Генерация палиндрома

Всем привет, у меня есть функция для генерации палиндрома из исходной строки. Алгоритм её работы задумывался таким, сначала читает строку в прямом направлении и копирует байты в результирующую строку, а потом читает строку в обратном направлении и копирует байты в результирующую строку. В теории должно быть так:

Входные данные: qwe
Выходные данные: qweewq
Но по факту выходные данные получаются: qqwe

genPalindrome proc
    ; Устанавливаем направление обработки цепочек (DF = 0, копирование вперед)
    CLD                         ; Устанавливаем направление: вперед

    ; Копируем строку в начало результирующего буфера
    lea rsi, buffer             ; Адрес исходной строки
    lea rdi, result_buf         ; Адрес результирующего буфера
    mov rcx, qword ptr [lens]   ; Количество символов в строке
    rep movsb                   ; Копируем строку в результат

    ; Устанавливаем направление обработки цепочек в обратную сторону (DF = 1)
    STD                         ; Устанавливаем направление: назад

    ; Копируем строку с конца во вторую половину результирующего буфера
    lea rsi, buffer             ; Адрес исходной строки
    add rsi, qword ptr [lens]   ; Указатель на конец строки (переход к последнему символу)
    dec rsi                     ; Переход к последнему символу
    lea rdi, result_buf         ; Адрес результирующего буфера
    add rdi, qword ptr [lens]   ; Переход к концу первой части в результирующем буфере
    mov rcx, qword ptr [lens]   ; Количество символов в строке
    rep movsb                   ; Копируем строку в обратном порядке

    ; Завершаем результирующую строку
    cld                         ; Возвращаем направление: вперед
    lea rdi, result_buf         ; Указатель на результирующий буфер
    add rdi, qword ptr [lens]   ; Переход к концу первой части строки
    add rdi, qword ptr [lens]   ; Переход к концу второй части строки
    mov byte ptr [rdi], 0       ; Завершаем строку символом NULL

    ret
genPalindrome endp

Ответы (1 шт):

Автор решения: MBo

Похоже, что вы считаете, что при установленном Direction Flag регистр RSI будет идти назад, а RDI - вперёд. Это не так, оба регистра будут идти обратно, поэтому

q w e _
      ^  RDI
q w e e
    ^
q w w e _
  ^
q q w e _  

Воспользуйтесь обычным циклом

@@cycle:
    mov al, byte ptr [rsi]
    mov byte ptr [rdi], al
    inc rdi
    dec rsi
    loop @@cycle                   // Копируем строку в обратном порядке 


       
→ Ссылка