
- •Лабораторная работа №1
- •Знакомство с Assembler
- •Регистры процессора i8086
- •Представление данных
- •Представление команд
- •Метка: Мнемокод Операнды Комментарий
- •Адресация памяти
- •Запуск программы
- •Структура программы
- •Последовательность создания исполняемого файла
- •Отладка программы
- •Практические задания
- •Вопросы к защите
Адресация памяти
Как было уже сказано выше, каждому байту соответствует свой уникальный адрес, называемый физическим.
Диапазон значений физических адресов зависит от разрядности шины адреса процессора. Процессор 8086 имел 20-разрядную шину адреса и мог получить доступ лишь к 1 Мбайт памяти − от 0 до 220–1. Для i486 и Pentium он находится в пределах от 0 до 232–1, т.е. 4 Гбайт. Для процессоров Pentium Pro/II/III/IV этот диапазон шире − от 0 до 236–1, т.е. 64 Гбайт. Современные процессоры имеют 64-разрядную шину адреса.
Все процессоры эмулируют режим процессора 8086, исходя из этого, а также для упрощения мы будем рассматривать методы представления адреса 20 битами. Первый байт в этом случае имеет адрес 0, последний имеет адрес 1048575 или FFFF в шестнадцатеричной системе счисления.
И
Рис. 6. Сегментация памяти
Д
Рис. 7. Создание 20-битового физического
адреса
Значения начала сегмента и смещения пишут в шестнадцатеричной системе счисления и через двоеточие, например, 0040:0201. Представленный в таком виде адрес называется логическим.
Чтобы от логического адреса перейти к физическому, требуется преобразовать 0040 и 0201 в двоичную систему счисления, сдвинуть значения начала сегмента (0040) на 4 разряда и прибавить к нему значение смещения. Полученное значение перевести обратно в шестнадцатеричную систему счисления. Тот же результат, но без перевода в двоичную систему, можно получить, если сместить 0040 на 1 разряд влево (получится 0400) и прибавить к нему 0201. И в первом, и втором случае получим значение 0601h.
Запуск программы
Когда пользователь запускает программу, ее код и используемые ей данные помещаются в оперативную память. Так как и данные, и команды хранятся в двоичном виде, во избежание путаницы они располагаются в разных местах.
Если программа имеет маленький код и для ее данных требуется мало место (такие программы обычно создают с расширением com), то и код, и данные помещаются в один сегмент размером 64 Кбайт. В случае, если программа имеет больший объем, под ее код и данные отводится различные сегменты размером до 64 Кбайт. Такие программы создают с расширением exe. Далее мы будем создавать именно exe-программы.
Кроме сегментов данных и кода создаются еще сегменты для стека (его рассмотрим в следующей лабораторной работе) и дополнительный сегмент, не зависимо от того, намерен пользователь обращаться к ним или нет.
Чтобы процессор знал, где находятся код, данные и стек программы, используются сегментные регистры:
регистр сегмента cs кода указывает на начало сегмента кода;
регистр сегмента данных ds указывает на начало сегмента данных;
регистр сегмента ss стека указывает на начало сегмента стека;
дополнительный сегментный регистр es является вспомогательным и при запуске программы указывает на начало сегмента данных, но может указывать и на дополнительный четвертый сегмент.
Сегментные регистры являются строго специализированными. Над ними нельзя выполнять арифметических операций или хранить в них результаты других операций.
Для обращения к конкретной команде, хранящейся, как и остальные, в одном сегменте, необходимо знать не только адрес начала сегмента кода, но и значение смещения относительно этого сегмента. Это смещение хранится в командном указателе ip − также строго специализированном. После запуска программы пара регистров cs и ip (пишется cs:ip) указывают на адрес первой команды: cs − на начало сегмента, ip − на смещение (рис. 8).
Рис. 8. Сегментные регистры
Для обращения к конкретной области памяти из сегмента данных используют регистры si и di, а также регистры dx и bx. Работу с этими регистрами рассмотрим позже.
Для работы со стеком аналогичным образом используются регистры sp и bp.