Д. Кнут - Искусство программирования том 1 (1119450), страница 40
Текст из файла (страница 40)
Буфера ссылаются один на другой. СОИ ВОРО+10 ЕИО БТАЕТ Конец программы. 1 В отношении этой программы необходимо отметить следующие интересные моменты. 2, Как и в программе М, псевдооперация ЕОО из строки 03 определяет эквивалент символа. В данном случае эквивалентом 1. назначено число 500. (В строках 10 — 24 этой программы Ь представляет количество простых чисел, которые нужно найти.) Обратите внимание, что в строке 05 символу РЕ1МЕ присваивается отрицательный эквивалент; вообще говоря, эквивалентом символа может быть любое число, состоящее из пяти байтов и знака. В строке 07 эквивалент ВОР1 вычисляется по формуле ВОРО+25, что в результате дает 2025. В й1ХАЬ арифметические операции над числами можно выполнять в ограниченном объеме.
Еще один пример арифметической операции появляется в строке 13, в которой ассемблер вычисляет значение РВ1ИЕ+Ь (в данном случае это 499). 3. Символ РВ1ИТЕЕ в строках 25 и 35 используется в Г-части. Р-часть, которая всегда заключается в круглые скобки, может состоять из чисел либо символов точно так, как другие части поля АООВЕЯБ. В строке 31 иллюстрируется спецификация частичного поля "(1: 4)', в котором используется двоеточие.
4. В И1ХАЬ предусмотрено несколько способов определения слов, которые не являются командами. В строке 41 псевдооперация СОМ используется для определения обычной константы, "2"'. В результате трансляции строки 41 получится слово В строке 49 присутствует немного более сложная константа, "ВОР1+10", в результате трансляции которой получится слово 2035 Константа может быть заключена между знаками равенства (см, строки 10 и 11); в этом случае она называется литералом ~или буквенной константой). Ассемблер автоматически создает для буквенных констант внутренние имена и вставляет строки "СОк". Например„в результате трансляции строк 10 и 11 программы Р получится 10 11 Ь01 соп1 Ь02 соп2 а в конце программы, межлу строками 51 и 52, в результате трансляции будут вставлены строки 51а соп1 СОМ И6 соп2 СОН 1-1.
3 1. Строки 01, 02 и 39 начинаются со звездочки. Таким образом обозначается строка комментария, которая содержит только пояснения и не оказывает реального воздействия на транслируемую программу. Трансляция строки 51а дает слово Использовать буквенные константы (литералы), несомненно, удобно, так как программистам не нужно изобретать для тривиальных констант символические имена, а также помнить о том, что в конце каждой программы необходимо вставлять константы.
Таким образом, программист может сосредоточиться на главной задаче и не волноваться по поводу подобных деталей. (Однако нужно заметить, что примеры литералов в программе Р не слишком удачны, поскольку, заменив строки 10 и 11 более эффективными командами "ЕМТ1 1-1," и "ЕИТ2 3", мы несколько улучшили бы программу.) 5. Хороший язык ассемблера должен имитировать ход мыслей программиста при написании машинных программ, Одним из примеров этой философии является использование литералов, о которых только что шла речь.
В качестве другого примера можно привести применение символа "*", которое обсуждалось при описании программы М. А третьим примером является идея использования яокаяьньст символов, таких как символ 2Н, который появляется в поле метки строк 12, 25 и 28. Локальные символы — это специальные символы, которые можно переопределять столько раз, сколько нужно. Глобальный символ, например РВ1МЕ, имеет только одно значение на протяжении всей программы, и если бы он появился в поле метки более чем одной строки, то ассемблер зафиксировал бы ошибку.
Но локальные символы имеют различную природу; например, мы пишем 2Н ("2 Ьеге"— "2 здесь") в поле метки и 2Р ("2 (огкагбь — "2 вперед") или 28 ("2 Ьас1съагсГ'— "2 назад") в адресном поле строки М1ХА)л 2В означает ближайшую предыдущую метку 2Н; 2Р означает ближайшую следующую метку 2Н. Таким образом, символ "2Р" в строке 14 означает ссылку на строку 25, символ "2В" в строке 24 — ссылку назад, на строку 12, а символ "2В" в строке 37 — ссылку на строку 28.
Адрес 2Р или 2В никогда не относится к собственной строке. Например, три строки кода М1ХАЬ 2Н ЕЦО 10 2Н МОЧЕ 2Р(2В), 2Н ЕЦО 2В-3 в сущности, эквивалентны одной строке МОЧЕ ь-3(10). Символы 2Р и 2В никогда не следует использовать в поле метки, а символ 2Н— в поле адреса. Существует десять локальных символов, которые можно получить, заменив в этих примерах "2" любой другой цифрой от О до 9.
Идею локальных символов выдвинул М. Э. Конвей (М. Е. Сопя ау) в 1958 году в связи с разработкой ассемблера для машины 1)1ч1ЪАС 1. Локальные символы освобождают программиста от необходимости выбора символических имен для каждого адреса, когда нужно всего лишь сослаться на команду, находящуюся на расстоянии нескольких строк. Соседним командам не всегда можно придумать подходящие имена, поэтому программисты склонны вводить такие лишенные содержания символы, как Х1, Х2, ХЗ и т.
д., что срздает потенциальную опасность их повторения. Поэтому использовать локальные символы в языке ассемблера очень полезно и совершенно естественно. 6. Адресная часть строк 30 и 38 пуста. Это означает, что в результате трансляции получится нулевой адрес. В строке 17 адресную часть тоже можно было бы оставить пустой, но без этого лишнего О программа стала бы менее наглядной. 7. В строках 43- 47 используется операция АЕР, которая создает пятибайтовую константу в буквенно-цифровом символьном коде М1Х.
Например, в результате трансляции строки 45 получится слово т. е. чаНОМО" (часть слова "пятьсот") — часть строки заголовка в выходных данных программы Р. Все ячейки, содержимое которых не определено в программе М1ХАЬ, обычно обнуляются (за исключением ячеек, которые используются загружающей программой; обычно это ячейки 3700-3999). Поэтому после строки 47 нет необходимости определять пробелы в других словах заголовка. 8. Вместе с операцией ОН10 можно выполнять арифметические действия (см. строки 40, 42 и 48). 9. В последней строке законченной программы на языке М1ХАЕ всегда присутствует код операции ЕМО. Адрес в этой строке указывает на ячейку, с которой начинает выполняться программа после загрузки в память.
10. И в завершение анализа программы Р следует отметить, что ее команды построены так, чтобы значения в индексных регистрах можно было сравнивать с нулем, когда это только возможно. Например, в регистре гП сохраняется величина 3-600, а не 1. Особого внимания в этом смысле заслуживают строки 26-34, хотя разобраться в них, наверное, непросто.
Интересно отметить статистические характеристики, которые наблюдаются во время реальной работы программы Р. Команда деления из строки 19 была выполнена 9 538 раз, а время выполнения строк 10-24 составило 182144и. Программы на языке М1ХАЕ можно перфорировать на картах или набрать на терминале компьютера, как показано на рис. 15. При использовании перфокарт выбирается следующий формат. Но если в колонке 1 содержится звездочка, то все содержимое перфокарты рассматривается как комментарий. Поле АДРЕС заканчивается первой же пустой колонкой (пробелом), следующей за колонкой 16.
Справа от этой первой колонки можно Колонки 1 — 10 Колонки 12-15 Колонки 17-80 Колонки 11, 16 Поле МЕТКА Поле ОП Поле АДРЕС и необязательныс примечания Пустые ° д ДИ ... 11 1 11!П П! 1 ° ! 1 П1 П! 1 ° 1 1 П ° ВВВ111 ° НВНФВФ ° НВ ° $$1 ° и!В!В ° 1 ° 1 ° 11НФВВ ° ° $1 ° Вии ° В!111 ° Н1ВВВНВВНВ ° ВВФ ° ФВВ Ф 4 4 Ф! Ф! Ф Ф 1 Ф 4 Ф Ф Ф 1 Ф Ф Ф! Ф 1 41 4 Ф 1 1 3 Ф Ф 4 Ф Ф Ф Ф Ф Ф Ф! Ф Ф Ф! 4 Ф Ф Ф \ 4! Ф Ф Ф Ф Ф Ф 4 1 Ф Ф Ф Ф 4 з 4 Ф Ф Ф Ф Ф Ф Ф! 4 Ф! 4 4 \ ! г!!! и Ф! Ф г Ф г! и г! и Ф!!! 1 г! и г и Ф 3! ! 1 г и 1 г 3 и ! г ! з г г г г з Ф з з ! з з 3 ! 3 з г г и г Ф г ! Ф и Ф Ф г г Ф и ш и Ь ш з и и г П! з1 п11ю ш ш $ и и ! 3 и ш ! 4 и ш и и и Ф и и г и ш и ш и ! и 144 ° 414 ° 4444444414444444 ° 44414444414444 ° 44 ° 4444 ° 444 ° 44 ° 444444 ° 4444 ° 4444444444 ° 44 $$1$1$ ° $1пн$3 ° !1$1$$н$$1НФн3$$11 ° $$$$$$ ° НФФШНФИФ ° 1н1$1$н<1 ° $11$11$3Н 1 ° ° <и!Ни!1!НннвннвпПФВнннпнииФННННФпинпппнвввВ ° 14 ° 11 11111Ф1ззз1гз1эгззгзнзиззгззз1изззгзпзиззиизэизгзззззззгзэззззэззэизгн 1 Ф 1 4 в В В и Ф 1 $ и Ф $ $ $ П! и и ° ! 1 1 ° 1 и в Ф 1! В 1 В и 4 и и 3 Ф В и и 1 1 в 4 1 1 и $1 4 ° п 4 3 1 $1 Ф и в 1 и и! ° 1111$$11$11ип3$1иВНФВФиИВФФивюиФФФФНФФФФиииФФНФви3131$$4из ° $1 4 ПРИИЕР ПРСГРАИИЫ...