

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