Работа со строками на ассемблере - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста в написании программы под TASM. Задача: Написать программу выделения из исходной строки подстроки символов заданной длины с указанного номера позиции, Pascal-string. К сожалению со строками в ассемблере работать толком не умею, понятных примеров немного, поэтому прошу вашей помощи!

Решение задачи: «Работа со строками на ассемблере»

textual
Листинг программы
.586
.model flat,stdcall
option casemap:none
include windows.inc
include msvcrt.inc
include kernel32.inc
includelib msvcrt.lib
includelib kernel32.lib
.data
text    db 512 dup (0)  ;вводимый текст
msg     db 'Enter text: ',0
msg2    db 'New text: ',0
.code
;макрос вывода строки на экран
outstr  macro s
    push offset s   ;передать функции адрес строки
    call crt_printf ;вывести строку
    add esp,4       ;скорректировать указатель стека
endm
_start:
    outstr msg      ;вывести приглашение ввести текст
    invoke crt_gets,offset text ;ввод текста
    lea esi,text        ;начало строки
    call replace        ;удалить точкидо первой запятой
    outstr msg2     ;вывести сообщение
    outstr text     ;вывести сообщение
    invoke crt__getch   ;ожидание нажатия любой клавиши
    invoke ExitProcess,0    ;выход
;процедура замены многоточия одной точкой
;esi - адрес строки
replace proc
    mov edi,esi ;адрес строки
lp: lodsb       ;взять очередной символ
    cmp al,' '  ;если не пробел
    jnz save    ;то сохранить
    cmp al,[esi];если не два пробела подряд
    jnz save    ;то сохранить
    inc esi     ;если два пробеда, один пропустить
save:
    stosb       ;сохранить символ
    cmp al,0    ;если это был не конец строки
    jnz lp      ;продолжить работу
    ret         ;выйти из подпрограммы
replace endp
end _start
end

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

  1. .586 - это метаданные, указывающие на модель процессора, используемую в коде.
  2. .model flat,stdcall - это метаданные, указывающие на модель памяти и способ вызова функций в коде.
  3. option casemap:none - это метаданные, указывающие на способ сопоставления регистров в коде.
  4. include windows.inc - это метаданные, которые включают файл с определениями функций Windows API.
  5. include msvcrt.inc - это метаданные, которые включают файл с определениями функций библиотеки MSVCRT.
  6. include kernel32.inc - это метаданные, которые включают файл с определениями функций библиотеки KERNEL32.
  7. includelib msvcrt.lib - это метаданные, которые подключают библиотеку MSVCRT.
  8. includelib kernel32.lib - это метаданные, которые подключают библиотеку KERNEL32.
  9. .data - это секция кода, где хранятся данные, которые должны быть доступны для чтения и записи во время выполнения программы.
  10. text db 512 dup (0) - это определение переменной типа данных строка (db), которая будет использоваться для хранения вводимого текста.
  11. msg db 'Enter text: ',0 - это определение переменной типа данных строка (db), которая будет использоваться для отображения приглашения на ввод текста.
  12. msg2 db 'New text: ',0 - это определение переменной типа данных строка (db), которая будет использоваться для отображения сообщения о замене текста.
  13. _start: - это метка, обозначающая начало выполнения программы.
  14. outstr macro s - это определение макроса, который выводит строку на экран.
  15. invoke crt_gets,offset text - это вызов функции, которая считывает строку из стандартного ввода и сохраняет ее в переменной text.
  16. lea esi,text - это команда, которая устанавливает переменную esi в качестве указателя на начало строки text.
  17. call replace - это вызов процедуры, которая заменяет все многоточия в строке на одну точку.
  18. outstr msg2 - это вызов макроса, который выводит на экран сообщение New text:.
  19. outstr text - это вызов макроса, который выводит на экран строку text.
  20. invoke crt__getch - это вызов функции, которая ожидает нажатия любой клавиши пользователем.
  21. invoke ExitProcess,0 - это вызов функции, которая завершает работу программы.

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


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

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

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