Строковые инструкции (stos *, lod *, scas *, cmps *) и инструкция цикла устаревшие и медленные (где-то я слышал). Я предпочел бы использовать что-то вроде:
mov esi, start_of_array # esi points to array's begin
mov edi, esi
add edi, length_of_array # and edi to array's end
dec edi # skip terminating null byte
loop:
mov al, [esi] # load the dwords
mov bl, [edi]
mov [edi], al # and save them
mov [esi], bl
inc esi
dec esi
cmp esi, edi # check if we are before in array's middle
jb loop
Это должно слово хорошо. Обратите внимание, что я загружаю eax с тем, что находится в [esi], но сохраняю его в [edi], то же самое для ebx. Конечно, вы должны настроить размер операндов в соответствии с typeof (массив).
EDIT:
если вы хотите что-то быстрее, попробуйте это:
loop:
mov ax, [esi]
mov bx, [edi]
xchg al, ah
xchg bl, bh
mov [esi], bx
mov [edi], ax
add esi, 2
dec edi, 2
cmp esi, edi
jb loop
Это позволяет вам поменять 2 байта за раз, поэтому должен быть в два раза быстрее. Если вам интересно, xchg
, xor swap и the swap занимают 3 такта, так что нет никакого преимущества в их использовании.