Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Ответы на билеты по дисциплине Организация ЭВМ и систем - файл 1.doc


Ответы на билеты по дисциплине Организация ЭВМ и систем
скачать (1876 kb.)

Доступные файлы (1):

1.doc1876kb.16.11.2011 22:22скачать

содержание
Загрузка...

1.doc

1   2   3   4   5   6   7   8
Реклама MarketGid:
Загрузка...
^

Управление состоянием процессора

 

      Глава посвящена тому, как наиболее извратно поиздеваться над флагами и словом состоянием процессора.

^

      Строго говоря, изменяя любой бит регистра, программа изменяет состояние процессора, и регистра в частности.

     СЛОВО СОСТОЯНИЯ процессора обозначается как CR0. Подсказка в названии "слово" указывает на 16 бит.

^

      Биты:

0 - PE - включение защищённого режима

1 - MP - управление сопроцессором

2 - EM - эмуляция сопроцессора

3 - TS - бит переключения задач

Для процессора 80386 и выше:

^

31 - PG - включение управления страницами

 

     Отдельная песня, по поводу МАТЕМАТИЧЕСКОГО СОПРОЦЕССОРА. Эта специализированная микросхема предназначена для быстрого выполнения операций с дробными числами (с плавающей запятой). В старших моделях процессоров, кроме того, математический сопроцессор позволяет заметно ускорить обработку мультимедиа-данных.

       В моделях, вплоть до 80486, математический сопроцессор был выполнен в виде отдельной микросхемы. 80486SX тоже его не имел (на самом деле он был аппаратно отключен вследствие ошибки Intel, имевшееся рядом гнездо для сопроцессора фактически являлось гнездом самого процессора, разумеется с исправным сопроцессором. :)))))

       Кроме того, присутствуют дополнительные регистры: CR2 - линейный адрес ошибки страницы, CR3 - базовый адрес каталога страниц. Что такое страницы, защищённый режим - ещё поговорим.

       Регистр флагов FLAGS, как упоминалось ранее, содержит биты, называемые флагами. Флаги указывают на результаты выполнения команд. Но это не значит, что флаги реагируют НА ЛЮБОЙ результат и любую команду. Собственно, сами флаги:

^

0 (CF) - флаг переноса при вычислениях или операциях сдвига

2(PF) - флаг приоритета (что выполняется первым\последним)

4(AF) - флаг дополнительного переноса (последний бит младшей тетрады - биты 0...3)

6(ZF) - флаг нулевого результата

^

7(SF) - флаг знака числа. Дублирует старший бит результата.

8(TF) - флаг трассировки. Полезен при отладке программ.

9(IF) - флаг разрешения прерываний

10(DF) - флаг направления (в циклических операциях)

11(OF) - флаг переполнения при вычислениях.

Все эти флаги частенько используются в программах, и как показывает анализ кода программ, команды проверки условий занимают до 15...20% вычислительной мощности процессора. ;)

^

Флаги используются, как правило, в командах проверки условий.





      1. Моделирование структурных типов данных в Ассемблере (строки, векторы, матрицы, записи, структуры). Организация обработки структурных данных.
      1. Массивы


Дадим формальное определение:
массив - структурированный тип данных, состоящий из некоторого числа элементов одного типа.
^

Описание и инициализация массива в программе


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

  1. Перечислением элементов массива в поле операндов одной из директив описания данных. При перечислении элементы разделяются запятыми. К примеру:

    ;массив из 5 элементов.Размер каждого

    элемента 4 байта:

    mas dd 1,2,3,4,5

  2. Используя оператор повторения dup. К примеру:

;массив из 5 нулевых элементов.

;Размер каждого элемента 2 байта:

mas dw 5 dup (0)


Такой способ определения используется для резервирования памяти с целью размещения и инициализации элементов массива.

  1. Используя директивы label и rept. Пара этих директив может облегчить описание больших массивов в памяти и повысить наглядность такого описания. Директива rept относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой endm. К примеру, определим массив байт в области памяти, обозначенной идентификатором mas_b. В данном случае директива label определяет символическое имя mas_b, аналогично тому, как это делают директивы резервирования и инициализации памяти. Достоинство директивы label в том, что она не резервирует память, а лишь определяет характеристики объекта. В данном случае объект — это ячейка памяти. Используя несколько директив label, записанных одна за другой, можно присвоить одной и той же области памяти разные имена и разный тип, что и сделано в следующем фрагменте:

...

n=0

...

mas_b label byte

mas_w label word

rept 4

dw 0f1f0h

endm

В результате в памяти будет создана последовательность из четырех слов f1f0. Эту последовательность можно трактовать как массив байт или слов в зависимости от того, какое имя области мы будем использовать в программе — mas_b или mas_w.
      1. ^

        Двухмерные массивы


С представлением одномерных массивов в программе на ассемблере и организацией их обработки все достаточно просто. А как быть если программа должна обрабатывать двухмерный массив? Все проблемы возникают по-прежнему из-за того, что специальных средств для описания такого типа данных в ассемблере нет. Двухмерный массив нужно моделировать. На описании самих данных это почти никак не отражается — память под массив выделяется с помощью директив резервирования и инициализации памяти.

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

Если последовательность однотипных элементов в памяти трактуется как двухмерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле

(база + количество_элементов_в_строке * размер_элемента * i+j)

Здесь i = 0...n–1 указывает номер строки, а j = 0...m–1 указывает номер столбца.

Например, пусть имеется массив чисел (размером в 1 байт) mas(i, j) с размерностью 4 на 4
(i= 0...3, j = 0...3):

23 04 05 67

05 06 07 99

67 08 09 23

87 09 00 08

В памяти элементы этого массива будут расположены в следующей последовательности:

23 04 05 67 05 06 07 99 67 08 09 23 87 09 00 08

Если мы хотим трактовать эту последовательность как двухмерный массив, приведенный выше, и извлечь, например, элемент
mas(2, 3) = 23, то проведя нехитрый подсчет, убедимся в правильности наших рассуждений:

^ Эффективный адрес mas(2, 3) = mas + 4 * 1 * 2 + 3 = mas + 11

Посмотрите на представление массива в памяти и убедитесь, что по этому смещению действительно находится нужный элемент массива.

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

  • сочетание прямого адреса, как базового компонента адреса, и двух индексных регистров для хранения индексов:

    mov ax,mas[ebx][esi]

  • сочетание двух индексных регистров, один из которых является и базовым и индексным одновременно, а другой — только индексным:

mov ax,[ebx][esi]

В программе это будет выглядеть примерно так:

;Фрагмент программы выборки элемента

;массива mas(2,3) и его обнуления

.data

mas db

23,4,5,67,5,6,7,99,67,8,9,23,87,9,0,8

i=2

j=3

.code

...

mov si,4*1*i

mov di,j

mov al,mas[si][di] ;в al элемент mas(2,3)

...


      1. Структуры


По определению структура — это тип данных, состоящий из фиксированного числа элементов разного типа.

Очень важно, чтобы вы с самого начала уяснили, в чем разница между описанием структуры в программе и ее определением.
Описать структуру в программе означает лишь указать ее схему или шаблон; память при этом не выделяется.
Этот шаблон можно рассматривать лишь как информацию для транслятора о расположении полей и их значении по умолчанию.
Определить структуру — значит, дать указание транслятору выделить память и присвоить этой области памяти символическое имя.

Описать структуру в программе можно только один раз, а определить — любое количество раз.
^

Описание шаблона структуры


Описание шаблона структуры имеет следующий синтаксис:

имя_структуры STRUC

<описание полей>

имя_структуры ENDS

Здесь <описание полей> представляет собой последовательность директив описания данных db, dw, dd, dq и dt.
Их операнды определяют размер полей и, при необходимости, начальные значения. Этими значениями будут, возможно, инициализироваться соответствующие поля при определении структуры.

Как мы уже отметили при описании шаблона, память не выделяется, так как это всего лишь информация для транслятора.

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

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

worker struc ;информация о сотруднике

nam db 30 dup (' ') ;фамилия, имя, отчество

sex db 'м' ;пол, по умолчанию 'м' — мужской

position db 30 dup (' ') ;должность

age db 2 dup(‘ ’) ;возраст

standing db 2 dup(‘ ’) ;стаж

salary db 4 dup(‘ ’) ;оклад в рублях

birthdate db 8 dup(‘ ’) ;дата рождения

worker ends
^

Определение данных с типом структуры


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

[имя переменной] имя_структуры <[список значений]>

Здесь:

  • имя переменной — идентификатор переменной данного структурного типа.
    Задание имени переменной необязательно. Если его не указать, будет просто выделена область памяти размером в сумму длин всех элементов структуры.

  • список значений — заключенный в угловые скобки список начальных значений элементов структуры, разделенных запятыми.
    Его задание также необязательно.
    Если список указан не полностью, то все поля структуры для данной переменной инициализируются значениями из шаблона, если таковые заданы.
    Допускается инициализация отдельных полей, но в этом случае пропущенные поля должны отделяться запятыми. Пропущенные поля будут инициализированы значениями из шаблона структуры. Если при определении новой переменной с типом данной структуры мы согласны со всеми значениями полей в ее шаблоне (то есть заданными по умолчанию), то нужно просто написать угловые скобки.
    К примеру: victor worker <>.

Для примера определим несколько переменных с типом описанной выше структуры.

data segment

sotr1 worker <’Гурко Андрей Вячеславович’,,’художник’,’33’,‘15’,‘1800’,’26.01.64’<

sotr2 worker <’Михайлова Наталья Геннадьевна’,’ж’,’программист’,’30’,’10’,’1680’,’27.10.58’<

sotr3 worker <’Степанов Юрий Лонгинович’,,’художник’,’38’,’20’,’1750’,’01.01.58’<

sotr4 worker <’Юрова Елена Александровна’,’ж’,’свяэист’,’32’,’2’,,’09.01.66’<

sotr5 worker <> ;здесь все значения по умолчанию

data ends
      1. Объединения


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

Объединение — тип данных, позволяющий трактовать одну и ту же область памяти как имеющую разные типы и имена.

Описание объединений в программе напоминает описание структур, то есть сначала описывается шаблон, в котором с помощью директив описания данных перечисляются имена и типы полей:

имя_объединения UNION

<описание полей>

имя_объединения ENDS

Отличие объединений от структур состоит, в частности, в том, что при определении переменной типа объединения память выделяется в соответствии с размером максимального элемента.
Обращение к элементам объединения происходит по их именам, но при этом нужно, конечно, помнить о том, что все поля в объединении накладываются друг на друга.
Одновременная работа с элементами объединения исключена. В качестве элементов объединения можно использовать и структуры.
      1. Записи


Наша “хозяйка-программист” становится все более экономной. Она уже хочет работать с продуктами на молекулярном уровне, без любых отходов и напрасных трат.
Подумаем, зачем тратить под некоторый программный индикатор со значением “включено-выключено” целых восемь разрядов, если вполне хватает одного? А если таких индикаторов несколько, то расход оперативной памяти может стать весьма ощутимым.
Когда мы знакомились с логическими командами, то говорили, что их можно применять для решения подобной проблемы. Но это не совсем эффективно, так как велика вероятность ошибок, особенно при составлении битовых масок.

TASM предоставляет нам специальный тип данных, использование которого помогает решить проблему работы с битами более эффективно. Речь идет о специальном типе данных — записях.

Запись — структурный тип данных, состоящий из фиксированного числа элементов длиной от одного до нескольких бит.
При описании записи для каждого элемента указывается его длина в битах и, что необязательно, некоторое значение.
Суммарный размер записи определяется суммой размеров ее полей и не может быть более 8, 16 или 32 бит.
Если суммарный размер записи меньше указанных значений, то все поля записи “прижимаются” к младшим разрядам.
^

Описание записи


Описание шаблона записи имеет следующий синтаксис (рис. 6):

имя_записи RECORD <описание элементов>

Здесь:
<описание элементов> представляет собой последовательность описаний отдельных элементов записи согласно синтаксической диаграмме (см. рис. 6):



Рис. 6. Синтаксис описания шаблона записи

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

Определение экземпляра записи


Для использования шаблона записи в программе необходимо определить переменную с типом данной записи, для чего применяется следующая синтаксическая конструкция (рис. 7):



Рис. 7. Синтаксис описания экземпляра записи

Анализируя эту синтаксическую диаграмму, можно сделать вывод, что инициализация элементов записи осуществляется достаточно гибко. Рассмотрим несколько вариантов инициализации.

Если инициализировать поля не требуется, то достаточно указать ? при определении экземпляра записи:

...

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest ?

Если вы составите и исследуете в отладчике тестовый пример с данным определением записи, то увидите, что все поля переменной типа запись flag обнуляются. Это происходит несмотря на то, что в определении записи заданы начальные значения полей.

Если требуется частичная инициализация элементов, то они заключаются в угловые (< и >) или фигурные ({ и }) скобки.
Различие здесь в том, что в угловых скобках элементы должны быть заданы в том же порядке, что и в определении записи. Если значение некоторого элемента совпадает с начальным, то его можно не указывать, но обязательно обозначить его запятой. Для последних элементов идущие подряд запятые можно опустить.
К примеру, согласиться со значениями по умолчанию можно так:

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest <> ;согласились со значением по умолчанию

Изменить значение поля i2 можно так:

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest <,10,> ; переопределили i2

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

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest {i2=10} ;переопределили i2, не обращая внимания на порядок

;следования других компонентов записи




      1. ^ Функциональное обслуживание устройств на уровне ОС MS-DOS. Прерывания DOS. Программный интерфейс MS-DOS - прерывание int 21h. Основные группы функций.
1   2   3   4   5   6   7   8



Скачать файл (1876 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru