model SMALL stack 100h dataseg AskS db 0Ah 0Dh STR AskN db 0Ah 0Dh NEA

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
model SMALL
stack 100h
dataseg
AskS db 0Ah,0Dh,'STR:','$'
AskN db 0Ah,0Dh,'NEAD:','$'
InsertSTR db 0Ah,0Dh,'FOUND INSERTION:','$'
EMPTYSTR db 0Ah, 0Dh, '$'
ESTR db 80, ?, 82 dup( ? ) ; буфер ввода строки 1
NEAD db 80, ?, 82 dup( ? ) ; буфер ввода
RESSTR db 5 dup (?),'$' ; буфер ввода
found db ?
needlen db ?
where db ?
seek db ?
col db ?
codeseg
startupcode
BEGIN:
;Ввод строк
call inputstrings
;Обработка
xor AX, AX
xor BX, BX
xor CX, CX
xor DX, DX
lea SI, ESTR+2 ;адрес начала введенной строки
lea DI, NEAD+2 ;адрес начала введенной строки
mov AL, ESTR+1 ;кол-во введенных символов строки
mov BL, NEAD+1 ;кол-во введенных символов строки
mov needlen, bl
mov cl, al
mov where, 0
mov seek, 0
mov col, 0
compare:
push cx
call find
pop cx
cmp found, 0
je mark
mov al, cl
sub al, where
add seek,al
sub cl, al
inc col
call printins
mark:
inc si
inc seek
loop compare
push ax
xor ax, ax
add al, col
call putnum
pop ax
QUIT: exitcode 0
find proc
mov ax , @data
mov es, ax
mov ds, ax
fnc:
push cx
mov where, cl
mov cl, needlen
cld
push si
push di
repe cmpsb
pop di
pop si
jne pos ; не нашли
; забираем наше добро обратно
pop cx
mov found, 1
jmp endfind ; нашли, выходим
pos: ; таки не нашли
pop cx
inc si ; немного продвигаемся по исходной строке
loop fnc
mov found, 0 ; из цикла вышли, а строченьки нет :(
endfind:
ret 0
find endp
putnum proc near
push ax
push bx
push cx
push dx
push si
push di
std
lea di, RESSTR
; Начинаем перевод числа AX в строку
mov cx,10 ; Задаемся делителем CX = 10
Repeat:
xor dx,dx ; Обнуляем DX (для деления)
div cx ; Делим DX:AX на CX (10),
; Получаем в AX частное, в DX остаток
xchg ax,dx ; Меняем их местами (нас интересует остаток)
add al,'0' ; Получаем в AL символ десятичной цифры
stosb ; И записываем ее в строку
xchg ax,dx ; Восстанавливаем AX (частное)
or ax,ax ; Сравниваем AX с 0
jne Repeat ; Если не ноль, то повторяем
; Теперь осталось вывести строку на экран
mov ah,9
lea dx,[di+1] ; Заносим в DX адрес начала строки
int 21h ; Выводим ее на экран
lea DX, EMPTYSTR
mov AH, 09h
int 21h
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret 0
putnum endp
printins proc near
push ax
push dx
lea DX, InsertSTR
mov AH, 09h
int 21h
xor ax, ax
add al, seek
call putnum
pop dx
pop ax
ret 0
printins endp
inputstrings proc near
lea DX, AskS
mov AH, 09h
int 21h
lea DX, ESTR
mov AH, 0Ah
int 21h
lea DX, EMPTYSTR
mov AH, 09h
int 21h
lea DX, AskN
mov AH, 09h
int 21h
lea DX, NEAD
mov AH, 0Ah
int 21h
lea DX, EMPTYSTR
mov AH, 09h
int 21h
ret 0
inputstrings endp
end