Указание: сначала прочесть весь текст, иметь представление о содержимом, а затем выполнить задание. На все это - две пары занятий.
РАЗРАБОТА ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕРА ДЛЯ СЕМЕЙСТВА
КОМПЬЮТЕРОВ СОВМЕСТНЫХ С IBM PC.
ЦЕЛЬ: показать основные требования к программам на языке ассемблера, модели памяти и структуры программ, этапы ассемблирования, компоновки и выполнения программы.
1. Введение.
Язык ассемблера является довольно необычным и сложным, это объясняется сегментной организацией памяти и одновременной адресацией четырех сегментов. В языке имеется более
100 базовых символических команд, в соответствии с которыми ассемблер генерирует более 3800 машинных команд. Кроме того, в распоряжении программиста имеется около 20 директив, предназначенных для определения памяти, инициализации переменных и т.д. Учитывая, что в любой программе имеется множество данных и адресов, то разработка ассемблерных программ превращается в кропотливый труд и требующий много усилий.
Тем не менее затраченное время и усилия на изучение языка ассемблер вознаградится. Ассемблерные программы обычно эффективнее (занимает меньший объем памяти и выполняются быстрее)
эквивалентных программ, транслируемых с тех или иных языков высокого уровня.
2. Организация программного обеспечения.
Программное обеспечение для микрокомпьютеров создаются на языках высокого уровня, таких как Бейсик, Фортран, Паскаль,
Си и др. Однако в тех случая, когда требуется понимание основных принципов работы компьютера, полная реализация вcех его возможностей, использование внешних устройств с наибольшей эффективностью - необходимо программирование на уровне машинных языков (кодов). Но на машинном языке программы не кодируют.
Для этого используется близкий к машинному языку - язык ассемблера, в котором программист пользуется символическими мнемокодами вместо машинных команд и описательными именами для полей данных и адресов памяти.
При программировании на языке ассемблера первое,что должно быть известно об аппаратном обеспечении микрокомпьютера, это какие регистры он имеет и как они используются при выполнении машинных команд, а также какие существуют способы адресации при выборке команд и данных из основной памяти и т.д.
Указанные вопросы рассматриваются на процессоре 8086/88 как типичного и описывается механизм сегментации памяти, являющейся реализацией одной из современных идей организации памяти.
В процессоре 8086/88 основная (оперативная) память разделена на участки по 1 байту (8 бит) каждый (рис.1,a)), которые различаются номерами 0, 1, 2, 3 и т.д.
1 байт
┌┬┬┬┬┬┬┬┬┬┐
номер 0├┴┴┴┴┴┴┴┴┴┤
байта 1├─────────┤
2├─────────┤
3├────.────┤
.│ . │
.│ . │
.└─────────┘ a)
ширина
1 байт номер байта ┌─────────────┐сегмент
SP ┌──────────┐ ┌─────>┤1 стек │стека
BP───>┤ SS ├────┘ ├─────────────┤
├──────────┤ ┌─────>┤2 область │сегмент исполнительный────>┤ DS ├────┘ │ данных │данных адрес и ├──────────┤ ├─────────────┤
регистры ────>┤ ES ├──────────>┤3 допол. обл.│дополн.
├──────────┤ │ данных │сегмент
IP───>┤ CS ├────┐ ├─────────────┤
└──────────┘ └─────>┤4 область │сегмент
│ программ │кодов
└─────────────┘
б)
Рис. 1
Это позваляет выбрать, например, команду длиной 1 байт, занимающей участок памяти под номером 0, или выбор данного, имеющего длину 4 байта и занимающего область памяти, включающую участки с номерами 1, 2, 3, 4.
Возможен и другой способ адресации основной памяти, при котором память разделяется на области, называемые сегментами
(рис.1 б)). При объединении нескольких однобитных участков памяти в один сегмент и использовании им как единым целым, появляется возможность выделить в памяти область программ и область данных и использовать каждую из них независимо.
Оказалось, что оперировать сегментом очень удобно, поскольку сегмент может быть выбран в любом месте основной памяти и размер его также может быть любым.
На рис.1, в качестве примера, память раcпределена следующим образом: в 1-м сегменте - область стека, во 2-м - область данных, в 3-м - дополнительная область данных, в 4-м - область программ (кодов). Сегментные регистры CS, SS, DS, ES указывают, с какого адреса начинается область памяти, занимаемая каждым из перечисленных выше сегментов основной памяти. В частности, регистр CS (сегмент кодов), используется для указания, в каком сегменте находится программа. IP (указатель адреса оче- редного кода программы), SP (указатель стека), BP
(указатель базы) представляют собой регистры, указывающие адреса команд и данных в соответствующих сегментах (рис.1 б)).
Для вычисления исполнительного адреса данных необходимо знать
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.