Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
Задание № 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]