Реклама:

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

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

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

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

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

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

 

Время программирования, человеко-лет

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

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

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

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

 

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

Остальные 90 %

Всего

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

 

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

Остальные 90 %

Всего

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

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

Сравним этот смешанный подход, когда используются и ассемблер, и язык высокого уровня, с подходом, в котором применяется только язык ассемблера (см. табл. 7.1). При втором подходе программа работает примерно на 20 % быстрее (33 секунды против 40), но более чем за тройную цену (50 человеко-лет против 15). Более того, у смешанного подхода есть еще одно преимущество: гораздо проще переписать на ассемблер уже отлаженную процедуру, написанную на языке высокого уровня, чем писать эту процедуру на ассемблере "с нуля". Отметим, что, если бы написание программы занимало ровно 1 год, соотношение между смешанным подходом и подходом, при котором используется только язык ассемблера, составляло бы 4:1 в пользу смешанного подхода.

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

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

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

В-третьих, компилятор должен либо на выходе производить программу, которая может использоваться ассемблером, либо самостоятельно выполнять ассемблирование. Таким образом, знание языка ассемблера существенно для понимания того, как работает компьютер. И вообще, кто-то ведь должен писать компилятор (и его ассемблер).

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

Понятие ассемблера || Оглавление || Формат оператора в ассемблере