Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KpiYap.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
117.51 Кб
Скачать

52. Определить, входит ли в строку, определенную в сегменте данных, подстрока, введенная с клавиатуры. Результат работы программы – текст соответствующего сообщения.

.MODEL small

.STACK 100h

.DATA

msg1 DB "Enter string: $"

msg2 DB 0Ah, 0Dh, "Enter substring to find: $"

msg3 DB 0Ah, 0Dh, "Yes!$"

msg4 DB 0Ah, 0Dh, "No such substring:($"

str1ml DB 200

str1l DB '$'

str1 DB 200 dup('$')

str2ml DB 200

str2l DB '$'

str2 DB 200 dup('$')

.CODE

begin:

mov ax, @data

mov ds, ax

mov es,ax

xor ax,ax

lea dx, msg1 ;вывод приглашения msg1

call strout

lea dx, str1ml ;ввод строки str1

call strin

lea dx, msg2 ;вывод приглашения msg2

call strout

lea dx, str2ml ;ввод строки str2

call strin

xor cx, cx

mov cl, str1l ;устанавливается кол-во повторений

sub cl, str2l

inc cl

cld ;обход вперёд

lea di, str2 ;в di - строка, которую надо найти

lea si, str1 ;в si - строка, в которой ищем

xor ax, ax

all_string: ;повторяется для str1 до конца строки минус длина str2

push cx

push di

push si

mov bx, si

mov cl, str2l

repe cmpsb

je _eq

jne _neq

_eq:

lea dx, msg3 ;вывод приглашения msg1

call strout

jmp _end

;inc al

_neq:

pop si

pop di

pop cx

inc si

loop all_string

lea dx, msg4

call strout

_end:

mov ah, 4ch ;канэц, просто канэц какой-та

int 21h

;*****************Процедуры***********************

;*************************************************

strin proc

mov ah, 0Ah

int 21h

ret

strin endp

;*************************************************

strout proc

mov ah, 09h

int 21h

ret

strout endp

;*************************************************

end begin

53. Выполнить реверс слов строки, определенной в сегменте данных (кода). Результат вывести.

; reverse string

name "reverse"

org 100h

jmp start

string1 db 255 dup('$')

newstr db 0ah, 0dh, '$'

instr db "enter string:",0Dh,0Ah,'$'

start: mov dx,offset instr ;instruction

mov ah,09h

int 21h

mov bx,offset string1 ;vvod

mov [bx],255

mov dx, bx

mov ah,0Ah

int 21h

add bl, string1[1]

add bx, 2

mov [bx],'$'

xor dx,dx

xor ax,ax

lea bx, string1

add bx, 2

mov si, bx

mov di, bx

dec si

next_byte: inc si ;prohod po stroke

mov al,[si]

cmp al,' '

je found_the_end

mov al, [si]

cmp al,'$'

je found_the_end

jmp next_byte

found_the_end: mov dx,si ;naiden probel ili $

dec si

mov bx, di

do_reverse: cmp bx, si ;inversia slova

jae done

mov al, [bx]

mov ah, [si]

mov [si], al

mov [bx], ah

inc bx

dec si

jmp do_reverse

done: mov si,dx ;rezult

inc dx

mov bx,dx

mov di,bx

mov al,[si]

mov dx, offset newstr

mov ah, 09h

int 21h

mov dx,offset string1

add dx,2

mov ah, 09h

int 21h

mov ah,[si]

cmp ah,'$'

jne next_byte

mov ah, 0

int 16h

ret

.model small ;размер блока памяти (тут для ехе-программы)

.stack 100h ;для данных и стека

.data ;сегмент данных

msg1 db 0Ah,0Dh,"Enter string :",0Ah,0Dh,'$'

string db 80 dup(?) ;неинециализированная переменная

msg2 db 0Ah,0Dh,"Reversed string:",0Ah,0Dh,'$'

.code ;сегмент кода

start: ;начало куска старт

mov ax,@data ;адрес начала сегмента данных

mov ds,ax ;

lea dx,msg1

mov ah,09h

int 21h ;вызов дос-прерывания

vvod:

mov ah,01h

int 21h

cmp al,0Dh ;сравнение

je body ;и если символ равен вводу, то дальнейшее перенаправление

mov string[si],al ;заносим символы в строку

inc si ;si++

loop vvod ;повторять блок vvod

body:

mov ah,09h

lea dx,msg2 ;копирование адресса

int 21h ;вывод текста оформления

cmp si,0

je exit

mov di,si ;создание третьего счётчика(si - второй, cx - конечно первый, но он тут неиспользуется ввиду того что он начинает изменяться в любом цикле, а тут алгоритм сложнее

revers: ;функция для перемещения по строке

dec si ;si--

mov bp,si

cmp string[si], ' ' ;сравнение для нахождения пробела между словами

je funk

cmp si,0 ;проверка второго счётчика на конец строки

je funk3

loop revers

mov dl,string[0] ;допись последнего символа

mov ah,02h

int 21h

funk: ;функция для вывода слова

inc bp

mov dl,string[bp]

mov ah,02h

int 21h

cmp bp,di

je funk2

loop funk

funk2: ;функция для изменения di и дальнейшего направления в revers

mov di,si

je revers

funk3: ;функция для вывода первого слова перед которым нет пробела

mov dl,string[bp]

mov ah,02h

int 21h

cmp bp,di

je exit

inc bp

loop funk3

exit:

mov ah,4Ch ;копирование для конца проги

int 21h ;вызов дос-прерывания

end start ;собственно сам конец проги

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]