Проверить вхождение каждого символа строки 1 в строку 2 - Assembler
Формулировка задачи:
Заданы две строки. Проверить вхождение каждого символа строки 1 в строку 2. Если какой-либо (первый слева) символ строки 1 не представлен в строке 2, то фиксируется номер позиции этого символа в строке 1. Ну и вывод всех зафиксированных позиций.
Решение задачи: «Проверить вхождение каждого символа строки 1 в строку 2»
textual
Листинг программы
model small ;модель памяти .data ;начало сегмента данных String1 db 200 dup (?) ;резервируем память под исходную строку len_s1=$-String1 ;длина строки String2 db 200 dup (?) ;резервируем память под подстроку len_s2=$-String2 ;длина строки 2 ent1 db 'Enter string1:','$' ent2 db 10,13, 'Enter string2:','$' mesEmpty db 10,13, 'Empty string',10,13,'$' mesMismatch db 10,13,'The symbol "' MissingChar db 0, '" at position ', '$' mesMism2 db ' is missing in the String2',10,13,'$' .stack 100h ;сегмент стека assume ds:@data,es:@data ;связывание сегментов данных .code print macro st, off ;макрос вывода строки pusha ;помещает в стек значение регистров mov AH, 09h ;номер функции DOS lea DX, st+off ;загружаем смещение строки и смещение начала вывода int 21h ;прерывание DOS popa ;восстанавливает из стека все регистры общего назначения endm main proc .386 ;режим совместимости (для работы со стеком) mov AX, @data ;настройка сегментных регистров на сегмент данных mov DS, AX mov ES, AX ;ввод строк print ent1,0 ;ввод 1-й строки lea DX, String1 ;загружаем адрес строки mov [String1],len_s1 ;в первый байт строки загружаем максимальную длину строки mov AH, 0Ah ;загружаем номер функции DOS для ввода строки int 21h print ent2, 0 lea DX, String2 ;загружаем адрес строки mov [String2], len_s2 ;в первый байт строки загружаем максимальную длину строки mov AH, 0Ah ;загружаем номер функции DOS для ввода строки int 21h ;обработка строк ;-проверка исходных данных: если строки нулевой длины, то выход mov al, [String1+1] mov ah, [String2+1] cmp al, 1 mov al, 0 sbb al, 0 not al cmp ah, 1 mov ah, 0 sbb ah, 0 not ah and al, ah jnz @@LengthOk print mesEmpty, 0 jmp @@Break @@LengthOk: cld ;сброс флага DF-просмотр строки в порядке увеличения адресов xor CX, CX ;обнуляем сх mov CL, [String1+1] ;записываем в сх количество символов в строке lea BX, [String1+1] ;кладем в di адрес строки mov SI, 1 ;переходим на 2 служебных символа вперед ForI: ;метка-начало mov AL, [BX+SI] push CX lea DI, [String2+2] mov CX, 0 mov CL, [String2+1] repne scasb ;ищем вхождение символа pop CX je found ;если нашли идем на метку found nofound: ;если не нашли mov [MissingChar], AL print mesMismatch, 0 ;выводим сообщение mov AX, SI call Show_AX print mesMism2, 0 found: inc SI loop ForI @@Break: exit: mov AH,4Ch; ;стандартный выход int 21h endp main ; выводит беззнаковое 16-разрядное число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; сохраняем в стеке or ax, ax jnz @@Conv ; выводим из стека на экран @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp end main
Объяснение кода листинга программы
- Строка 1 и строка 2 зарезервированы в памяти с помощью директивы .db, где 200 - это максимальная длина строк.
- Длина строки 1 хранится в переменной len_s1, а длина строки 2 - в переменной len_s2.
- Строки 1 и 2 вводятся с помощью макроса print, который сначала помещает в стек значения регистров, затем выполняет функцию DOS для ввода строки и восстанавливает из стека все регистры общего назначения.
- После ввода строк выполняется проверка исходных данных: если строки нулевой длины, то программа выводит сообщение об ошибке и завершается.
- Для обработки строк используется цикл, который начинается с метки ForI. В этом цикле происходит сравнение каждого символа строки 1 с каждым символом строки 2. Если символ найден, то его порядковый номер сохраняется в переменной SI.
- Если символ не найден, то в переменной MissingChar сохраняется его код в шестнадцатеричной системе счисления, после чего выводится сообщение об ошибке.
- Если все символы строки 1 найдены в строке 2, то программа продолжает работу с следующей парой символов.
- Если все символы строки 1 не найдены в строке 2, то программа завершается после вывода сообщения об ошибке.
- Функция Show_AX выводит беззнаковое 16-разрядное число из регистра AX на экран.
- Для этого число разбивается на отдельные цифры, которые затем выводятся на экран с помощью функции DOS для вывода символов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д