Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебн пособ по арх и прогр МП.doc
Скачиваний:
64
Добавлен:
10.12.2013
Размер:
1.59 Mб
Скачать

11.2.Создание циклической программы.

Задание: написать программу для обнуления массива байт из 10 элементов.

11.2.1.Составление текста программы.

В любом текстовом редакторе создадим текстовый asm-файл программы (вполне подойдет для этой цели встроенный редактор Norton Commander, вызываемый по клавише F4).

1) Определим сегмент стека.

_STACK SEGMENT PARA STACK 'STACK' ; сегмент стека

DB 32 DUP ('ST') ; стек размером 64 байта (32 повторения 2-х

; символов ST по байту каждый)

_STACK ENDS ; закроем описание сегмента стека _STACK

2) Определим сегмент данных. В сегменте данных должны содержаться все данные, используемые в программе.

_DATA SEGMENT ; сегмент данных

MASS DB 10 DUP (9) ; массив, заполненный 10 константами 9

_DATA ENDS ; закроем описание сегмента данных _DATA

3) Определим сегмент кода. В сегменте кода содержатся сами команды программы.

;запишем описание сегмента кода _CODE

_CODE SEGMENT PUBLIC 'CODE' ; сегмент кода

ASSUME SS:_STACK, CS:_CODE, DS:_DATA ; ассоциируем имена

;сегментных регистров с сегментами нашей программы

OUR_PROG PROC FAR ; описываем нашу программу как процедуру

; OUR_PROG

;помещаем в стек такие начальные значения, чтобы программа

; могла по завершению возвратить управление вызвавшей ее

; программе (например ОС)

PUSH DS ; поместить в регистр номер блока адреса возврата

MOV AX,0 ; обнулить регистр AX

PUSH AX ; поместить в стек нулевое смещение адреса возврата

; инициализируем регистр сегмента данных

MOV AX,_DATA ; загрузка в DS указателя сегмента данных

MOV DS,AX ; через регистр AX

MOV CX,10 ; регистр CX служит счетчиком цикла для команды LOOP

; загрузим в регистр BX смещение в сегменте данных, указывающее

; на первый элемент массива MASS

MOV BX,OFFSET MASS ; загрузка указателей массива MASS в BX

MOV AL,0 ; обнулим регистр AL

; здесь начало цикла:

LP: MOV [BX],AL ; обнуление элемента массива, хранимого по

; указанному адресу, хранимому в регистре BX

INC BX ; увеличение указателя массива на 1

LOOP LP ; команда цикла

RET ; команда возврата из процедуры, она извлекает

; данные, которые мы положили в стек в начале программы

OUR_PROG ENDP ; закрываем описание процедуры OUR_PROG

_CODE ENDS ; закрываем описание сегмента кода _CODE

END OUR_PROG ; закрываем описание программы

11.2.2.Трансляция.

Производится транслятором MASM.EXE или TASM.EXE.

В случае отсутствия ошибок будет создан объектный файл *.obj, который будет являться источником для дальнейшей работы.

11.2.3.Создание исполняемого файла

Производится программами LINK.EXE или TLINK.EXE.

11.2.4.Отладка программы в turbo debugger’е

Для отладки программы ее необходимо загрузить в отладчик TURBO DEBUGGER, где в пошаговом режиме можно проследить работу программы.

11.3. Контрольные вопросы и задания

1.Выберите правильный фрагмент программы сравнения числа без знака 5 с операндом в регистре AX и переход в случае равенства к метке EQAL. Сравнение происходит только по флагу Z:

1) CMP AX, 5 2) CMP 5,AX 3) CMP AX, 5 4) CMP 5,A

JZ EQAL JZ EQAL JNZ EQAL JP EQAL

2.Выберите правильный фрагмент программы с пустым циклом, который выполняется 10 раз (используется в программах как задержка):

1) A: NOP 2) A: MOV CX, 10 3) MOV CX, 10

LOOP A NOP A: NOP LOOP A LOOP A

3.Составте команды для перехода к метке М1 при условии, что содержимое регистра DH больше чем +6.

4.При каком условии происходит переход на метку в команде LOOPZ?

1) Если CX не равен 0, а флажок ZF равен 0;

2) Если CX не равен 1, а флажок ZF равен 1;

3) Если CX не равен 0, а флажок ZF равен 1;

4) Если CX не равен 1, а флажок ZF равен 1;

5.Выберите правильный фрагмент программы с циклом, который выполняется до тех пор, пока переменная VAR не будет равна 0, при этом счетчик CX не должен влиять на цикл:

1) A: DEC VAR 2) A: MOV CX, 10 3) MOV CX, 10

CMP VAR, 0 DEC VAR A: DEC VAR

LOOP A CMP VAR, 0 CMP VAR, 0

LOOPNZ A LOOPNZ A

6.Выберите правильный фрагмент программы сравнения беззнакового числа 5 с операндом в регистре AX и переход в случае неравенства к метке N_EQAL. Сравнение происходит только по флагу Z:

1) CMP AX, 5 2) CMP 5,AX 3) CMP AX, 5 4) CMP 5,AX

JZ N_EQAL JZ N_EQAL JNZ N_EQAL JP N_EQAL

7.Выберите правильный фрагмент программы проверки на наличие переноса из старшего разряда при выполнении сложения. Если перенос был, то происходит переход на метку ERROR:

1) ADD AX, BX 2) ADD AX, BX 3) ADD AX, BX 4) ADD AX, BX

JP ERROR JA ERROR JNA ERROR JC ERROR

8. Составьте команды для перехода к метке М2 при условии, что содержимое регистра СH меньше константы со знаком -6.

11.Выберите правильный фрагмент программы проверки на наличие переноса из старшего разряда при выполнении сложения. Если перенос не был, то происходит переход на метку ERROR:

1) ADD AX, BX 2) ADD AX, BX 3) ADD AX, BX 4) ADD AX, BX

JNC ERROR JA ERROR JNA ERROR JC ERROR

12.При каком условии происходит переход на метку в команде LOOPNE?

1) Если CX не равен 0, а флажок ZF равен 1;

2) Если CX не равен 1, а флажок ZF равен 0;

3) Если CX не равен 0, а флажок ZF равен 0;

4) Если CX не равен 1, а флажок ZF равен 1;