Перевернуть слово - 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

Объяснение кода листинга программы

  1. Включаем файл 'win32ax.inc'.
  2. Создаем переменную strbuff типа db и присваиваем ей значение пример.
  3. Запускаем процедуру start.
  4. Вызываем функцию MessageBox, передавая ей дескриптор родительского окна (0), адрес строки (strbuff), текст сообщения Original String и тип кнопки (MB_OK).
  5. Вызываем функцию StrLen, передавая ей адрес строки (strbuff).
  6. Вызываем функцию StrRev, передавая ей адрес строки (strbuff) и размер строки (ecx).
  7. Вызываем функцию MessageBox, передавая ей дескриптор родительского окна (0), адрес строки (strbuff), текст сообщения Reversed и тип кнопки (MB_OK).
  8. Вызываем функцию ExitProcess, передавая ей код завершения процесса (0).
  9. Внутри процедуры StrRev:
    1. Перемещаем указатель на начало строки.
    2. Перемещаем указатель на конец строки.
    3. Если размер строки меньше 2, переходим к Label4.
    4. Если размер строки меньше 9, переходим к Label3.
    5. Если размер строки больше 8, переходим к Label2.
    6. Если размер строки равен 1, переходим к Label3.
    7. Если размер строки равен 2, переходим к Label4.
    8. Перемещаем указатель на предыдущий символ.
    9. Перемещаем указатель на следующий символ.
    10. Если указатель на текущий символ больше указателя на предыдущий символ, переходим к Label3.
    11. Если указатель на текущий символ меньше указателя на предыдущий символ, переходим к Label2.
    12. Если указатель на текущий символ равен указателю на предыдущий символ, переходим к Label4.
    13. Возвращаем результат.
  10. Внутри процедуры StrLen:
    1. Перемещаем указатель на первый символ строки.
    2. Перемещаем указатель на последний символ строки.
    3. Возвращаем результат.
  11. .end start.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы