大家好,我有一个从源字符串生成回文的函数。其操作算法的构思如下:首先向前读取字符串并将字节复制到结果字符串中,然后反向读取字符串并将字节复制到结果字符串中。理论上应该是这样的:
输入数据: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
看来您认为设置方向标志后,RSI 寄存器将向后移动,而 RDI 寄存器将向前移动。这是不正确的,两个寄存器都会返回,所以
使用常规循环