- •Министерство образования и науки
- •Содержание
- •Цель и задачи контрольной работы
- •2. Содержание и выбор варианта задания
- •Задания к контрольной работе Задание №1.
- •Задание №2.
- •4. Методические указания к выполнению практических заданий Задание 1. Управление циклом по счетчику.
- •Loop l
- •Задание 2. Массивы.
- •Вопросы к зачету по дисциплине
- •Литература
4. Методические указания к выполнению практических заданий Задание 1. Управление циклом по счетчику.
Программа языка ассемблера– это последовательность предложений, каждое из которых записывается в отдельной строке. Переносить предложение на следующую строку или записывать в одной строке два предложения нельзя. Если в предложении более 131 символа, то 132 – ой и все остальные символы игнорируются.
Программа на ассемблере набирается в NortonCommanderилиFarи записывается с расширениемasmв папку, которая должна содержать следующие файлы:dpmiload.exe,dpmiload.dll,io.inc,tasm.exe,tlink.exe. Программа имеет следующую структуру:
MASM
MODEL small // Описание модели памяти
STACK 256 // Описание размера стека
.data // Директива начала описания констант и переменных
.code // Директива начала описания программного кода
.startup // Точка входа в программу
jmp main
include io.inc //Подключение файла с подпрограммами
main:
{Тело программы}
.exit 0 // Директива выхода из программы с указанным кодом
end // Конец описания программы
Например:
Набранная программа с именем p.asmзаписана в папку. На первом этапе ее компановки к файлуtasm.exeподключается файлp.asm, после чего образуется объектный модуль программыp.obj. На втором этапе компановки программы к файлуtlink.exeподключается объектный модуль программыp.obj, после чего образуется файлp.exe, который запускается на выполнение расчета программы. Для просмотра результата вычислений нужно отключить обе панели программыNortoncommanderилиFar.
На практике наиболее часто встречаются циклы с заранее известным числом повторений. Например, пусть некоторую группу команд S (тело цикла) надо повторить N раз (N>0). Тогда на ЯА этот цикл можно реализовать по такой схеме:
MOV CX,N ; CX-счётчик цикла
SS S
Dec CX ; CX:=CX-1
CMP CX,O ;CX=0?
JNE L ;CX<>0Goto L
В ПК введена специальная команда, которая объединяет в себе действие трех последних команд:
Управление циклом по счетчику: LOOP <метка>
Действие этой команды можно описать так:
CX: =CX-1; IF CX0 THEN GOTO <метка>
С помощью команды LOOP наш цикл запишется в следующем виде:
S
L
S
LOOP L
Однако, команда LOOP имеет ряд особенностей:
команда LOOP требует, чтобы в качестве счетчика цикла обязательно использовался регистр CX
начальное значение для CX должно быть занесено до цикла, причем этому регистру надо присвоить ровно столько, сколько должен повторятся цикл (например, нельзя организовать цикл от 3 до 103)
поскольку команда LOOP ставится в конце цикла, тело цикла хотя бы раз обязательно выполнится. Поэтому для случая CX=0 цикл все равно выполнится хотя бы один раз. Поэтому, если возможен вариант CX=0, то тело цикла следует обойти при CX=0 (именно для этих случаев в ПК введена команда JCXR)
MOV CX, N ; N>=0
JCXR L1 ; CX=0 ?L1
L
S
Loop l
L1:
как и команда условного перехода, команда LOOP реализует только короткий переход, поэтому расстояние от нее до начала цикла (метки L) не должно превышать 127 – 128 байт (примерно 30 – 40 команд). Если цикл содержит больше команд, то цикл следует реализовать по-другому.
Например:
3 2
В
i=1 j=1
Программа будет иметь вид:
MASM
MODEL small
STACK 256
.data
B db 3
I db 1
J db ?
.code
.startup
jmp main
include io.inc
main:
MOVCX,3
MOVBH, 0 ; начальное значение суммы
M2:MOVSI,CX; спасаем значение счетчика внешнего цикла
MOVCX,2
MOVAL,1 ; начальное значение произведения
MOV J,1
M1: MOV BL, J
ADD BL, B
MUL BL
INCJ; увеличиваем значениеJна единицу
LOOP M1
ADD BH, I
ADD BH, AL
INCI; увеличиваем значениеIна единицу
MOVCX,SI; восстанавливаем значение счетчика внешнего цикла
LOOP M2
MOV AL, BH
MOV DH, 0
MOV DL, 5
CALL PROCOUTNUM
.exit
end