DATASG SEGMENT PARA ; открыть сегмент данных
MYTEXT DB 'fghijklmPQRSTUWX!' ,13,10, '$' ; переменная длиной в 10 байт
DATASG ENDS ; закрыть сегмент данных
STACKSG SEGMENT 'Stack' ; открыть сегмент стека
DB 12 DUP(?) ; задать стек 12 байт
STACKSG ENDS ; закрыть сегмент стека
CODESG SEGMENT PARA 'Code' ; открыть сегмент кода
BEGIN PROC FAR ; Процедура FAR с названием BEGIN
ASSUME SS:STACKSG, CS:CODESG, DS:DATASG ; Задать соответствия для сегментов
PUSH DS ; поместить в стек данные DS
SUB AX,AX ; AX - AX
PUSH AX ; поместить в стек данные AX
MOV AX, DATASG ; Инициализировать сегментный
MOV DS, AX ; регистр DS
LEA BX, MYTEXT ; Поместить в BX offset переменной
MOV CX, 10H ; CX = 10h ( = размеру переменной)
MT1: MOV AH, [BX] ; Задать метку MT1, AH = адреc BX
CMP AH, 66H ; сравнить (AH) и 66h
JB MT2 ; если (AH) < 66h то перейти к MT2
CMP AH, 7AH ; сравнить (AH) и 7Ah
JA MT2 ; если (AH) > 7Ah то перейти к MT2
CALL COR ; Вызвать процедуру COR
MT2: INC BX ; BX := BX + 1
LOOP MT1 ; CX := CX - 1, если CX > 0, идти к MT1
LEA DX, MYTEXT ; в DX поместить offset MYTEXT
MOV AH, 09H ; вывести на экран MYTEXT
INT 21H ; с помощью DOS
RET ; Завершить программу, и вернуться в DOS
BEGIN ENDP ; Окончание процедуры BEGIN
COR PROC NEAR ; Процедура NEAR с названием COR
NOP ; нет операции
AND AH, 0DFH ; Сместить старший разряд на D, младш. на F
MOV [BX], AH ; Поместить AH, в содержимое BX
RET ; Вернуться
COR ENDP ; Окончание процедуры COR
CODESG ENDS ; Окончание сегмента кода
END BEGIN ; Выход из метки BEGIN
Готовый файл с подробным решением задачи доступен для бесплатного скачивания