10.04. Программный пример
Примеры, приведенные выше, наводят на мысль о тяге языка ассемблера к многословию; требуется множество маленьких шажков для того, чтобы сделать в общем-то простую вещь. Вот пример другого рода: допустим, вам необходимо инкрементировать число N, если оно равно другому числу - М. Таким будет типичный крошечный фрагмент большой программы, и на языках высокого уровня такое действие будет выполняться единственной командой:
На ассемблере МП 8086 эти действия будут выглядеть, как показано в программе 10.2. Программа-ассемблер превратит этот набор мнемонических выражений в машинные коды, как правило, транслируя каждую строку исходного ассемблерного текста в несколько байтов машинных команд, и полученные коды машинных команд прежде чем быть исполненными, будут загружены в последовательно расположенные ячейки памяти. Отметим, что ассемблеру надо указать на необходимость выделения некоторого объема памяти под переменные. Это делается с помощью ассемблерного псевдооператора DW (Define -определить слово) (этот оператор является псевдооператором, так как ему не соответствует никакой исполняемый код). Для того чтобы помечать команды, могут быть использованы уникальные символьные метки (например, NEXT). Команды обычно помечаются лишь в тех случаях, когда на них осуществляется переход (JNZ NEXT).
Присваивая переменным понятные вам самому имена и вводя комментарии (отделенные точкой с запятой), вы облегчаете себе процесс программирования; эти рекомендации означают также, что у вас будет шанс несколькими неделями позже понять, что вы написали. Программирование на языке ассемблера может по-прежнему оставаться неприятным делом, однако часто на этом языке бывает необходимо написать короткую процедуру управления вводом-выводом, вызываемую из программы, написанной на языке высокого уровня. Программы на языке ассемблера работают быстрее, чем скомпилированные с языка высокого уровня, так что их часто используют там, где показатель скорости работы является решающим (например, во многократно выполняемых внутренних циклах численных вычислений большого объема). Разработка языка программирования Си, обладающего большими возможностями, минимизировала количество тех случаев, когда вы должны использовать ассемблерные программы, тем самым расширив сферу применимости Си. В любом случае вам трудно будет понять, как отдельные узлы компьютера работают совместно, без уяснения существа ассемблерных команд ввод-вывода. Соответствие между мнемоникой языка ассемблера и исполняемыми машинными командами будет изучено ниже в разд. 11.03, где будет проиллюстрировано примерами программирования МП 68000.