
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Сегментация памяти
Первая PC имела 16 бит адреса. В дальнейшем в модели IBM PC XT разрядность шины адреса (ША) стала 20 бит, что привело к идее сегментации памяти.
Процессор рассматривает память как группу сегментов. Сегмент представляет собой единицу размером 64К. Это вызвано тем, что регистры микропроцессора 16-тиразрядные, 2^16=65536=64К. Все исполняемые программы используют один или более сегментов. Сегменты различаются по назначению: сегмент данных, сегмент стека и сегмент команд.
Сегменты располагаются в памяти с адресов кратных 16, шестнадцатеричный адрес сегмента содержит 0 в младшей тетраде. Например: 0Е840, 5FF40. В связи с этим младшая цифра адреса не записывается и считается, что адрес сегмента задается в параграфах: 0Е84 и 5FF4. Параграф – это шестнадцать байт ОЗУ, расположенные последовательно с адреса кратного шестнадцати. Такая адресация сегментов позволила 20-тиразрядный адрес располагать в 16-тиразрядном регистре процессора.
Если бы программе выделялись сегменты размером 64К, то для любой EXE-программы требовалось бы 3 сегмента (минимум 192К). Однако программные сегменты имеют минимально допустимые размеры. Например, на рис. показано расположение в памяти небольшой EXE-программы. Сегмент стека занимает 64 байт. Это – минимальный рекомендуемый объем, который требуется для сегмента стека. Для отладки программы мы будем использовать программу td.exe, которая использует память сегмента стека. Вслед за ним располагается сегмент данных, который занимает 14 байт. Сегмент кода (программы) располагается через 2 байта за сегментом данных. Два байта пропущены, так как адрес любого сегмента кратен 16. Сегмент кода занимает 37 байт или 3 параграфа. В итоге программа занимает 8 параграфов памяти. Такая модель программы в языке Си называется компактной (compact) и позволяет создавать программы с минимальным размером памяти.
0437Fh┌───────┐
04380h├───────┤ ──┐
├───────┤ │
│ | │ │ CЕГМЕНТ СТЕКА
043BFh├───────┤ │ >=64БАЙТА
043C0h├───────┤ ──┤
├───────┤ │ CЕГМЕНТ ДАННЫХ
│ | │ │ 14 БАЙТ.
043CDh├───────┤ │
043CEh├───────┤ ──┤
043CFh├───────┤ │ НЕИСПОЛЬЗУЕМЫЕ БАЙТЫ ПАМЯТИ
043D0h├───────┤ ──┤
├───────┤ │
│ | │ │ СEГМЕНТ ПРОГРАММЫ
043F5h├───────┤ │ 25H=37БАЙТ
043F6h├───────┤ ──┘
└───────┘
Логические и физические адреса памяти
Физический адрес представляет собой 20-ти битовое значение, которое выставляется на шину адреса (ША) при обращении к памяти. Диапазон адресов 0h..0FFFFFh -адресное пространство 1 МБ. В ассемблере шестнадцатеричные константы заканчиваются буквой h. Если первая шестнадцатеричная цифра задана одной из следующих букв A, B, C, D, E, F, то впереди добавляется цифра 0 (ноль).
Логический адрес состоит из двух 16-ти битовых беззнаковых значений: базового (начального) адреса сегмента и смещения адреса ячейки внутри сегмента. Диапазон значений смещения 0h..0FFFFh, то есть позволяет адресовать любой байт 64К сегмента. Смещение адреса относительно начала сегмента будем называть эффективным или исполнительным адресом (ЕА), так как на программном уровне можно не рассматривать аппаратное вычисление физического адреса.
Для хранения адресов сегментов в процессоре предусмотрены 4 сегментных регистра (адреса даны для предыдущего примера):
CS – code segment 043D0h
DS – data segment 043C0h
SS – stack segment 04380h
ES – сегмент расширения (используется, например, в некоторых операциях со строками).
Сегментные регистры – 16-ти разрядные.
В процессе выполнения программы в сегментные регистры загружены адреса «текущих» сегментов. Большие EXE-программы могут использовать несколько сегментов данных и сегментов кодов. В определенный момент производится выборка команды из текущего сегмента кода, и команда обрабатывает данные из текущего сегмента данных.
┌───────┐
┌───────────────────┤ 043Ch │ <- DS
V └───────┘
┌─────────┐─────────┐
0h-1h │ A1 - СЛОВО │
├─────────┤─────────┘
2h │ В1-БАЙТ │
├─────────┤─────────┐
3h-4h │ A2 - СЛОВО │
├─────────┤─────────┤
5h-6h │ A3 - СЛОВО │
├─────────┤─────────┤
7h-8h │ A4 - СЛОВО │
└─────────┘─────────┘
Логический адрес переменных, расположенных в сегменте данных,будем записывать в виде DS:OFFSET.
Смещение переменной может располагаться в каком-либо регистре микропроцессора (МП) или же входить в состав команды. При вычислении физического адреса используется сумматор адресов.
сегмент| |смещение
16 \ \ 16
| |
v v
┌───┴──┐ ┌─┴────┐
└┐ └─┘ ┌┘
└┐СУМ.АДРЕСОВ┌┘
└─────┬─────┘
└───/────>ША <- Физический адрес
20
Перед сложением адрес сегмента дополняется справа нулевой тетрадой.
1) Физический адрес переменной B1:
– адрес сегмента
– адрес смещения
– физический адрес
2) Физический адрес переменной A4:
– адрес сегмента
– адрес смещения
– физический адрес