Дублирование образца

4.1. Запишите в текстовом редакторе NORTON следующую программу в СОМ-формате(dubl.asm):

.286

TITLE DUBL (COM)

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

BEGIN: JMP MAIN ;Обход через данные

;-------------------------------------------------------

PATTERN DB '***___'

DISAREA DB 42 DUP(?)

;--------------------------------------------------------

MAIN PROC NEAR

CLD

MOV CX,21

LEA DI,DISAREA

LEA SI,PATTERN

REP MOVSW

RET

MAIN ENDP

CODESG ENDS

END BEGIN

В процессе выполнения команда MOVSW сначала пересылает первое слово (**) из образца PATTERN в первое слово области DISAREA, затем второе слово (*_) и третье (__). К этому моменту регистр DI будет содержать адрес DISAREA+6, а регистр SI - PATTERN+6. Затем команда MOVSW автоматически дублирует образец, пересылая первое слово из DISAREA в DISAREA+6, из DISAREA+2 в DISAREA+8, из DISAREA+4 в DISAREA+10 и т.д. до тех пор пока в регистре СХ не установится 0. В результате образец будет полностью продублирован по всей области DISAREA.

4.2. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.

4.3. Вызвать отладчик DEBUG для выполнения программы. Просмотреть сегмент кодов командой отладчика D CS:100 и выполнить трассировку программы до команды RET. Повторить просмотр сегмента кодов командой D CS:100 , объяснить изменения произошедшие в сегменте кодов и записать выводы в отчет.

 

5. Программа: выравнивание справа при выводе на экран.

5.1. Запишите в текстовом редакторе NORTON следующую программу в СОМ-формате(exring.asm):

.286

TITLE EXRING (COM) Выравнивание справа

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG

ORG 100H ;Начало в конце PSP

BEGIN: JMP MAIN ;Обход через данные

;-------------------------------------------------------

NAMEPAR LABEL BYTE ;Имя списка параметров

MAXNLEN DB 31 ;Максимальная длина

ACTNLEN DB ? ;Число введенных символов

NAMEFLD DB 31 DUP(' ') ;Имя

PROMPT DB 'Name?','$'

NAMEDSP DB 31 DUP(' '),13,10,'$'

ROW DB 00

;--------------------------------------------------------

MAIN PROC NEAR ;Основная процедура

MOV AX,0600H

CALL Q10SCR ;Очистить экран

SUB DX,DX

CALL Q20CURS ;Установить курсор в 0

A10LOOP:CALL B10INPT ;Ввести имя

CALL F10CLNM ;Очистить область имени

TEST ACTNLEN,0FFH ;Нет имени? (т.е. конец)

JZ A90 ;Да - выйти

CALL D10SCAS ;Найти звездочку

CMP AL,'*' ;Найдена?

JE A10LOOP ;Да - обойти

CALL E10RGHT ;Выровнять имя справа

CALL A10LOOP

A90: RET

MAIN ENDP

; Вывод запроса для ввода имени

; -----------------------------

B10INPT PROC

MOV AH,09

LEA DX,PROMPT ;Выдать текст запроса

INT 21H

MOV AH,0AH

LEA DX,NAMEPAR

INT 21H

RET

B10INPT ENDP

; Поиск звездочки в имени

; -----------------------

D10SCAS PROC

CLD

MOV AL,'*'

MOV CX,30 ;Длина сканирования 30

LEA DI,NAMEFLD

REPNE SCASB ;Звездочка найдена?

JE D20 ;Да - выйти

MOV AL,20H ;Нет - стереть * в AL

D20: RET

D10SCAS ENDP

; Выравнивание и вывод на экран

; -----------------------------

E10RGHT PROC

STD

SUB CH,CH

MOV CL,ACTNLEN ;Длина в СХ для REP

LEA SI,NAMEFLD

ADD SI,CX ;Вычислить правую позицию

DEC SI ;введенного имени

LEA DI,NAMEDSP+30 ;Правая позиция поля имени

REP MOVSB ;Переслать справа налево

MOV DH,ROW

MOV DL,48

CALL Q20CURS ;Установить курсор

MOV AH,09

LEA DX,NAMEDSP ;Выдать имя

INT 21H

CMP ROW,20 ;Последняя строка?

JAE E20

INC ROW ;Нет - увеличить номер

JMP E90

E20: MOV AX,0601H ;Да - прокрутить

CALL Q10SCR

MOV DH,ROW

MOV DL,00

CALL Q20CURS ;Установить курсор

E90: RET

E10RGHT ENDP

; Очистить область памяти

; -----------------------

F10CLNM PROC

CLD

MOV AX,2020H

MOV CX,15

LEA DI,NAMEDSP

REP STOSW ;Очистить 15 слов

RET

F10CLNM ENDP

; Прокрутка экрана

; ----------------

Q10SCR PROC ;АХ установлен при вызове

MOV BH,30 ;Цвет ( 07 для ч/б)

MOV CX,00

MOV DX,184FH

INT 10H

RET

Q10SCR ENDP

; Установить курсор

; -----------------

Q20CURS PROC ;DX установлен при вызове

MOV AH,02

SUB BH,BH

INT 10H

RET

Q20CURS ENDP

CODESG ENDS

END BEGIN

 

Процедуры данной программы выполняют следующие действия:

B10INPT Принимает имена длиной до 30 символов.

D10SCAS Использует команду SCASB для сканирования имен и обхода любого ввода, содержащего символ *.

E10RGHT Использует команду MOVSB для выравнивания имен по правой границе, выводит имена в колонку в правой части экрана. Длина в поле ACTNLEN из списка параметров ввода используется для вычисления самого правого символа в имени.

F10CLNM Использует команду STOSW для очистки области имени в памяти.

5.2. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.

5.3. Запустить программу из панели NORTON. Просмотреть работу программы. Выводы о работе программы записать в отчет.

СОДЕРЖАНИЕ ОТЧЕТА:

1. Листинги программ.

2. Выводы о работе программ.

КОНТРОЛЬНЫЕ ВОПРОСЫ:

1. Имеются следующие определения: