Пооптимизируем вместе Код (Text): .data String db "String to reverse",0 lenStr equ (($ - String)-1) .code EntryPoint: call strrev ret ; IN OUT ESI - указывает на строку strrev: xor ecx, ecx ;Ecx=0 xor edx, edx ;Edx=0 mov edx, lenStr ;Ecx=len lea esi, String lea edi, String __1: lodsb ;AL = первый символ cmp ecx, edx jnb __2 mov bl, byte ptr[edi + edx-1] ;BL = последний символ mov byte ptr[esi-1], bl ;Первый символ=Последний символ mov byte ptr[edi + edx-1], al ;Последний символ=Первый символ inc ecx dec edx jmp __1 __2:retn end EntryPoint В Си во встроенных функциях есть strrev(), но вот мой вариант Код (Text): /////////////////////////////////////////////////////////////// // алгоритм следующий: // 1. сохраняем первый символ // 2. перезаписываем первый символ последним // 3. перезаписываем последний символ сохраненным первым /////////////////////////////////////////////////////////////// void x_reverse(char s[]) { // Где i - начало // j - конец // c - символ для сохранения register int i = 0, j = strlen(s) - 1; register char c; for (; i < j; i++, j--) { // 1 c = s[i]; // 2 s[i] = s[j]; // 3 s[j] = c; } }
t00x Спасибо, стыдно канэшна, но незнаю как пользоваться, вот набросок поправь пжлста Код (Text): strrev2: xor ecx, ecx lea esi, String @@: lodsd bswap eax ;mov [esi-dword + ecx], eax ;add ecx, 4 ; [...]
я бы сделал так Код (Text): lea esi, String mov edi, String mov edx, lenStr lea ebx, [esi+edx-1] jmp a e: lodsb xchg [ebx], al stosb dec ebx a: cmp esi, ebx jc e что эквивалентно коду приведенному на си с той лишь разницей, что и счетчик и указатель это одна переменная или сразу по 4 байта, а потом по одному, что останется Код (Text): lea esi, String mov edi, esi mov ebx, edi xor eax, eax ln: cmp al, [ebx] inc ebx jc ln mov ecx, edx shr ecx, 3 jz l1 l0: sub ebx, 4 lodsd bswap eax xchg [ebx], eax bswap eax stosd loop l0 l1: cmp esi, ebx jae l2 lodsb dec ebx xchg [ebx], al stosb jmp l1 l2: