Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Баула В.Г. -> "Введение в архитектуру ЭВМ и системы программирования" -> 29

Введение в архитектуру ЭВМ и системы программирования - Баула В.Г.

Баула В.Г. Введение в архитектуру ЭВМ и системы программирования — Москва, 2003. — 144 c.
Скачать (прямая ссылка): vvedenievarhetekturuevm2003.pdf
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 86 >> Следующая


машины. Ещё раз напоминаем, что команды циклов не меняют флагов.

Описанная выше команда цикла выполняет тело цикла ровно N раз, где N - беззнаковое число, занесённое в регистр-счётчик цикла CX перед началом цикла. К сожалению, никакой другой регистр нельзя использовать для этой цели (т.к. это неявный параметр команды цикла). Кроме того, в приведённом выше примере реализации цикла тело этого не может быть слишком большим, иначе команда loop L не сможет передать управление на метку L.

В качестве примера использования команды цикла решим следующую задачу. Требуется ввести беззнаковое число N<=5 00, затем ввести N знаковых целых чисел и вывести сумму тех из них, которые принадлежат диапазону -2000..5000. Можно предложить следующее решение этой задачи.

include io.asm

; файл с макроопределениями для макрокоманд ввода-вывода

data segment
N dw ?
S dw 0; Начальное значение суммы = 0
T1 db 'Введите N<=500 $'
T2 db 'Ошибка - большое N!$'
T3 db 'Вводите целые числа',10,13,
T4 db 'Ошибка - большая сумма!$' 50

data ends

stack segment stack

dw 64 dup (?) stack ends code segment

assume cs:code,ds:data,ss:stack start:mov ax,data mov ds, ax

mov dx, offset T1; Приглашение к вводу

outstr

inint N

cmp N,500

jbe L1

mov dx, offset T2; Диагностика от ошибке Err: outstr newline finish

L1: mov cx,N; Счётчик цикла

jcxz Pech; На печать результата

mov dx,offset T3; Приглашение к вводу

outstr

newline

L2: inint ax; Ввод очередного числа cmp ax,-2000 jl L3

cmp ax,5000

jg L3; Проверка диапазона add S,ax; Суммирование jno L3; Проверка на переполнение S mov dx,offset T4 jmp Err L3: loop L2 Pech: outch 'S' outch ' =' outint S newline finish code ends

end start

В качестве ещё одного примера рассмотрим использование циклов при обработке массивов. Пусть необходимо составить программу для решения следующей задачи. Задана константа N=2 0 0 00, надо ввести массивы X и Y по N беззнаковых чисел в каждом массиве и вычислить выражение

N

S:=^ X[1] * Y[N -1 +1]

1=1

Для простоты будем предполагать, что каждое из произведений и вся сумма имеют формат dw (помещаются в слово). Ниже приведена программа, решающая эту задачу.

include io.asm

N equ 2 0000; Аналог Const N=2 0000; Паскаля

data1 segment

T1 db 'Вводите числа массива $' T2 db 'Сумма = $'

T3 db 'Ошибка - большое значение! ',10,13, '$' S dw 0; искомая сумма

X dw N dup (?); 2*N байт

data1 ends data2 segment

Y dw N dup (?); 2*N байт 51

L2:

L3:

ds - на начало data1

es - на начало data2

dx, offset T1; Приглашение к вводу

data2 ends st segment stack

dw 64 dup (?) st ends code segment

assume cs:code,ds:data1,es:date2,ss:st begin of program:

mov ax,data1 mov ds, ax; mov ax,data2 mov es,ax; mov outstr outch ' X' newline

mov cx,N; счётчик цикла mov bx,0; индекс массива L1: inint X[bx];ввод очередного элемента X[i] add bx,2; увеличение индекса, это i:=i+1 loop L1

outstr; Приглашение к вводу

outch ' Y'

newline

mov cx,N; счётчик цикла mov bx,0; индекс массива inint ax

mov Y[bx],ax; ввод очередного элемента es:Y[bx] add bx,2; увеличение индекса loop L2

mov bx,offset X; указатель на X[1] mov si,offset Y+2*N-2; указатель на Y[N] mov ax,[bx]; первый сомножитель mul word ptr es:[si]; умножение на Y[N-i+1] jc Err; большое произведение add S, ax

Err; большая сумма bx,type X; это bx:=bx+2 si,2; это i:=i-1 L3; цикл суммирования offset T2

dx,

Err:

code

jc add sub loop mov outstr outword S newline finish mov dx, T 3 outstr finish ends

end begin of program

Подробно прокомментируем эту программа. Количество элементов массивов мы задали,

используя директиву эквивалентности N equ 2 00 00 , это есть указание программе Ассемблера о том, что всюду в программе, где встретится имя N, надо подставить вместо него операнд этой директивы - число 20000. Таким образом, это почти полный аналог описания константы в языке Паскаль.1 Под каждый из массивов директива dw зарезервирует 2*N байт памяти.

1 Если не принимать во внимание то, что константа в Паскале имеет тип, это позволяет контролировать её использование, а в Ассемблере это просто указание о текстовой подстановке вместо имени операнда директивы эквивалентности. 52

Заметим теперь, что оба массива не поместятся в один сегмент данных (в сегменте не более примерно 32 0 00 слов, а у нас в сумме 4 00 00 слов), поэтому массив X мы размещаем в сегменте data1, а массив Y - в сегменте data2. Директива assume говорит, что на начала этих сегментов будут соответственно указывать регистры ds и es, что мы и обеспечили в самом начале программы. При вводе массивов мы использовали индексный регистр bx, в котором находится смещение текущего элемента массива от начала этого массива.

При вводе массива Y мы для учебных целей вместо предложения L2: inint Y[bx];ввод очередного элемента записали два предложения L2: inint ax

mov Y[bx], ax;ввод очередного элемента Это мы сделали, чтобы подчеркнуть: при доступе к элементам массива Y Ассемблер учитывает то, что имя Y описано в сегменте data2 и автоматически (используя информацию из директивы as-
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 86 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.