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

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

Файл №1110549 В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования (В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования) 20 страницаВ.Г. Баула - Введение в архитектуру ЭВМ и системы программирования (1110549) страница 202019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 20)

В качестве примера рассмотрим системный вызов int 21h , который реализует многие операции ввода/вывода. Так, для вывода строки текста на экран в качестве параметров следует передать номер конкретного действия на регистре ah (для вывода строки ah=9) и адрес начала выводимой строки на регистрах ds:dx (строка должна кончаться символом '$'). Исходя из этого на место нашей макрокоманды вывода строки текста

outstr

можно подставить команды

mov ah,9

int 21h

В качестве примера опишем на Ассемблере процедуру, использующую системный вызов. Эта процедура при её вызове выдаёт звуковой сигнал:

Beep proc

push ax

push dx

mov al,7; символ-звуковой сигнал

mov ah,02h; номер функции вывода символа

int 21h; системный вызов

pop dx

pop ax

ret

Beep endp

Можно заметить, что наша процедура Beep при своём вызове выполняет те же действия, что и макрокоманда outch 7 .

В дальнейшем мы познакомимся ещё с одним важным назначением системных вызовов при изучении мультипрограммного режима работы ЭВМ.

Процедуры обработки прерываний реализуют особый стиль программирования, их иногда назы­вают процедурами обратного вызова (call back procedure) или процедурами-демонами. Такая процедура при своей инициализации (размещении в памяти) оставляет в определённом месте адрес своего начала. Далее вызов этой процедуры производится при возникновении соответствующих условий путём (дальнего) косвенного перехода на эту процедуру.

В качестве примера рассмотрим рассчёт платы за междугородний телефонный разговор, при которым за каждую новую минуту разговора к общей сумме прибавляется некоторая величина – тариф за минуту разговора с данным городом. При наступлении льготного времени (обычно ночью и в выходные дни) срабатывает будильник (специальная системная программа-обработчик прерываний от встроенного в ЭВМ таймера), который вызывает процедуру-демона пересчёта всех тарифов. Заметим, что в некоторые языки высокого уровня включены аналогичные возможности, например, в языке С можно писать так называемые функции-реакции на сигналы, о чём Вы узнаете в следующем семестре в курсе "Системное программное обеспечение".

В заключении нашего по необходимости краткого рассмотрения прерываний заметим, что появление в компьютерах системы прерываний было, несомненно, одним из важнейших событий в развитии архитектуры вычислительных машин. Недаром появившиеся компьютеры с системой прерываний стали относить к следующему, третьему поколению ЭВМ. Подробнее об этом можно прочитать в книге [3].

9. Дополнительные возможности Ассемблера.

9.1. Строковые команды.

Сейчас мы рассмотрим последний полезный для понимания архитектуры нашего компьютера формат команд память-память (формат SS). До сих пор для работы с переменными в оперативной памяти мы использовали формат команд регистр-память (или память-регистр), при этом один из аргументов находился на регистре центрального процессора. Это не всегда удобно, если мы не предполагаем больше никаких операций с выбранным на регистр операндом, тогда его пересылка из памяти на регистр оказывается лишним действием.1 Именно для таких случаев и предназначены команды формата память-память. В архитектуре нашего компьютера такие команды относятся к так называемым строковым командам (мы скоро поймём, почему они так называются).

Строковые команды хорошо использовать для обработки элементов массивов. Массивы коротких беззнаковых целых чисел могут трактоваться как строки (цепочки) символов, отсюда и название – строковые или цепочечные команды. При выполнении строковых команда в цикле получается удобный способ обработки массивов, элементами которых являются короткие или длинные целые числа.

Знакомство со строковыми командами начнём с команд пересылки байта (movsb) или слова (movsw) с одного места памяти в другое. Эти команды различаются только битом размера операнда w в коде операции. С битом w мы познакомились при изучении форматов команд регистр-регистр и регистр-память, w=0 для операндов-байтов и w=1 для операндов-слов. Команды movsb и movsw не имеют явных операндов, их оба операнда op1 и op2 формата m8 (для w=0) и m16 (для w=1) заданы неявно (по умолчанию).

Выполнение команд movsb и movsw существенно зависит от так называемого флага направления DF из регистра флагов FLAGS. Для смены значения этого флага можно использовать команды cld (для операции DF:=0), и std (для операции DF:=1). Для более компактного описания правил выполнения команд movsb и movsw введём следующие условные обозначения:

δ = (w+1)*(-1)DF; φ(r16)={ r16 := (r16 + δ)mod 216 }

Как видим, δ может принимать значения ±1 и ±2, а оператор φ меняет величину регистра на значение δ. В этих обозначениях команды movsb и movsw выполняются по правилу:

<es,di> := <ds,si>; φ(di); φ(si)

Таким образом, неявный операнд op1 находится в памяти по адресу, заданному регистровой парой <es,di>, а операнд op2 – по адресу <ds,si>, т.е. операнды находятся в разных сегментах памяти.

Для того чтобы лучше понять логику работы описанных выше команд, рассмотрим задачу пересылки массива целых чисел с одного места оперативной памяти в другое. На языке Паскаль такая задача решается просто, например:

Var A,B: array[1..10000] of integer;

. . .

B := A;

Для языка Турбо-Паскаль, правда, это только частный случай задачи пересылки массива, так как массивы A и B будут располагаться в одном сегменте данных. Более общий случай пересылки массива на Паскале можно реализовать, например для массивов символов, в таком виде:

Const N = 50000;

Type Mas = Array[1..N] of char;

Var A,B: Mas;

. . .

New(A); New(B);

. . .

B := A;

В этом примере динамические переменные (массивы символов, для Ассемблера, как мы знаем, это массивы коротких беззнаковых целых чисел) обязательно будут располагаться в разных сегментах памяти (понять это!). А теперь рассмотрим реализацию похожей задачи пересылки массива из одного места памяти в другое на языке Ассемблер (наши два массива будут не динамическими, а статическими, но так же располагаться в разных сегментах памяти). Сначала опишем два сегмента данных, в которых будут располагаться наши массивы A и B:

N equ 50000

D1 segment

. . .

A db N dup (?)

. . .

D1 ends

D2 segment

. . .

B db N dup (?)

. . .

D2 ends

На начало сегмента D1 установим сегментный регистр ds, а на начало сегмента D2 – сегментный регистр es, тогда фрагмент программы для реализации оператора присваивания B:=A может, например, иметь такой вид:

Code segment

assume cs:Code,ds:D1,es:D2,ss:Stack

Start:mov ax,D1

mov ds,ax

mov ax,D2

mov es,ax

. . .

mov si,offset A

mov di,offset B

mov cx,N

jcxz L1

L: mov al,[si]

mov es:[di],al

inc si

inc di

loop L

L1: . . .

Оценим сложность нашего алгоритма пересылки массива. За единицу измерения примем обмен данными или командами между центральным процессором и оперативной памятью. В нашем случае сложность алгоритма пересылки массива равна 7*N, где N – это длина массива (N чтений элементов массива, N записей в память, 5*N раз считать в цикле команды из памяти в устройство управления).

Как видим, для пересылки целого числа из одного места памяти в другое нам понадобились две команды

mov al,[si]

mov es:[di],al

так как написать одну команду

mov byte ptr[si],es:[di]

нельзя – она требует несуществующего формата команды пересылки mov m8,m8 . Здесь, однако, хорошо подходит наша новая команда пересылки короткого целого числа movsb, с её помощью заключённый в рамку фрагмент программы можно записать в виде:

jcxz L1

cld

L: movsb

loop L

Теперь в нашем цикле пересылки массива осталось всего две команды, следовательно сложность нашего алгоритма снизилась до 4*N операций обмена. Для дальнейшего ускорения выполнения таких циклов в язык машины была включена специальная команда цикла rep, которая называется префиксом повторения. Она похожа на команду loop, но не имеет явного операнда – метки перехода на начало цикла. Эта метка не нужна, так как в теле цикла rep может находиться только одна, непосредственно следующая за ней команда, другими словами, пара команд

rep <строковая команда>

выполняется по схеме

while cx<>0 do begin

dec(cx); <строковая команда>

end;

С использованием этой новой команды цикла заключенный в рамку фрагмент нашей программы пересылки массива можно записать уже совсем кратко в виде:

cld

rep movsb

Заметим, что хотя rep и является служебным словом (кодом операции), но его часто пишут на месте метки (в качестве первого поля предложения Ассемблера), так как служебное слово нельзя спутать с именем, заданным пользователем. Пара команд rep movsb является тесно связанной, они вместе выбираются на регистр команд центрального процессора, так что в цикле пересылки массива нет необходимости обращаться в память за командами. Теперь сложность нашего алгоритма снизилась до теоретического минимума в 2*N операций, т.е. это позволило значительно поднять эффективность пересылки массива.1

Разберёмся теперь с назначением флага направления DF. Отметим сначала, что этот флаг позволяет производить пересылку массива в прямом направлении (от первого элемента к последнему) при значении DF=0 и в обратном направлении (от последнего элемента массива к его первому элементу) при DF=1, отсюда и название флага – флаг направления пересылки массива.

Пересылка массива в обратном направлении – не прихоть программиста, а часто единственный способ правильного присвоения значений массивов. Правда следует сразу сказать, что флаг направления влияет на правильное присваивание одному массиву значения другого массива только в том случае, если эти массивы перекрываются в памяти (т.е. один массив полностью или частично занимает то же место в памяти, что и второй массив). В качестве примера на рис. 9.1 показано два случая перекрытия массивов A и B в памяти. Из этого рисунка видно, что для случая 9.1 а) необходима пересылка в прямом направлении с флагом DF=0, а для случая 9.1 б) правильный результат присваивания массивов получается при обратном направлении пересылки элементов массива с флагом DF=1.

Массив В

Массив А



Массив А

Массив В


. . .



. . .

а). Должно быть DF=0

б). Должно быть DF=1

Рис. 9.1. Два случая перекрытия массивов в памяти при пересылке.

Перекрытие массивов при пересылке часто встречается в практике программирования. Типичным примером является работа текстового редактора, когда при операции вставки и удаления фрагментов текста приходится раздвигать или сжимать редактируемый текст.

Характеристики

Тип файла
Документ
Размер
1,73 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6458
Авторов
на СтудИзбе
304
Средний доход
с одного платного файла
Обучение Подробнее