Вы могли бы сделать это по-своему с помощью двух петель.После выполнения вашего первого цикла вы должны будете сделать это снова, но с уменьшенной на единицу длиной, чтобы текущий первый (первоначально второй) символ был помещен в позицию second-last , оставляя текущую последнюю(изначально первый) персонаж в одиночку.Затем продолжайте, пока длина не упадет до нуля.
Но это довольно неэффективно, поскольку у вас есть вложенные циклы, O (n 2 ).Вот лучший алгоритм, который использует только один цикл, O (n):
set spointer to point to the first character
set epointer to point to the last character
while epointer is greater than spointer:
save away [spointer] (the character pointed to by spointer) somewhere
copy [epointer] to [spointer]
copy the saved character to [epointer]
add one to spointer
subtract one from epointer
В основном он поддерживает указатель начала и конца, который первоначально меняет местами первый и последний символы, затем указатели перемещаются навстречу друг другу.
Таким образом, во второй раз в цикле вы меняете второй и второй последний символ, в третий раз третий и третий последний символ и т. Д.
Этот процесс останавливается, когда указателиравны (для строки нечетной длины) или начальный указатель больше, чем конечный указатель (для строки четной длины).
Поскольку это может быть домашнее задание (и в любом случае вам кажется, что скорость x86 высока)), вы должны выполнить упражнение по преобразованию этого в ассемблер.
Если выясняется, что не - домашнее задание, вы можете использовать приведенный ниже код masm32 в качестве базовой линии.Пожалуйста, не пытайтесь выдать это за свою собственную работу в сфере образования, так как вы почти наверняка будете застигнуты врасплох.Вы узнаете намного больше (например, домашнее задание или , не относящееся к домашнему заданию), если сами будете заниматься преобразованием, я просто предоставлю некоторый запасной код, если у вас возникнут проблемы с его обработкой.
.586
.model flat
.data
source byte "This is the source string", 0
.code
_main proc
mov esi, offset source ; load up start pointer.
mov edi, offset source ; set end pointer by finding zero byte.
dec edi
find_end:
inc edi ; advance end pointer.
mov al, [edi] ; look for end of string.
cmp al, 0
jnz find_end ; no, keep looking.
dec edi ; yes, adjust to last character.
swap_loop:
cmp esi, edi ; if start >= end, then we are finished.
jge finished
mov bl, [esi] ; swap over start and end characters.
mov al, [edi]
mov [esi], al
mov [edi], bl
inc esi ; move pointers toward each other and continue.
dec edi
jmp swap_loop
finished:
int 3 ; trap to enter debugger and check string.
; replace with whatever you need.
_main endp
end _main