BAULA1 (1110624), страница 6

Файл №1110624 BAULA1 (Лекции Баулы) 6 страницаBAULA1 (1110624) страница 62019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Обратите внимание, что локальные переменные в стековом кадре не имеют имён, что может быть не совсем удобно. В нашем примере мы присвоили локальной переменной имя S при помощи директивы эквивалентности

S equ word ptr [bp-8]

И теперь всюду вместо имени S Ассемблер будет подставлять выражение word ptr [bp-8], которое имеет, как нам и нужно, тип слова. Для порождение этой локальной переменной мы отвели ей место в стеке с помощью команды

sub sp,2; порождение локальной переменной

т.е. просто уменьшили значение регистра-указателя вершины стека на два байта. Этой же цели можно было бы достичь, например, более короткой (но менее понятной для нашей цели) командой

push ax; порождение локальной переменной

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

add sp,2; уничтожение локальной переменной

мы уничтожили локальную переменную, затем восстановили из стека старые значения регистров cx, bx и bp (заметьте, что регистр bp нам больше не понадобится в нашей функции). И, наконец, команда возврата

ret 2*2; возврат с очисткой стека

удаляет из стека адрес возврата и значение двух слов – фактических параметров функции. Унич­тожение стекового кадра завершено.

Продолжение изучения стандартных соглашений о связях мы начнём со следующего замечания. В различных системах программирования стандартные соглашения о связях могут несколько различаться. Например, результат значения функции может возвращаться не на регистре ax, как в нашем последнем примере, а на вершине стека. В этом случае функция должна запоминать и восстанавливать регистр ax наравне с другими регистрами, а полное разрушение стекового кадра будет производить основная программа путем чтения результата работы функции из стека.

Важной особенностью использования стандартных соглашений о связях является и то, что они позволяют производить рекурсивный вызов процедур и функций, причём рекурсивный и не рекурсивный вызовы "по внешнему виду" не отличаются друг от друга. В качестве примера рассмотрим реализацию функции вычисления факториала от неотрицательного целого числа, при этом будем предполагать, что значение факториала поместится в слово. На языке Турбо-Паскаль эта функция имеет следующий вид:

Function Factorial(N: word): word;

Begin

if N<=1 then Factorial:=1

else Factorial:=N*Factorial(N-1)

End;

Реализуем теперь эту функцию в виде близкой процедуры на Ассемблере:

Factorial proc near; стандартные соглашение о связях

push bp

mov bp,sp; база стекового кадра

push dx

N equ word ptr [bp+4]; фактический параметр N

mov ax,1; Factorial(N<=1)

cmp N,1

jbe Vozv

mov ax,N

dec ax; N-1

push ax

call Factorial; Рекурсия

mul N; Factorial(N-1)*N

Vozv: pop dx

pop bp

ret 2

Factorial endp

Начало стека SS 

Вершина стека SP 

Начало второго кадра 

Конец первого кадра 

Начало первого кадра 

Значение регистра dx

Значение регистра bp

Адрес возврата

N=4

Значение регистра dx

Значение регистра bp

Адрес возврата

N=5

Рис. 7.4. Два стековых кадра функции Factorial.

Рассмотрим вызов этой функции Factorial для вычисления факториала числа 5. Такой вызов можно в основной программе сделать, например, следующими командами:

mov ax,5

push ax

call Factorial

outword ax

На рис. 7.4 показан вид стека, когда произведён первый рекурсивный вызов функции, в стеке при этом два стековых кадра.

В качестве ещё одного примера рассмотрим реализацию с помощью процедуры следующего алгоритма: задана константа N=30000, найти скалярное произведение двух массивов, содержащих по N беззнаковых целых чисел.

На языке Паскаль это можно записать, например, следующим образом: 1

Const N=30000;

Type Mas = array[1..N] of word;

Var A,B: Mas; S: word;

Procedure SPR(var X,Y: Mas; N: integer; var Scal: word);

Var i: integer;

Begin Scal:=0; for i:=1 to N do Scal:=Scal+X[i]*Y[i] end;

Перед реализацией этой процедуры SPR на Ассемблере (со стандартными соглашениями о связях) необходимо решить следующие вопросы. Во-первых, сделаем нашу процедуру дальней, чтобы она могла располагаться в любом сегменте памяти нашей программы. Во-вторых, массивы A и B оба не поместятся в один сегмент данных, поэтому нам придётся описать два сегмента данных и поместить в один из них массив A, а в другой сегмент – массив B:

N equ 30000

D1 segment

A dw N dup (?)

S dw ?

D1 ends

D2 segment

B dw N dup (?)

D2 ends

При передаче таких массивов по ссылке нам придётся заносить в стек дальний адрес каждого массива в виде двух чисел <сегмент,смещение>. То же самое придётся делать и для передавае­мой по ссылке переменной S, куда будет помещаться вычисленное значение скалярного произ­ведения. Далее надо решить, как информировать обратившуюся к процедуре основную программу о том, что скалярное произведение не может быть получено правильно, так как не помещается в переменную S. Давайте, например, выделим значение 216-1 (это знаковое число –1) для случая переполнения результата. Эта проблема является типичной в практике программирования: желательно, чтобы каждая процедура и функция выдавали код возврата, который показывает, правильно ли завершилась работа. Таким образом, значение –1 свидетельствует об ошибке, а все остальные значения переменной S будут означать правильное завершение работы нашей процедуры (т.е. правильное значение скалярного произведение, равное 216-1 мы тоже, к сожалению, объявим ошибочным).

Напишем теперь фрагмент программы для вызова процедуры скалярного произведения:

mov ax,D1

push ax

mov ax,offset A

push ax; Полный адрес массива A

mov ax,D2

push ax

mov ax,offset B

push ax; Полный адрес массива B

mov ax,N

push ax; Длина массивов

mov ax,D1

push ax

mov ax,offset S

push ax; Полный адрес S

call SPR

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

Вершина стека SP 

Начало стекового кадра 

IP адреса возврата

CS адреса возврата

Адрес S в D1

Адрес сегмента D1

Число элементов N

Адрес массива B в D2

Адрес сегмента D2

Адрес массива A в D1

Начало стекового кадра 

Адрес сегмента D1

Рис. 7.5. Стековый кадр при входе в процедуру скалярного произведения.

Теперь опишем нашу дальнюю процедуру:

SPR proc far

push bp; база стекового

mov bp,sp; кадра

; сохранение остальных регистров

push ds

push es

.186

pusha ;в стек ax,cx,dx,bx,sp,bp,si,di

sub bx,bx; локальная сумма

mov cx,[bp+10]; Выбор N

mov ds,[bp+18]; Сегмент D1

mov si,[bp+16]; Адрес A

mov es,[bp+14]; Сегмент D2

mov di,[bp+12]; Адрес B

L: mov ax,[si]; A[i]

mul word ptr es:[di]; A[i]*B[i]

jc Err; при переполнении

add bx,ax

jc Err; при переполнении

add di,2

add si,2

loop L

Vozv: mov ds,[bp+8]; Сегмент D1

mov si,[bp+6]; Адрес S

mov [si],bx; Результат в S

; восстановление регистров

popa ;из стека ax,cx,dx,bx,sp,bp,si,di

pop es

pop ds

pop bp

ret 2*7; Очистка 7 слов из стека

Err: mov bx,-1;Код ошибки

jmp Vozv

SPR endp

В этом примере для экономии текста программы мы использовали команды pusha и popa из языка команд старшей модели нашего семейства ЭВМ, о чём предупредили Ассемблер директивой .186 .

На этом мы закончим изучение процедур в языке Ассемблера.

8. Система прерываний.

Далее мы продолжим изучение переходов. Как мы уже упоминали, некоторые переходы произ­водятся не при выполнении команд, а могут делаться центральным процессором автоматически при возникновении определённых условий. Если компьютер обладает такими способностями, то говорят, что в этом компьютере реализована система прерываний. Все современные компьютеры имеют систему прерываний, и сейчас мы начнём изучать, что это такое.

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

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

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

Сначала надо сказать, что центральный процессор "смотрит", пришел ли сигнал прерывания, только после выполнения очередной команды, таким образом, этот сигнал ждёт завершения текущей команды.1 Исключением из этого правила являются команды halt и wait. Команда halt останавливает выборку команд центральным процессором, и только сигнал прерывания может вывести компьютер из этого "ничегонеделания". Команда wait в младшей модели нашего семейства ждёт окончания операции с вещественными числами, которые мы не рассматриваем. Кроме того, прерывание не возникает после выполнения команды-префикса программного сегмента, т.к. она существенно влияет на следующую за ней команду.

К описанному выше правилу начала аппаратной реакции на сигнал прерывания необходимо сделать существенное замечание. Дело в том, что большинство современных ЭВМ отступают от принципа фон Неймана последовательного выполнения команд. Напоминаем, что согласно этому принципу очередная команда начинала выполняться только после полного завершения текущей команды.

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

Итак, после окончания текущей команды центральный процессор анализирует номер сигнала прерывания (для нашего компьютера это целое беззнаковое число формата i8). Для некоторых из этих номеров сигнал прерывания игнорируется, и центральный процессор переходит к выполнению следующей команды программы. Говорят, что прерывания с такими номерами в данный момент запрещены или замаскированы. Для компьютера нашей архитектуры можно замаскировать некоторые прерывания от внешних устройств (кроме прерывания с номером 2), установив в ноль значение специального флага прерывания IF в регистре флагов FLAGS (это можно выполнить командой cli ). Для компьютеров некоторых других архитектур можно замаскировать каждое прерывание по отдельности, установив в ноль соответствующий этому прерыванию бит в специальном регистре маски прерываний. Говорят, что прерывания с определёнными номерами можно закрывать (маскировать) и открывать (разрешать, снимать с них маску).

В том случае, если прерывание игнорируется (замаскировано), сигнал прерывания, тем не менее, продолжает оставаться на входе соответствующей схемы центрального процессора до тех пор, пока маскирование этого сигнала не будет снято, или же на вход центрального процессора придёт следую­щий сигнал прерывания. В последнем случае первый сигнал безвозвратно теряется, что может быть очень опасно, так как мы не прореагировали должным образом на некоторое событие, и оно прошло для нас незамеченным. Отсюда следует, что маскировать сигналы прерываний от внешних устройств можно только на некоторое весьма короткое время, после чего необходимо открыть возможность реакции на такие прерывания.

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

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

Список файлов лекций

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