Опубликован: 21.08.2007 | Доступ: свободный | Студентов: 1543 / 95 | Оценка: 4.23 / 3.74 | Длительность: 15:37:00
Лекция 3:

Ассемблер

< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Аннотация: Рассматривается парадигма низкоуровневого программирования на ассемблере. Эта парадигма нацелена на учет основных особенностей компьютерных архитектур. Описаны основные методы адресации памяти. Дано определение языково-ориентированной абстрактной машины. Изучается понятие абстрактной машины (secd) для определения операционной семантики языка программирования по Венской методике

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

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

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

Процесс ассемблирования заключается в следующим:

  • Резервирование памяти для последовательности команд, образующих ассемблируемую программу.
  • Сопоставление используемых идентификаторов с адресами в памяти.
  • Отображение ассемблерных команд и идентификаторов в их машинные эквиваленты.

Для реализации такого процесса требуется счетчик адресов и таблица идентификаторов.

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

Кроме символических представлений команд ассемблерная программа содержит описания распределяемой памяти и директивы управления ассемблированием. Обычно выделена точка входа в программу из операционной системы.

Программирование на ассемблере подразумевает знание специфики системы команд процессора, методов обслуживания устройств и обработки прерываний. Система команд может быть расширена микропрограммами и системными вызовами в зависимости от комплектации оборудования и операционной системы. Это влияет на решения по адресации памяти и коммутации комплекта доступных устройств. Но есть и достаточно общие соглашения о представлении и реализации средств обработки информации на уровне машинного кода [ [ 1 ] , [ 20 ] , [ 36 ] , [ 55 ] , [ 56 ] , [ 71 ] , [ 72 ] ].

Структура кода программы и его свойства:

  • Перемещаемость. Удобно, чтобы код программы был устроен так, что его можно расположить по любому абсолютному адресу.
  • Листание страниц памяти. Соотношение между адресуемой и реально доступной памятью может требовать пересмотра в процессе выполнения программы.
  • Зависимость от данных. Программа должна учитывать готовность и обновление данных, особенно в случае обмена информацией через порты или буферы устройств.
  • Динамика размещения. Программа может размещаться в памяти пошаговым образом, методом раскрутки, с использованием динамической оптимизации, учитывающей статистику реального использования ее составляющих.

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

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

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

Число слов, отводимое ассемблером под одну символическую команду, зависит не только от собственно кода команды, но и от метода адресации операндов, а возможно и от других аспектов кодирования программ и данных, обсуждение которых здесь не предусмотрено. Достаточно констатировать, что программа при ассемблировании распадается на конечные последовательности команд K1 ... Kn, которым сопоставляются конечные интервалы машинных слов W1 ... Wm(a) в зависимости от а - системы аспектов кодирования.

[K1 ... Kn] -> [W1 ... Wm(a)]

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

В зависимости от команды используются разные методы адресации операндов:

  • неявная - команда сама "знает", где и что она обрабатывает, где берет данные и куда разместит результат;
  • непосредственная - операнд расположен непосредственно в команде;
  • прямые адреса - код адреса размещен в поле операнда;
  • индексируемые адреса - один из операндов используется как индекс при вычислении адреса других операндов;
  • базируемых (по регистру) - указан базовый регистр для пересчета адресов операндов;
  • относительные (по текущей позиции) - адресация учитывает адрес размещения команды;
  • косвенные (через промежуточное слово) - операнд указывает на слово, хранящее адрес значения;
  • модифициуемые (по значению-регистру) - один операнд указывает на слово, хранящее значение, модифицирующее адрес другого операнда;
  • стек - операнд, доступ к которому подчинен дисциплине стека - "первый пришел - последний ушел".
< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Берик Тереков
Берик Тереков
Казахстан, Астана