Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; комментарий с указанием:
- ; - фамилии и группы студента
- ; - варианта
- ; - краткой формулировки задания
- .model small ; один сегмент кода, данных и стека
- .stack 100h ; отвести под стек 256 байт
- .data ; начало сегмента данных
- S db 'Hello, world!$'
- S1 db 'a2ql7Hell',0h ;Исходная строка
- S2 db 'g',0h ;Строка, которую мы ищем в исходной строкее
- n1 dw ? ; Длина строки S1
- n2 dw ? ; Длина строки S2
- temp dw ? ; Переменная для хранения начального адреса SI
- .code ; начало сегмента кода
- ; Начальная инициализация
- mov ax,@data
- mov ds,ax ; настройка DS на начало сегмента данных
- ;-------------------------------------------------
- ; Определение длины строки S1
- mov si,0
- lea bx, s1
- cmp byte ptr [bx+si], 0
- jz DoesNot
- LENCYCLE:
- inc si
- cmp byte ptr [bx+si], 0 ;Ищем длину строки S1 сравнивая с нулем
- jnz LENCYCLE ;Если не равна нулю выполняем еще раз цикл
- mov n1,si ;Записываем длину строки S1
- ; Определение длины строки S2
- mov si,0
- lea bx, s2
- LENCYCLE1:
- inc si
- cmp byte ptr [bx+si], 0 ;Аналогичные действия со строкой S2
- jnz LENCYCLE1 ;Если не равна нулю выполняем еще раз цикл
- mov n2,si ; Записываем длину строки S2
- ;-------------------------------------------------
- MOV AX, DS
- MOV ES, AX ;SCAS uses ES:DI, so copy DS to ES
- CLD ;Scan in the forward direction
- LEA SI, S1
- LEA DI, S2 ;Starting address to DI
- mov temp,SI
- DEC SI ;Перед входом в цикл поиска убавляем SI на 1
- mov DX,0
- Search:
- MOV CX,n2 ;Макисмальное количество сравнений равно длине слова S2
- INC SI ;возвращаем стартовый адрес
- Push CX ;записываем в стек данные
- Push SI
- Push Di
- REPZ CMPSB ;выполняем поиск\сравнение
- ;JS Search
- mov BX, CX ;записываем количество сравнение в BX
- POP DI ;восстанавливаем значения из стека
- POP SI
- POP CX
- PUSHF
- SUB CX, BX ;вычитаем количество сравнений из начального адреса
- POPF
- JS Search
- CMP CX, n2 ;сравниваем с длиной второго слова
- JNE Search ;если количество сравнений до первого нуля не равно длине слова, значит не совпали
- JE FOUND ;если совпали то переходим на вывод
- FOUND:
- SUB SI,temp ;вычитаем адрес первого совпавшего символа из начального адреса
- inc SI ;прибавляем 1, потому что отчет идет от 0
- cmp SI,n1
- jng Output
- DoesNot:
- mov SI,0 ;Признак того, что вторая строка не входит в первую
- ;---------------------------------------------------
- Output:
- mov ax,SI;выводится содержимое AX
- xor cx,cx
- mov bx,10
- ;в получаем последнюю цифру числа и запоминаем в стеке
- isDiv:
- xor dx,dx
- div bx
- push dx
- inc cx;считаем количество цифр
- or ax,ax;повторяем пока не 0
- jnz isDiv
- ;выводим число в нужном порядке в цикле
- isOut:
- pop ax
- or al,30h
- int 29h
- loop isOut
- ;--------------------------------------------------
- m2:
- ; Стандартное завершение программы
- mov ax,4C00h ; ah = N функции, al = код возврата
- int 21h ; снять программу с выполнения
- end ; конец текста программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement