Генерация палиндрома
Всем привет, у меня есть функция для генерации палиндрома из исходной строки. Алгоритм её работы задумывался таким, сначала читает строку в прямом направлении и копирует байты в результирующую строку, а потом читает строку в обратном направлении и копирует байты в результирующую строку. В теории должно быть так:
Входные данные: 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 // Копируем строку в обратном порядке