Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие
.pdf
Задание № 2. Составить программу, решающую некоторую за-
∑
дачу. Программа должна уметь обрабатывать знаковые величины.
Варианты задания:
1. Проверить, является ли введенное пользователем число числом
Фибоначчи. Если да, то какой его номер. Числа Фибоначчи вычисляются по формуле
X
= X
n
n–1
+ X
n-2, X1
= X2 = 1.
2. Решить систему линейных уравнений
⎧
⎪
⎨
⎪
⎩
=+
yx
aaa
131211
.
=+
yx
aaa
232221
Коэффициенты вводятся пользователем с клавиатуры. Результат
выводится в виде правильной дроби.
3. Вводятся два числа m и n. Проверить, является ли n целой степе-
нью m: n = m
a
. Если да, то чему равно a?
4. Вычислить факториал числа n, вводимого пользователем.
5. Решить неравенство Ax+B>0. A и B вводятся пользователем.
Вывести результат в виде правильной дроби.
6. Определить, помещается ли прямоугольник со сторонами a и b в
круг с радиусом r. Значения a, b и r вводятся пользователем.
7. Определить объем параллелепипеда со сторонами a, b и c, зада-
ваемыми с клавиатуры.
8. Вычислить значение определителя матрицы с порядками m и n
(0<m<=5, 0<n<=5). Текущие значения m, n и элементы матрицы
вводятся пользователем.
9. Вычислить сумму первых N нечетных членов геометрической про-
грессии X
=A*Qn. Пользователь определяет значения A, Q и N.
n
10. Определить, является ли данное число S суммой ряда
∑
n
2
nn
)(
bxxaxS −==
. Если да, то скольких? Значения n, a
nn
и b вводятся пользователем.
11. Определить площадь кольца, задаваемого двумя концентриче-
скими окружностями с радиусами r и R. Значения радиусов определяются (задаются) пользователем.
12. Вычислить произведение двух матриц с порядками m и n
(0<m<=5, 0<n<=5). Текущие значения m, n и элементы матриц
вводятся пользователем. При выводе результата, кроме полу-
51

ченной матрицы, напечатать также исходные в виде прямоугольных таблиц.
13. Совершенным называется число, равное сумме всех его делите-
лей, например 6=1+2+3 или 28=1+2+4+7+14. Определить, является ли введенное пользователем число таковым. Проверить
числа 496 и 8128.
c
14. Вычислить сумму двух дробей
a
S += . Значения числителей
d
b
и знаменателей вводятся пользователем. Результат представляется в виде правильной дроби.
15. Вычислить площадь цилиндра, радиус которого вводится поль-
зователем. Число π можно представить в виде 314/100. Результат
вывести в виде правильной дроби.
16. Вычислить величину угла правильного n-угольника. Она опре-
деляется формулой β
=1800(n-2)/n. Число углов n задается поль-
n
зователем. Вывести результат в виде правильной дроби.
17. Для совокупности из n целых чисел (0<n<=30) определить сред-
нее значение. Текущие значения n и элементов задаются пользователем. Результат представить в виде правильной дроби.
18. Определить значения максимального и минимального элементов
набора из n целых чисел (0<
n<=30). Вычислить их отношение и
представить в виде правильной дроби. Текущие значения n и
элементов задаются пользователем.
19. Для совокупности из n целых чисел (0<n<=30) определить сред-
неквадратичное отклонение. Текущие значения n и элементов
задаются пользователем. Результат представить в виде правильной дроби.
20. Определить объем тора с внутренним радиусом r
и внешним R.
Значения r и R задаются пользователем. Результат представляется в виде правильной дроби. За число π можно принять отношение 314/100.
Контрольные вопросы
1. Какие команды используются для выполнения операций сложе-
ния и вычитания в процессоре i486? Какие их разновидности
существуют?
52

2. Какие команды используются для выполнения операций умно-
жения и деления в процессоре i486? Какие их разновидности
существуют?
3. Какие форматы существуют для команд умножения, где разме-
щается результат операции?
4. Какие операнды принимают команды деления, где размещается
результат?
5. Что служит источником возникновения ошибок при делении?
Приведите фрагмент кода проверки возможности
появления
ошибки.
6. Как определяется возникновение ошибки в результате выполне-
ния операции сложения или вычитания?
7. Как определяется возникновение ошибки в результате выполне-
ния операции деления?
8. Каким образом представляются знаковые числа в двоичном фор-
мате? Приведите примеры изменения знака для какого-нибудь
значения.
9. При каких условиях возникает переполнение?
10. При каких условиях возникает перенос?
11. Какие существуют разновидности операций сдвига?
12. Объясните, каким образом осуществляется перевод из десятич-
ного, шестнадцатеричного и восьмеричного символьного формата в двоичный.
13. Объясните процедуру перевода значений из двоичного в сим-
вольный десятичный, шестнадцатеричный и восьмеричный
форматы.
14. Объясните, каким образом действуют различные виды
команд
сдвига.
15. Объясните процедуру сложения двух чисел в двоичном формате.
16. Объясните процедуру вычитания двух чисел в двоичном форма-
те.
17. Какой формат имеют команды сдвига?
18. Приведите примеры сложения и вычитания чисел в шестнадца-
теричном формате.
19. Над операндами какой размерности процессор i486 может вы-
полнять арифметические операции?
20.
Опишите использование функций 09H и 0AH прерывания 21H в
MS-DOS.
53

ЛАБОРАТОРНАЯ РАБОТА № 6
СЕГМЕНТНАЯ ОРГАНИЗАЦИЯ ПАМЯТИ.
ПРЕРЫВАНИЯ В РЕАЛЬНОМ РЕЖИМЕ
Цель: изучить способы адресации памяти и реализацию преры-
ваний в реальном режиме микропроцессора i486.
Назначение: познакомить учащихся на практике с применением сегментации памяти при обработке данных, а также с организацией обработчиков и использованием прерываний в прикладных
программах.
Сегментная
организация памяти в реальном режиме
Реальный режим процессора i486 аналогичен режиму его предшественника i8086, адресное пространство которого составляло
1 мегабайт. 16-разрядный процессор мог работать с таким объемом
оперативной памяти благодаря тому, что в нем был использован
сегментный способ формирования адресов. Линейный адрес ячейки
памяти состоит из двух 16-битных частей: сегмента и смещения
, из
которых образуется линейный адрес размером 20 бит. При вычислении его значения сегмент умножается на 16 (10H) и складывается со
смещением. Или, иными словами, значение сегмента расширяется
справа на 4 бита, равных нулю: 1234H:789AH => 1234H * 10H +
789AH = 12340H + 0789AH = 19BDAH.
Таким образом, все адресное пространство в 1 Мб оказывается
поделенным на 65536 параграфов размером по 16 байт. Старшая
часть адреса ячейки памяти задает
номер параграфа, с которого начинается сегмент, в котором она расположена: от минимального
значения 0 до максимального 65535 (FFFFH). Младшая задает ее
смещение от начала сегмента (0–65535), то есть размер сегмента
может составлять до 64 Кб. Один и тот же линейный адрес может
быть задан 4096-ю способами. Например, физический адрес 12345H
может быть представлен как 1000H:2345H и
как 1111H:2345H.
В процессоре i8086 и в реальном режиме i486 в некоторых случаях может происходить так называемое «заворачивание», когда для
представления значения физического адреса, заданного данными
сегментом и смещением, недостаточно 20-ти бит. В этом случае его
старшая часть отбрасывается и на адресную шину выдается «обре-
54

занное» значение. Например, пара FF00H:1000H => 10000H указывает на ячейку памяти с линейным адресом 0.
В процессоре i486 имеется шесть регистров, предназначенных
для хранения сегментной компоненты адресов: cs, ss, ds, es, fs,
gs. Сегмент кода всегда определяется cs, стека – ss, данных – по
умолчанию ds. es, fs, gs – дополнительные сегментные регистры
данных. es используется в цепочечных
командах работы со строками для указания приемника. fs и gs не имеют специального назначения. Обычный порядок адресации данных можно изменить при
помощи префиксов замены сегментного регистра:
mov ax,[bx] ;адрес в ds:bx
mov cs:[si],2000H ;адрес в cs:si
mov [bp],di ;адрес в ss:bp
mov ds:[bp],cx ;адрес в ds:si
Для удобства работы с сегментами язык Ассемблера предостав-
ляет специальные директивы segment
и assume. Директива
segment предназначена для объединения блоков данных или команд в непрерывную область памяти в одном сегменте. И команды,
и данные в принципе могут быть расположены вместе: организация
зависит от программиста. При обращении к переменной транслятор
вычисляет ее смещение от начала сегмента, которому она принадлежит, и генерирует соответствующий
машинный код. При этом
предполагается, что в момент его выполнения сегментный регистр,
назначенный данному сегменту, будет содержать правильное значение и указывать его действительное положение в памяти. Директива
assume позволяет избежать многократного ввода префиксов замены сегментного регистра при написании программы. Транслятор сам
будет подставлять нужные значения в зависимости от того,
какие
сегментные регистры назначены сегментам:
.486
sega segment para use16 ;первый сегмент данных
assume es:sega
x dw 10
sega ends
segb segment para use16 ;второй сегмент данных
55

assume ds:segb
y dw 20
segb ends
segc segment para use16 ;первый сегмент кода
assume cs:segc
z dw ?
start:
push sega ;сделаем данные адресуемыми
pop es
push segb
pop ds
;вычислим сумму
push [x] ;push es:[x]
push [y] ;push [y]
call sum ;call far ptr segd:sum
mov [z],ax ;mov cs:[z],ax
mov ax,4C00H ;выйдем из программы
int 21H
segc ends
segd segment para use16 ;второй сегмент кода
assume cs:segd
sum proc far ;вычисление суммы
push bp
mov bp,sp
mov ax,[bp+8] ;x
add ax,[bp+6] ;y
pop bp
ret
sum endp
segd ends
sege segment para stack use16;сегмент стека
assume ss:segd
dw 1024 dup(?)
sege ends
end start
Параметр at директивы segment регистра позволяет задавать
сегменты, расположенные по конкретным адресам. Эти сегменты
56

физически не существуют в исполняемом модуле и удобны для логического описания структур данных, расположенных по фиксированному адресу в памяти. Пример ниже иллюстрирует данную технику для доступа к видеопамяти.
;сегмент видеопамяти
Videomem segment at 0B800H
assume es:videomem
;каждое знакоместо имеет размер два байта:
атрибут и код символа
symbols dw 80*25 dup(?) ;25 строк, 80
столбцов
videomem ends
;сегмент
программы
Cseg segment
assume cs:cseg,ds:cseg,ss:cseg
org 256 ;com-формат
start:
;сделаем видеопамять адресуемой
mov ax,videomem
mov es,ax
;длина сообщения
mov cx,msg_len
;индекс массива символов сообще-
ния
mov si,0
;индекс массива знакомест в
видеопамяти
;(середина экрана)
mov di,80*12+(80-msg_len)/2
;на каждый символ два байта
shl di,1
;атрибуты надписи: зеленые буквы
на черном фоне
mov ah,0AH
l1:
;возьмем очередной символ
57

mov al,msg[si]
;поместим код символа и его
атрибут в видеопамять
mov symbols[di],ax
;увеличим индексы
inc di
inc di
inc si
loop l1
;выйдем из программы
int 20H
msg db 'Пример прямого доступа к
видеопамяти'
msg_len = $-msg
cseg ends
end start
Для цветных видеоадаптеров в текстовом режиме адрес сегмента первой страницы видеопамяти равен B800H. Размер страницы для
режима 80 колонок на 25 строк составляет 80 * 25 * 2 = 4000 байт.
Каждый символ описывается
парой байтов: сначала идет код симво-
ла, а затем его атрибуты. Байт атрибутов имеет следующий формат:
B/ir gbirgb
76543210
цвет символа
интенсивность символа
цвет фона
мигание символа/
интенсивность фона
Рис. 1. Формат байта атрибутов
Здесь r означает красную, g – зеленую, b – синюю составляющую цвета, i – интенсивность, B – мигание. Значение старшего бита
определяется параметрами режима работы видеоадаптера. Смещение от начала буфера знакоместа символа, находящегося в строке y,
58

колонке x, находится по формуле s = (80*y+x)*2. При этом
считается, что первая колонка и первая строка имеют номер 0.
РЕРЫВАНИЯ РЕАЛЬНОГО РЕЖИМА ПРОЦЕССОРА I486
П
Типы прерываний
Прерыванием называется ситуация, когда обычный ход выполнения текущей программы прерывается для того, чтобы процессор
мог выполнить какие-то срочно необходимые действия, например
обработать возникшую ошибку. В зависимости от источника возникновения различают аппаратные и программные прерывания.
Существование первого типа значительно экономит процессорное
время за счет того, что
ему не надо постоянно опрашивать состояние
внешних устройств. Второй тип обеспечивает поддержку на аппаратном уровне системного программного обеспечения. Сигналы от
периферийных устройств, таких как принтер, клавиатура, диск поступают на вход INTR через программируемый контроллер прерываний PIC 8259A и являются маскируемыми. Если флажок разрешения прерываний равен нулю (IF=0), то процессор игнорирует
их. Он
сбрасывается в 0 командой cli и устанавливается в 1 при помощи
команды sti. Вход NMI служит для извещения о катастрофических
событиях. В архитектуре IBM PC AT к нему подключены таймер
(тайм-аут), AT-шина (ошибка), оперативная память (ошибка).
Программные прерывания генерируются в результате использования специальной команды, например int n или into, или же в
результате
возникновения исключительной ситуации при выполнении процессором команд. Исключительные ситуации подразделяются на ловушки и ошибки. Ошибки обнаруживаются во время выполнения команды, например при делении на ноль. Адрес возврата в
стеке при входе в обработчик указывает на начало «виновницы», что
позволяет устранить причины, послужившие к возникновению
ошибки, и вернуться к
исполнению прерванной программы при помощи инструкции iret. Ловушки определяются после выполнения
команды, создавшей особую ситуацию. Адрес возврата указывает на
начало следующей за ней команды. Примером ловушки может служить прерывание, возникающее во время отладки при трассировке.
59

Обработка прерываний
Адреса обработчиков прерываний процессор определяет из так
называемой таблицы векторов прерываний. Она расположена в начале оперативной памяти по линейному адресу и представляет собой
массив из 256 дальних указателей в виде пары сегмент: смещение размером 4 байта. В соответствии с принятым порядком хранения данных смещение находится перед сегментом.
При возникновении запроса на прерывание процессор прекращает выполнение текущей программы, сохраняет в стеке минимальное описание ее состояния (адрес следующей или текущей команды,
в зависимости от ситуации, и регистр флагов) и передает управление
обработчику. При входе в него стек имеет следующий вид:
FLAGS
CS
SP
IP
…
SS
Команда iret, которой обычно заканчивается обработка прерывания, выбирает из стека адрес невыполненной команды и восстанавливает сохраненный регистр флагов. Прерванная программа
продолжает выполняться.
Обработка программных и аппаратных прерываний имеет некоторые различия. Когда возникает аппаратное прерывание, процессор
перед передачей управления процедуре обработки сбрасывает флажок разрешения прерываний (IF=0), что препятствует
возникновению других аппаратных прерываний, пока обработчик не закончит
свою работу. В некоторых случаях их следует разрешить, например,
чтобы не мешать работе таймера во время долгого чтения секторов с
диска.
Запросы на прерывание от периферийных устройств поступают
в процессор через программируемый контроллер прерываний
i8259A, который реализует свою схему приоритетов и маскирует
прерывания с более низким приоритетом до окончания обработки
прерывания с более высоким. Чтобы прерывания не остались запре-
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
