Физика атомного реактора Сопротивление материалов Математика решение задач Информатика Атомная энергетика безопасность Электротехника и электроника
Знакомство с ассемблером Формат оператора Директивы Макроопределение Макровызовы Макросы с параметрами Процесс ассемблирования Компиляция Задачи компоновщика Динамическая компоновка

Назначение ассемблера

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

Но зачем же тогда вообще писать программы на ассемблере? Есть две причины: производительность и доступ к аппаратуре. Прежде всего, квалифицированный программист, пишущий на ассемблере, может составить гораздо меньшую по объему и гораздо более быстродействующую программу, чем программа, написанная на языке высокого уровня. Для некоторых программ быстродействие и объем имеют чрезвычайно важное значение. К этой категории относятся многие встроенные прикладные программы (например, в смарт-картах, сотовых телефонах, драйверах устройств) и процедуры BIOS.

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

Первая причина (достижение высокой производительности) является более важной, поэтому мы рассмотрим ее подробнее. В большинстве программ лишь небольшой процент всего кода сказывается на времени выполнения программы. Обычно 1 % кода отвечает за 50 % времени выполнения, а 10 % кода — за 90 % времени выполнения.

Предположим, что для написания программы на языке высокого уровня требуется 10 человеко-лет, а полученной программе нужно 100 секунд, чтобы выполнить некоторую типичную контрольную программу. (Контрольной называют тестовую программу, которая используется для сравнения компьютеров, компиляторов и т. п.) Написание всей программы на ассемблере может занять 50 человеко-лет. Полученная в результате контрольная программа будет выполняться примерно 33 секунды, поскольку хороший программист может оказаться в три раза умнее компилятора (хотя об этом можно спорить бесконечно). Ситуацию иллюстрирует табл. 7.1.

Таблица 7.1. Сравнение программирования на ассемблере и языке высокого уровня

Время программирования,

Время выполнения

человеко-лет

программы, с

Язык ассемблера 50

33

Язык высокого уровня 10

100

Смешанный подход до подстройки

Критические 10 % 1

90

Остальные 90 % 9

10

Всего 10

100

Смешанный подход после подстройки

Критические 10 % 6

30

Остальные 90 % 9

10

Всего 15

40

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

Предположим, что 10 % программы отвечает за 90 % времени ее выполнения. Это значит, что из 100 секунд работы 90 секунд выполняется десятая часть программы, а 10 секунд — оставшиеся 90 %. Эти 10 % программы можно усовершенствовать, переписав на ассемблере. Этот процесс называется подстройкой (tuning). На подстройку основных процедур потребуется еще 5 человеко-лет, но время выполнения программы сократится с 90 до 30 секунд.


Экспертные системы и экспертный анализ Архитектура компьютера Уровень ассемблера