2.3. Демонстрация результата
Запускаем программу, выполнив

CMD>> pract2.com
Введя строку "a lot of people are rich. But the rich aren`t always happy" получаем ожи-
даемый результат (Рис. 2.1)
Рис. 2.1. Создание .com файла.
3. Зачетное задание
Ввести с клавиатуры две строки. Указать те символы, которые есть и в первой и во второй строке и которых нет в этих строках и сформировать одну строку из совпадаю-
щих, а вторую из несовпадающих символов введенных строк.
Реализуем:
CODE SEGMENT
ASSUME CS:CODE, DS:CODE, SS:CODE
ORG 100h
START:
; Ввод строк
LEA DX, STR1
CALL OUTPUT
LEA DX, STRING1
CALL INPUT
CALL NEXTLINE
LEA DX, STR2
CALL OUTPUT
LEA DX, STRING2
CALL INPUT
6
CALL NEXTLINE
STRING1:
MOV CL, [STRING1+1] ; получаем размер буффера
CMP CL, 0  | 
	
  | 
	; Проверяем, что не введена нулевая строка  | 
JE STRING2  | 
	
  | 
	
  | 
LEA SI, STRING1+2  | 
	
  | 
|
ITER1:  | 
	
  | 
	
  | 
MOV BL, [SI]  | 
	;  | 
	Получаем код символа  | 
SUB BL, 'A'  | 
	;  | 
	Высчитываем индекс в массиве  | 
CMP BL, 0  | 
	;  | 
	Проверям, что симол − латинская буква  | 
JL LOOPS1  | 
	
  | 
	
  | 
CMP BL, 57  | 
	
  | 
	
  | 
  | 
	
  | 
	
  | 
JG LOOPS1
MOV [ASCII+BX], BYTE PTR 1 ; Записываем единицу в индекс данного символа
LOOPS1:
INC SI
LOOP ITER1
STRING2:
MOV CL, [STRING2+1]
CMP CL, 0
JE CHARSSTART
LEA SI, STRING2+2
ITER2:
MOV BL, [SI]  | 
	;  | 
	Получаем код символа  | 
SUB BL, 'A'  | 
	;  | 
	Высчитываем индекс в массиве  | 
CMP BL, 0  | 
	;  | 
	Проверям, что симол − латинская буква  | 
JL LOOPS2  | 
	
  | 
	
  | 
CMP BL, 57  | 
	
  | 
	
  | 
JG LOOPS2  | 
	
  | 
	
  | 
MOV DL, [ASCII+BX]  | 
	;  | 
	Смотрим на значение в массиве  | 
CMP DL, 0  | 
	; Если символа не было в первой строке  | 
|
JE SINGLE  | 
	
  | 
	
  | 
CMP DL, 1  | 
	; Если символ был в первой строке  | 
|
7
JE DOUBLE
JMP LOOPS2
SINGLE:
MOV  | 
	[ASCII+BX], 2  | 
	
  | 
	
  | 
JMP LOOPS2  | 
	
  | 
	
  | 
|
DOUBLE:  | 
	
  | 
	
  | 
	
  | 
MOV [ASCII+BX], 3  | 
	
  | 
	
  | 
|
JMP LOOPS2  | 
	
  | 
	
  | 
|
LOOPS2:  | 
	
  | 
	
  | 
	
  | 
INC SI  | 
	
  | 
	
  | 
|
LOOP ITER2  | 
	
  | 
	
  | 
|
CHARSSTART:  | 
	
  | 
	
  | 
|
LEA SI, ASCII  | 
	
  | 
	
  | 
|
LEA DI, OUTCOMM  | 
	
  | 
	
  | 
|
LEA BX, OUTDIFF  | 
	
  | 
	
  | 
|
MOV CX, 58  | 
	
  | 
	
  | 
|
CHARSITER:  | 
	
  | 
	
  | 
|
MOV AL, [SI]  | 
	
  | 
	
  | 
|
MOV DX, SI  | 
	
  | 
	
  | 
|
SUB DX, OFFSET ASCII  | 
	;  | 
	Высчитываем ascii код символа по индексу  | 
|
ADD DX, 'A'  | 
	
  | 
	
  | 
|
CMP AL, 3  | 
	;  | 
	Был в обоих  | 
|
JE BOTH  | 
	
  | 
	
  | 
|
CMP AL, 0  | 
	; Был только в одном  | 
||
JNE EITHER  | 
	
  | 
	
  | 
|
JMP LOOPCHAR  | 
	; Символ не встретился  | 
||
BOTH:  | 
	
  | 
	
  | 
	
  | 
  | 
	
  | 
	
  | 
	
  | 
MOV [DI], DX
INC DI
JMP LOOPCHAR
EITHER:
MOV [BX], DX
INC BX
8
LOOPCHAR:
INC SI
LOOP CHARSITER
LEA DX, COMMONCH
CALL OUTPUT
LEA DX, OUTCOMM
CALL OUTPUT
CALL NEXTLINE
LEA DX, DIFFERRENTCH
CALL OUTPUT
LEA DX, OUTDIFF
CALL OUTPUT
CALL NEXTLINE
EXIT:
MOV AH, 4CH
INT 21H
INPUT: ; Ввод
MOV AH, 0AH
INT 21h
RET
OUTPUT: ; Вывод
MOV AH, 09H
INT 21H
RET
NEXTLINE: ; переход на следующую строку
MOV AH, 02H
MOV DL, 10
INT 21h
RET
STRING1 DB 128, 128 DUP('$')
9
STRING2 DB 128, 128 DUP('$')
OUTCOMM DB, 128, 128 DUP('$')
OUTDIFF DB, 128, 128 DUP('$')
ASCII DB 58 DUP(0)
STR1 DB 'First string: $'
STR2 DB 'Second string: $'
COMMONCH DB 'Common: $'
DIFFERRENTCH DB 'Different: $'
CODE ENDS
END START
Ниже приведены примеры работы программы:
Рис. 3.1
Рис. 3.2
10
