Проверить вхождение каждого символа строки 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. Строка 1 и строка 2 зарезервированы в памяти с помощью директивы .db, где 200 - это максимальная длина строк.
  2. Длина строки 1 хранится в переменной len_s1, а длина строки 2 - в переменной len_s2.
  3. Строки 1 и 2 вводятся с помощью макроса print, который сначала помещает в стек значения регистров, затем выполняет функцию DOS для ввода строки и восстанавливает из стека все регистры общего назначения.
  4. После ввода строк выполняется проверка исходных данных: если строки нулевой длины, то программа выводит сообщение об ошибке и завершается.
  5. Для обработки строк используется цикл, который начинается с метки ForI. В этом цикле происходит сравнение каждого символа строки 1 с каждым символом строки 2. Если символ найден, то его порядковый номер сохраняется в переменной SI.
  6. Если символ не найден, то в переменной MissingChar сохраняется его код в шестнадцатеричной системе счисления, после чего выводится сообщение об ошибке.
  7. Если все символы строки 1 найдены в строке 2, то программа продолжает работу с следующей парой символов.
  8. Если все символы строки 1 не найдены в строке 2, то программа завершается после вывода сообщения об ошибке.
  9. Функция Show_AX выводит беззнаковое 16-разрядное число из регистра AX на экран.
  10. Для этого число разбивается на отдельные цифры, которые затем выводятся на экран с помощью функции DOS для вывода символов.

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


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

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

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