Перевернуть слово - Assembler
Формулировка задачи:
считать с фаила слово и перевернуть его ( пример->ремирп) и записать в фаил. Спасибо.
Решение задачи: «Перевернуть слово»
textual
Листинг программы
include 'win32ax.inc' .data strbuff db "пример" .code start: invoke MessageBox, 0, strbuff, "Original String", MB_OK stdcall StrLen,strbuff stdcall StrRev,strbuff,ecx invoke MessageBox, 0, strbuff, "Reversed", MB_OK invoke ExitProcess, 0 proc StrRev strAddr, strSize push esi push edi mov esi, [strAddr] mov eax, [strSize] lea edi, [esi+eax] cmp eax, 2 jb Label4 cmp eax, 9 jb Label3 Label2: sub edi, 4 mov edx, dword [edi] mov eax, dword [esi] bswap eax bswap edx mov dword [esi], edx mov dword [edi], eax add esi, 4 cmp esi, [edi+8] jb Label2 Label3: sub edi, 1 mov dh, [edi] mov dl, [esi] mov [esi], dh mov [edi], dl add esi, 1 cmp esi, edi jb Label3 Label4: pop edi pop esi ret endp proc StrLen, strInput mov ecx, -1 mov al, 0 mov edi, [strInput] cld repne scasb not ecx dec ecx ret endp .end start
Объяснение кода листинга программы
- Включаем файл 'win32ax.inc'.
- Создаем переменную strbuff типа db и присваиваем ей значение
пример
. - Запускаем процедуру start.
- Вызываем функцию MessageBox, передавая ей дескриптор родительского окна (0), адрес строки (strbuff), текст сообщения
Original String
и тип кнопки (MB_OK). - Вызываем функцию StrLen, передавая ей адрес строки (strbuff).
- Вызываем функцию StrRev, передавая ей адрес строки (strbuff) и размер строки (ecx).
- Вызываем функцию MessageBox, передавая ей дескриптор родительского окна (0), адрес строки (strbuff), текст сообщения
Reversed
и тип кнопки (MB_OK). - Вызываем функцию ExitProcess, передавая ей код завершения процесса (0).
- Внутри процедуры StrRev:
- Перемещаем указатель на начало строки.
- Перемещаем указатель на конец строки.
- Если размер строки меньше 2, переходим к Label4.
- Если размер строки меньше 9, переходим к Label3.
- Если размер строки больше 8, переходим к Label2.
- Если размер строки равен 1, переходим к Label3.
- Если размер строки равен 2, переходим к Label4.
- Перемещаем указатель на предыдущий символ.
- Перемещаем указатель на следующий символ.
- Если указатель на текущий символ больше указателя на предыдущий символ, переходим к Label3.
- Если указатель на текущий символ меньше указателя на предыдущий символ, переходим к Label2.
- Если указатель на текущий символ равен указателю на предыдущий символ, переходим к Label4.
- Возвращаем результат.
- Внутри процедуры StrLen:
- Перемещаем указатель на первый символ строки.
- Перемещаем указатель на последний символ строки.
- Возвращаем результат.
- .end start.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д