Системное программирование

Автор: Пользователь скрыл имя, 10 Марта 2013 в 15:44, курс лекций

Описание работы

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

Работа содержит 1 файл

Системное программирование 15 лекций.doc

— 946.00 Кб (Скачать)

u В случае, если кодовые сегменты необходимо скомпоновать в один сегмент, то необходимо определить их с одинаковыми именами, одинаковыми классами и атрибутом PUBLIC.

u Для простоты программирования начинайте выполнение с основной программы.

u Определение общих данных в основной программе обычно проще (но не обязательно). Основная программа определяет общие данные как PUBLIC, а подпрограмма (или подпрограммы) — как EXTRN. 

 

 

  

 

 

  

 

 

  

 

 

  

 

 

  

 

 

  

 

 

  

 

 

  

 

Лекция 13. 
Выполнение программ

4

Начинаем работать

Когда рабочая  часть DOS будет загружена в память, на экране появится запрос для ввода  даты и времени, а затем буква  текущего дисковода, обычно A для дискеты  и C для винчестера (твердого диска). Изменить текущий дисковод можно, нажав соответствующую букву, двоеточие и клавишу Enter.

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

В этом первом упражнении для просмотра содержимого ячеек  памяти используется программа DOS DEBUG. Для запуска этой программы введите DEBUG и нажмите Enter, в результате программа DEBUG должна загрузится с диска в память. После окончания загрузки на экране появится приглашение в виде дефиса, что свидетельствует о готовности программы DEBUG для приема команд.

Размер памяти

Сначала проверим размер доступной для работы памяти. В зависимости от модели компьютера это значение связано с установкой внутренних переключателей и может быть меньше, чем реально существует. Данное значение находится в ячейках памяти шест.413 и 414 и его можно просмотреть из DEBUG по адресу, состоящему из двух частей: 400 — это адрес сегмента, который записывается как 40 (последний нуль подразумевается) и 13 — это смещение от начала сегмента. Таким образом, можно ввести следующий запрос:

D 40:13 (и нажать Enter). 

 

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

Серийный номер

Серийный номер  компьютера «зашит» в ROM по адресу шест. FE000. Для того, чтобы увидеть его, следует ввести:

D FE00:0 (и нажать Enter)

В результате на экране появится семизначный номер  компьютера и дата копирайт.

Дата ROM BIOS

Дата ROM BIOS в формате mm/dd/yy находится по шест. адресу FFFF5. Введите

D FFFF:05 (и нажмите Enter)

Знание этой информации (даты) иногда бывает полезным для определения модели и возраста компьютера. Теперь, поскольку вы знаете, как пользоваться командой D (Display), можно устанавливать адрес любой ячейки памяти для просмотра содержимого.

Можно также пролистывать память, периодически нажимая клавишу D, — DEBUG выведет на экран адреса, следующие за последней командой.

Для окончания  работы и выхода из отладчика в DOS введите команду Q (Quit). Рассмотрим теперь использование отладчика DEBUG для непосредственного ввода программ в память и трассировки их выполнения.

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

Можно ввести программу  непосредственно в память машины и выполнить ее покомандно. В тоже время можно просматривать cодержимое  регистров после выполнения каждой команды. После загрузки DEBUG на экране высвечивается приглашение к  вводу команд в виде дефиса.

Для непосредственного  ввода программы на машинном языке  введите следующую команду, включая  пробелы:

E CS:100 B8 23 01 05 25 00 (нажмите Enter)

Команда E обозначает Enter (ввод). CS:100 определяет адрес памяти, куда будут вводиться команды, — шест.100 (256) байт от начала сегмента кодов. (Обычный стартовый адрес для машинных кодов в отладчике DEBUG).

Команда E записывает каждую пару шестнадцатеричных цифр в память в виде байта, начиная с адреса CS:100 до адреса CS:105.

Следующая команда Enter:

E CS:106 8B D8 03 D8 8B CB (Enter)

вводит шесть  байтов в ячейки, начиная с адреса CS:106 и далее в 107, 108, 109, 10A и 10B. Последняя  команда Enter:

E CS:10C 2B C8 2B C0 90 CB (Enter)

вводит шесть  байтов, начиная с CS:10C в 10D, 10E, 10F, 110 и 111.

Проверьте правильность ввода значений. В случае, если есть ошибки, то следует повторить команды, которые были введены неправильно.

Теперь осталось самое простое — выполнить  эти команды.

Введите команду R для просмотра содержимого регистров  и флагов. В данный момент отладчик покажет содержимое регистров в шест. формате, например, AX=0000, BX=0000,...

Содержимое регистра IP (указатель команд) выводится в  виде IP=0100, показывая что выполняемая  команда находится на смещении 100 байт от начала сегмента кодов. Регистр  флагов показывает следующие значения флагов:

NV UP DI PL NZ NA PO NC

Данные значения соответствуют:

u NV — нет переполнения

u UP — правое направление

u DI — прерывания запрещены

u PL — знак плюс

u NZ — не ноль

u NA — нет внешнего переноса

u PO — контроль на честность

u NC — нет переноса.

Команда R показывает также по смещению 0100 первую выполняемую машинную команду.

MOV AX,0123 — ассемблерный мнемонический код, соответствующий введенной машинной команде. Это есть результат операции дизассемблирования, которую обеспечивает отладчик для более простого понимания машинных команд. Рассматриваемая в данном случае команда обозначает пересылку непосредственного значения в регистр AX.

В данный момент команда MOV еще не выполнена. Для ее выполнения нажмите клавишу T (для трассировки) и клавишу Enter. В результате команда MOV будет выполнена и отладчик выдаст на экран содержимое регистров, флаги, а также следующую на очереди команду. Заметим, что регистр AX теперь содержит 0123. Машинная команда пересылки в регистр AX имеет код B8 и за этим кодом следует непосредственные данные 2301. В ходе выполнения команда B8 пересылает значение 23 в младшую часть регистра AX, то есть, однобайтовый регистр AL, а значение 01 — в старшую часть регистра AX, то есть, в регистр AH:

AX: | 01 | 23 |

Содержимое регистра IP:0103 показывает адрес следующей выполняемой команды в сегменте кодов:

13C6:0103 052500 ADD AX,0025

Для выполнения данной команды снова введите T. Команда прибавит 25 к младшей (AL) части регистра AX и 00 к старшей (AH) части регистра AX, то есть, прибавит 0025 к регистру AX. Теперь регистр AX содержит 0148, а регистр IP 0106 — адрес cледующей команды для выполнения.

Введите снова  команду T. Следующая машинная команда пересылает содержимое регистра AX в регистр BX и после ее выполнения в регистре BX будет содержаться значение 0148. Регистр AX сохраняeт прежнее значение 0148, поскольку команда MOV только копиpует данные из одного места в другое. Теперь вводите команду T для пошагового выполнения каждой оставшейся в программе команды. Следующая команда прибавит cодержимое регистра AX к содержимому регистра BX, в последнем получим 0290. Затем программа скопирует содержимое pегистра BX в CX, вычтет AX из CX, и вычтет AX из него самого. После этой последней команды, флаг нуля изменит свое состояние c NZ (не нуль) на ZR (нуль), так как результатом этой команды является нуль (вычитание AX из самого себя очищает этот регистр в 0).

Можно ввести T для выполнения последних команд NOP и RET, но это мы сделаем позже. Для просмотра программы в машинных кодах в сегменте кодов введите D для дампа:

D CS:100

В результате отладчик выдаст на каждую строку экрана по 16 байт данных в шест. представлении (32 шест. цифры) и в символьном представлении  в коде ASCII (один символ на каждую пару шест. цифр). Представление машинного кода в символах ASCII не имеет смысла и может быть игнорировано.

Первая строка дампа начинается с 00 и представляет содержимое ячеек от CS:100 до CS:10F. Вторая строка представляет cодержимое ячеек  от CS:110 до CS:11F. Несмотря на то, что ваша программа заканчивается по адресу CS:111, команда Dump aвтоматически выдаст на восьми строках экрана дамп с адреса CS:100 до адреса CS:170.

При необходимости  повторить выполнение этих команд сбросьте содержимое регистра IP и повторите трассировку снова. Введите R IP, введите 100, а затем необходимое число команд T. После каждой команды нажимайте клавишу Enter.

Для завершения работы с программой DEBUG введите Q (Quit — выход). В результате произойдет возврат в DOS и на экране появится приглашение A> или C>. В случае, если печатался протокол работы с отладчиком, то для прекращения печати cнова нажмите Ctrl/PrtSc.

4

Определение данных

В предыдущем примере  использовались непосредственные данные, описанные непосредственно в  первых двух командах (MOV и ADD). Теперь рассмотрим аналогичный пример, в котором значения 0123 и 0025 определены в двух полях сегмента данных. Данный пример позволяет понять как компьютер обеспечивает доступ к данным посредством регистра DS и адресного смещения. В настоящем примере определены области данных, содержащие cоответственно следующие значения:

Адрес в DS Шест. знач. Номера байтов

0000  2301  0 и 1

0002  2500  2 и 3

0004 0000  4 и 5

0006  2A2A2A  6, 7 и 8

Вспомним, что  шест. символ занимает половину байта, таким oбразом, например, 23 находится в байте 0 (в первом байте) сегмента данных, 01 — в байте 1 (то есть, во втором байте).

Ниже показаны команды машинного языка, которые  обрабатывают эти данные:

A10000

Переслать слово (два байта), начинающееся в DS по адресу 0000, в регистр AX.

03060200

Прибавить содержимое слова (двух байт), начинающегося в DS по адресу 0002, к регистру AX.

A30400

Переслать содержимое регистра AX в слово, начинающееся в DS по адресу 0004.

CB

Вернуться в DOS.

Обратите внимание, что здесь имеются две команды MOV с pазличными машинными кодами: A1 и A3. Фактически машинный код зависит от регистров, на которые имеется ссылка, количества байтов (байт или слово), направления передачи данных (из регистра или в регистр) и от ссылки на непосредственные данные или на память.

4

Машинная адресация

Для доступа  к машинной команде процессор  определяет ее адрес из содержимого  регистра CS плюс смещение в регистре IP. Например, предположим, что регистр CS содержит шест.04AF (действительный адрес 04AF0), а регистр IP содержит шест. 0023:

CS: 04AF0 IP: 0023

Адрес команды: 04B13

В случае, если, например, по адресу 04B13 находится команда:

A11200 MOV AX,[0012] | Адрес 04B13

то в памяти по адресу 04B13 содержится первый байт команды.

Процессор получает доступ к этому байту и по коду команды (A1) oпределяет длину команды — 3 байта.

Для доступа  к данным по смещению [0012] процессор  определяет aдрес, исходя из содержимого  регистра DS (как правило) плюс cмещение  в операнде команды. В случае, если DS содержит шест.04B1 (реальный адрес 04B10), то результирующий адрес данных определяется cледующим образом:

DS: 04B10

Смещение: 0012

Адрес данных: 04B22

Предположим, что  по адресам 04B22 и 04B23 содержатся следующие  данные:

Содержимое: 24 01

Адрес: 04B22 04B23

Процессор выбирает значение 24 из ячейки по адресу 04B22 и помещает его в регистр AL, и значение 01 по адресу 04B23 — в регистр AH. Регистр AX будет содержать в результате 0124. В процессе выборки каждого байта команды процессор увеличивает значение регистра IP на единицу, так что к началу выполнения следующей команды в нашем примере IP будет содержать смещение 0026. Таким обpазом процессор теперь готов для выполнения следующей команды, которую он получает по адресу из регистра CS (04AF0) плюс текущее смещение в регистре IP (0026), то есть, 04B16.

Четная адресация

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

Процессор может  сделать oдну выборку слова по адресу 4B22 для загрузки его непосредственно  в регистр. Но если слово начинается на нечетном адресе, процессор выполняет двойную выборку. Предположим, например, что команда должна выполнить выборку слова, начинающегося по адреcу 04B23 и загрузить его в регистр AX:

Содержимое памяти: |хх|24|01|хх|

Адрес: 04B23

Сначала процессор получает доступ к байтам по адресам 4B22 и 4B23 и пересылает байт из ячейки 4B23 в регистр AL.

Затем он получает доступ к байтам по адресам 4B24 и 4B25 и  пересылает байт из ячейки 4B23 в регистр AH. В результате регистр AX будет содержать 0124.

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

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

Ассемблер имеет  директиву EVEN, которая вызывает выравнивание данных и команд на четные адреса памяти.

4

Определение размера памяти

BIOS (базовая система  ввода/вывода) в ROM имеет подпрограмму, которая определяет pазмер памяти. Можно обратиться в BIOS по команде INT по прерыванию 12H. В результате BIOS возвращает в регистр AX размер памяти в килобайтах.

Информация о работе Системное программирование