Язык ассемблера - Assembly language

язык ассемблера
Motorola 6800 Assembly Language.png
Типичный вторичный выход из ассемблера - показывает исходный язык ассемблера (справа) для Motorola MC6800 и в собранном виде
ПарадигмаИмператив, неструктурированный
Впервые появился1949; 71 год назад (1949)

В компьютерное программирование, язык ассемблера (или же язык ассемблера),[1] часто сокращается как м, любой язык программирования низкого уровня в котором существует очень сильное соответствие между инструкциями на языке и архитектуры Машинный код инструкции.[2] Поскольку сборка зависит от инструкций машинного кода, каждый язык ассемблера предназначен только для одной конкретной компьютерной архитектуры. Язык ассемблера также можно назвать символьный машинный код.[3][4]

Код сборки преобразуется в исполняемый машинный код с помощью служебная программа упоминается как ассемблер. Процесс преобразования называется сборка, как в сборка то исходный код. В языке ассемблера обычно есть один оператор на машинную инструкцию (1: 1), но Комментарии и операторы ассемблера директивы,[5] макросы,[6][1] и символический этикетки программы и места в памяти часто также поддерживаются.

Термин «ассемблер» обычно относят к Уилкс, Уиллер и Gill в своей книге 1951 года Подготовка программ для ЭЦП.,[7] которые, однако, использовали этот термин для обозначения «программы, которая собирает другую программу, состоящую из нескольких разделов, в единую программу».[8]

Каждый язык ассемблера специфичен для определенного компьютерная архитектура а иногда и Операционная система.[9] Однако некоторые языки ассемблера не предоставляют конкретных синтаксис для вызовов операционной системы, и большинство языков ассемблера могут универсально использоваться с любой операционной системой, поскольку язык обеспечивает доступ ко всем реальным возможностям процессор, на котором все системный вызов механизмы в конечном итоге отдыхают. В отличие от языков ассемблера, большинство языки программирования высокого уровня обычно портативный через несколько архитектур, но требует устный перевод или же составление, задача гораздо более сложная, чем сборка.

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

Синтаксис языка ассемблера

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

Терминология

  • А макроассемблер включает макрокоманда возможность, чтобы (параметризованный) текст на языке ассемблера мог быть представлен именем, и это имя можно было использовать для вставки расширенного текста в другой код.
  • А кросс-ассемблер (смотрите также кросс-компилятор ) - это ассемблер, запускаемый на компьютере или Операционная системахозяин system) другого типа, нежели система, в которой должен выполняться полученный код ( целевая система). Кросс-сборка облегчает разработку программ для систем, не имеющих ресурсов для поддержки разработки программного обеспечения, таких как Встроенная система или микроконтроллер. В таком случае результирующий объектный код должны быть переданы в целевую систему через только для чтения памяти (ПЗУ, EPROM и др.), программист (когда постоянная память интегрирована в устройство, как в микроконтроллерах), или канал передачи данных, использующий либо точную побитовую копию объектного кода, либо текстовое представление этого кода (например, Intel шестнадцатеричный или же Motorola S-рекорд ).
  • А ассемблер высокого уровня - это программа, которая предоставляет языковые абстракции, чаще связанные с языками высокого уровня, такие как расширенные управляющие структуры (ЕСЛИ / ТО / ИНАЧЕ, DO CASE и т. Д.) И абстрактные типы данных высокого уровня, включая структуры / записи, объединения, классы и множества.
  • А микросборщик это программа, которая помогает подготовить микропрограмма, называется прошивка, для управления низкоуровневой работой компьютера.
  • А мета-ассемблер это «программа, которая принимает синтаксическое и семантическое описание языка ассемблера и генерирует ассемблер для этого языка».[10] Ассемблеры "Meta-Symbol" для SDS 9 серии и SDS Sigma серии компьютеров являются мета-ассемблерами.[11][nb 1] Сперри Юнивак также предоставил мета-ассемблер для UNIVAC серии 1100/2200.[12]
  • встроенный ассемблер (или же встроенный ассемблер) - это код ассемблера, содержащийся в программе на языке высокого уровня.[13] Это чаще всего используется в системных программах, которым требуется прямой доступ к оборудованию.

Ключевые идеи

Ассемблер

An ассемблер программа создает объектный код к Идет перевод комбинации мнемоники и синтаксис для операций и режимов адресации в их числовые эквиваленты. Это представление обычно включает код операции ("код операции "), а также другие элементы управления биты и данные. Ассемблер также вычисляет константные выражения и разрешает символические имена для ячеек памяти и других объектов.[14] Использование символических ссылок - ключевая особенность ассемблеров, позволяющая избежать утомительных вычислений и обновления адресов вручную после модификации программы. Большинство ассемблеров также включают макрос средства для выполнения текстовой замены - например, для генерации общих коротких последовательностей инструкций как в соответствии, вместо называется подпрограммы.

Некоторые ассемблеры также могут выполнять некоторые простые типы Набор инструкций -специфический оптимизации. Одним из конкретных примеров этого может быть повсеместная x86 монтажники от различных производителей. Называется размер скачка,[14] большинство из них могут выполнять замену инструкций перехода (длинные переходы заменяются короткими или относительными переходами) за любое количество проходов по запросу. Другие могут даже выполнять простую перестановку или вставку инструкций, например, некоторые ассемблеры для RISC архитектуры что может помочь оптимизировать разумный планирование инструкций использовать Конвейер процессора максимально эффективно.[нужна цитата ]

Ассемблеры были доступны с 1950-х годов как первый шаг по сравнению с машинным языком и до языки программирования высокого уровня Такие как Фортран, Алгол, Кобол и Лисп. Так же было несколько классов переводчиков и полуавтоматических генераторы кода со свойствами, аналогичными языкам ассемблера и языков высокого уровня, с Speedcode как, возможно, один из наиболее известных примеров.

Сборщиков может быть несколько с разными синтаксис для конкретного ЦПУ или же архитектура набора команд. Например, инструкция по добавлению данных из памяти в регистр в x86 -семейный процессор может быть добавить eax, [ebx], в оригинале Синтаксис Intel, тогда как это будет написано addl (% ebx),% eax в Синтаксис AT&T используется Ассемблер GNU. Несмотря на разный внешний вид, разные синтаксические формы обычно генерируют одни и те же числовые Машинный код. У одного ассемблера также могут быть разные режимы для поддержки вариаций синтаксических форм, а также их точных семантических интерпретаций (например, FASM -синтаксис, ТАСМ -синтаксис, идеальный режим и т. д., в частном случае сборка x86 программирование).

Количество проходов

Есть два типа ассемблеров в зависимости от того, сколько проходов через исходный код необходимо (сколько раз ассемблер читает исходный код) для создания объектного файла.

  • Сборщики за один проход пройтись по исходному коду один раз. Для любого символа, использованного до его определения, потребуется "опечатка" в конце объектного кода (или, по крайней мере, не ранее точки, где определен символ), сообщая компоновщик или загрузчик, чтобы «вернуться» и перезаписать местозаполнитель, который был оставлен там, где использовался еще не определенный символ.
  • Многопроходные сборщики создайте таблицу со всеми символами и их значениями на первых проходах, а затем используйте таблицу в последующих проходах для генерации кода.

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

Первоначальной причиной использования однопроходных ассемблеров был размер памяти и скорость сборки - часто второй проход требовал сохранения таблицы символов в памяти (для обработки пересылка ссылок ), перематывая и перечитывая исходник программы на Лента, или перечитывая колоду открытки или же перфорированная бумажная лента. В более поздних компьютерах с гораздо большей памятью (особенно на дисках) было достаточно места для выполнения всей необходимой обработки без повторного чтения. Преимущество многопроходного ассемблера заключается в том, что отсутствие ошибок делает процесс связывания (или загрузка программы если ассемблер напрямую создает исполняемый код) быстрее.[15]

Пример: в следующем фрагменте кода однопроходный ассемблер сможет определить адрес обратной ссылки BKWD при сборке заявления S2, но не сможет определить адрес прямой ссылки ВПЕРЕД при сборке оператора ветки S1; в самом деле, ВПЕРЕД может быть неопределенным. Двухпроходный ассемблер определит оба адреса на проходе 1, поэтому они будут известны при генерации кода на проходе 2.

S1   B ВПЕРЕД  ...ВПЕРЕД   EQU * ...BKWD  EQU * ...S2    B BKWD

Сборщики высокого уровня

Более сложный ассемблеры высокого уровня предоставить языковые абстракции, такие как:

Видеть Языковой дизайн ниже для более подробной информации.

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

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

Например, инструкция ниже сообщает x86 /IA-32 процессор для перемещения немедленное 8-битное значение в регистр. Двоичный код этой инструкции - 10110, за которым следует 3-битный идентификатор регистра, который следует использовать. Идентификатор для AL регистр 000, поэтому следующие Машинный код загружает AL зарегистрируйтесь с данными 01100001.[17]

10110000 01100001

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

B0 61

Здесь, B0 означает «Переместить копию следующего значения в AL, и 61 является шестнадцатеричным представлением значения 01100001, что составляет 97 в десятичный. Ассемблер для семейства 8086 обеспечивает мнемонический MOV (сокращение от двигаться) для таких инструкций, поэтому приведенный выше машинный код может быть написан на языке ассемблера следующим образом, с пояснительным комментарием, если требуется, после точки с запятой. Это намного легче читать и запоминать.

MOV AL, 61ч       ; Загрузить AL с 97 десятичным (61 шестнадцатеричным)

В некоторых языках ассемблера (включая этот) одна и та же мнемоника, такая как MOV, может использоваться для семейства связанных инструкций для загрузки, копирования и перемещения данных, будь то непосредственные значения, значения в регистрах или ячейки памяти, на которые указывает значения в регистрах или по непосредственным (a / k / a прямым) адресам. Другие ассемблеры могут использовать отдельные мнемоники кода операции, такие как L для «перемещения памяти в регистр», ST для «перемещения регистра в память», LR для «перемещения регистра в регистр», MVI для «немедленного перемещения операнда в память» и т. Д.

Если одна и та же мнемоника используется для разных инструкций, это означает, что мнемоника соответствует нескольким различным двоичным кодам инструкций, исключая данные (например, 61ч в этом примере), в зависимости от операндов, следующих за мнемоникой. Например, для процессоров x86 / IA-32 синтаксис языка ассемблера Intel MOV AL, AH представляет собой инструкцию, которая перемещает содержимое регистра AH в регистр AL. В[nb 2] шестнадцатеричная форма этой инструкции:

88 E0

Первый байт, 88h, определяет перемещение между регистром байтового размера и другим регистром или памятью, а второй байт, E0h, кодируется (с тремя битовыми полями), чтобы указать, что оба операнда являются регистрами, источником является AH, а пункт назначения AL.

В таком случае, когда одна и та же мнемоника может представлять более одной двоичной инструкции, ассемблер определяет, какую команду генерировать, проверяя операнды. В первом примере операнд 61ч является допустимой шестнадцатеричной числовой константой и недопустимым именем регистра, поэтому только B0 инструкция может быть применима. Во втором примере операнд AH является допустимым именем регистра, а не допустимой числовой константой (шестнадцатеричной, десятичной, восьмеричной или двоичной), поэтому только 88 инструкция может быть применима.

Языки ассемблера всегда разрабатываются таким образом, что такая однозначность повсеместно обеспечивается их синтаксисом. Например, в ассемблере Intel x86 шестнадцатеричная константа должна начинаться с цифровой цифры, чтобы шестнадцатеричное число 'A' (равное десятичной десятке) было записано как 0Ач или же 0AH, нет AH, в частности, чтобы оно не могло быть именем регистра AH. (Это же правило также предотвращает двусмысленность имен регистров BH, CH, и DH, а также с любым пользовательским символом, заканчивающимся буквой ЧАС и в противном случае содержит только символы, которые являются шестнадцатеричными цифрами, например слово «ПЛЯЖ».)

Возвращаясь к исходному примеру, в то время как код операции x86 10110000 (B0) копирует 8-битное значение в AL регистр, 10110001 (B1) перемещает его в CL и 10110010 (Би 2) делает это в DL. Примеры для них на языке ассемблера приведены ниже.[17]

MOV AL, 1 час        ; Загрузить AL с немедленным значением 1MOV CL,         ; Загрузить CL немедленным значением 2MOV DL,         ; Загрузить DL немедленным значением 3

Синтаксис MOV также может быть более сложным, как показывают следующие примеры.[18]

MOV EAX, [EBX]	  ; Переместите 4 байта памяти по адресу, содержащемуся в EBX, в EAXMOV [ESI+EAX], CL ; Переместить содержимое CL в байт по адресу ESI + EAXMOV DS, DX        ; Переместить содержимое DX в сегментный регистр DS

В каждом случае мнемоника MOV транслируется ассемблером непосредственно в один из кодов операций 88-8C, 8E, A0-A3, B0-BF, C6 или C7, и программисту обычно не нужно знать или запоминать какой.[17]

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

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

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

Два примера процессоров с двумя разными наборами мнемоник - это семейство Intel 8080 и Intel 8086/8088. Поскольку Intel заявила об авторских правах на свою мнемонику на языке ассемблера (по крайней мере, на каждой странице своей документации, опубликованной в 1970-х и начале 1980-х годов), некоторые компании, которые самостоятельно производили процессоры, совместимые с наборами инструкций Intel, изобрели свои собственные мнемоники. В Зилог Z80 CPU, усовершенствование Intel 8080A, поддерживает все инструкции 8080A и многие другие; Zilog изобрел совершенно новый язык ассемблера не только для новых инструкций, но и для всех инструкций 8080A. Например, если Intel использует мнемонику MOV, МВИ, LDA, STA, LXI, LDAX, STAX, LHLD, и SHLD для различных инструкций по передаче данных язык ассемблера Z80 использует мнемонический LD для всех. Похожий случай - это NEC V20 и V30 Процессоры, улучшенные копии Intel 8086 и 8088 соответственно. Как и Zilog с Z80, NEC изобрела новую мнемонику для всех инструкций 8086 и 8088, чтобы избежать обвинений в нарушении авторских прав Intel. (Сомнительно, могут ли такие авторские права быть действительными, и более поздние производители процессоров, такие как AMD[№ 3] и Cyrix переиздал мнемонику инструкций Intel x86 / IA-32 без разрешения и без штрафных санкций.) Сомнительно, что на практике многие люди, которые программировали V20 и V30, действительно писали на ассемблере NEC, а не на языке Intel; поскольку любые два языка ассемблера для одной и той же архитектуры набора инструкций изоморфны (наподобие английского и Pig Latin), нет необходимости использовать собственный опубликованный язык ассемблера производителя с продуктами этого производителя.

Языковой дизайн

Основные элементы

Авторы ассемблеров сильно различаются в способах категоризации операторов и в используемой ими номенклатуре. В частности, некоторые описывают что-либо, кроме машинной мнемоники или расширенной мнемоники, как псевдооперацию (псевдооперацию). Типичный язык ассемблера состоит из 3 типов инструкций, которые используются для определения программных операций:

Мнемоника опкодов и расширенная мнемоника

Инструкции (инструкции) на языке ассемблера, как правило, очень просты, в отличие от инструкций в языки высокого уровня. Как правило, мнемоника - это символическое имя для одной исполняемой инструкции машинного языка ( код операции ), и для каждой инструкции машинного языка определен как минимум один мнемонический код операции. Каждая инструкция обычно состоит из операция или же код операции плюс ноль или больше операнды. Большинство инструкций относятся к одному значению или к паре значений. Операнды могут быть непосредственными (значение, закодированное в самой инструкции), регистрами, указанными в инструкции или подразумеваемыми, или адресами данных, расположенными в другом месте в хранилище. Это определяется базовой архитектурой процессора: ассемблер просто отражает, как эта архитектура работает. Расширенная мнемоника часто используются для указания комбинации кода операции с конкретным операндом, например, ассемблеры System / 360 используют B как расширенная мнемоника для до н.э с маской 15 и NOP («NO OPeration» - ничего не делать за один шаг) для до н.э с маской 0.

Расширенная мнемоника часто используются для поддержки специального использования инструкций, часто для целей, не очевидных из названия инструкции. Например, у многих ЦП нет явной инструкции NOP, но есть инструкции, которые можно использовать для этой цели. В процессорах 8086 инструкция xchg топор,топор используется для нет, с нет псевдо-код операции для кодирования инструкции xchg топор,топор. Некоторые дизассемблеры распознают это и расшифруют xchg топор,топор инструкция как нет. Аналогичным образом ассемблеры IBM для Система / 360 и Система / 370 использовать расширенную мнемонику NOP и НЕТ ПР за до н.э и BCR с нулевыми масками. Для архитектуры SPARC они известны как синтетические инструкции.[19]

Некоторые ассемблеры также поддерживают простые встроенные макрокоманды, которые генерируют две или более машинных инструкции. Например, у некоторых ассемблеров Z80 инструкция ld hl, bc признано генерировать ld l, c с последующим ld h, b.[20] Иногда их называют псевдо-коды операций.

Мнемоника - это произвольные символы; в 1985 г. IEEE опубликовал Стандарт 694 для унифицированного набора мнемоник, который будет использоваться всеми ассемблерами. С тех пор стандарт был отменен.

Директивы данных

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

Директивы сборки

Директивы сборки, также называемые псевдоопкодами, псевдооперациями или псевдооперациями, представляют собой команды, данные ассемблеру, «предписывающие ему выполнять операции, отличные от инструкций сборки».[14] Директивы влияют на то, как работает ассемблер, и «могут влиять на объектный код, таблицу символов, файл листинга и значения внутренних параметров ассемблера». Иногда термин псевдо-код операции зарезервирован для директив, генерирующих объектный код, например тех, которые генерируют данные.[21]

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

Символьные ассемблеры позволяют программистам ассоциировать произвольные имена (этикетки или же символы) с ячейками памяти и различными константами. Обычно каждой константе и переменной дается имя, поэтому инструкции могут ссылаться на эти местоположения по имени, тем самым продвигая самодокументирующийся код. В исполняемом коде имя каждой подпрограммы связано с ее точкой входа, поэтому любые вызовы подпрограммы могут использовать ее имя. Внутри подпрограмм, ИДТИ К адресатам присвоены ярлыки. Некоторые ассемблеры поддерживают местные символы которые часто лексически отличаются от обычных символов (например, использование «10 $» в качестве пункта назначения GOTO).

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

Языки ассемблера, как и большинство других компьютерных языков, позволяют добавлять комментарии к программе. исходный код это будет проигнорировано во время сборки.Разумное комментирование важно в программах на ассемблере, поскольку значение и цель последовательности двоичных машинных инструкций может быть трудно определить. «Необработанный» (раскомментированный) язык ассемблера, созданный компиляторами или дизассемблерами, довольно трудно читать, когда необходимо внести изменения.

Макросы

Многие ассемблеры поддерживают предопределенные макросы, и другие поддерживают определяется программистом (и многократно переопределяемые) макросы, включающие последовательности текстовых строк, в которые встроены переменные и константы. Определение макроса чаще всего[№ 4] смесь операторов ассемблера, например директив, символических машинных инструкций и шаблонов для операторов ассемблера. Эта последовательность текстовых строк может включать коды операций или директивы. После определения макроса его имя может использоваться вместо мнемоники. Когда ассемблер обрабатывает такой оператор, он заменяет его текстовыми строками, связанными с этим макросом, а затем обрабатывает их, как если бы они существовали в файле исходного кода (включая, в некоторых ассемблерах, раскрытие любых макросов, существующих в тексте замены) . Макросы в этом смысле относятся к IBM автокодеры 1950-х годов.[22][№ 5]

На языке ассемблера термин «макрос» представляет собой более всеобъемлющую концепцию, чем в некоторых других контекстах, таких как препроцессор в Язык программирования C, где его директива #define обычно используется для создания коротких однострочных макросов. Инструкции макроса ассемблера, такие как макросы в PL / I и некоторые другие языки сами по себе могут быть длинными «программами», выполняемыми ассемблером путем интерпретации во время сборки.

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

Макроассемблеры часто позволяют макросам принимать параметры. Некоторые ассемблеры включают в себя довольно сложные макроязыки, включающие такие элементы языка высокого уровня, как необязательные параметры, символьные переменные, условные выражения, манипуляции со строками и арифметические операции, которые можно использовать во время выполнения данного макроса и позволяющие макросам сохранять контекст или обмениваться информацией. . Таким образом, макрос может генерировать множество инструкций на языке ассемблера или определений данных на основе аргументов макроса. Это может быть использовано для создания структур данных в стиле записи или "развернутый "циклы, например, или могут генерировать целые алгоритмы на основе сложных параметров. Например, макрос" sort "может принимать спецификацию сложного ключа сортировки и генерировать код, созданный для этого конкретного ключа, не требуя тестов времени выполнения, которые потребуется для общей процедуры интерпретации спецификации. Организация, использующая язык ассемблера, который был сильно расширен с помощью такого набора макросов, может считаться работающей на языке более высокого уровня, поскольку такие программисты не работают с компьютером самого низкого уровня концептуальные элементы. Подчеркивая этот момент, макросы использовались для реализации первых виртуальная машина в СНОБОЛ4 (1967), который был написан на языке реализации SNOBOL (SIL), ассемблере для виртуальной машины. Целевая машина переведет это в свой собственный код, используя макроассемблер.[23] В то время это обеспечивало высокую степень портативности.

Макросы использовались для настройки крупномасштабных программных систем для конкретных клиентов в эпоху мэйнфреймов, а также использовались персоналом клиентов для удовлетворения потребностей своих работодателей путем создания конкретных версий операционных систем производителя. Это было сделано, например, системными программистами, работающими с IBM система мониторинга разговоров / виртуальная машина (ВМ / CMS ) и с надстройками IBM для «обработки транзакций в реальном времени», Система управления информацией о клиентах CICS, и ACP /TPF авиакомпания / финансовая система, которая началась в 1970-х и до сих пор управляет многими крупными компьютерные системы бронирования (CRS) и системы кредитных карт сегодня.

Также возможно использовать исключительно возможности обработки макросов ассемблера для генерации кода, написанного на совершенно разных языках, например, для генерации версии программы на КОБОЛ использование программы на чистом макросе на ассемблере, содержащей строки кода COBOL внутри операторов времени ассемблера, инструктирующих ассемблер генерировать произвольный код. IBM OS / 360 использует макросы для выполнения генерация системы. Пользователь указывает параметры, кодируя серию макросов ассемблера. Сборка этих макросов генерирует поток работы построить систему, в том числе язык управления работой и полезность контрольные заявления.

Это связано с тем, что, как было реализовано в 1960-х годах, концепция «обработки макросов» не зависит от концепции «сборки», первая из которых, говоря современным языком, представляет собой больше текстовую обработку, обработку текста, чем создание объектного кода. Концепция обработки макросов появилась и появляется в языке программирования C, который поддерживает «инструкции препроцессора» для установки переменных и выполнения условных тестов на их значениях. В отличие от некоторых предыдущих макропроцессоров внутри ассемблеров, препроцессор C не Полный по Тьюрингу потому что ему не хватает возможности либо зацикливаться, либо «переходить», последний позволяет программам зацикливаться.

Несмотря на мощь обработки макросов, она вышла из употребления во многих языках высокого уровня (за исключением C, C ++ и PL / I), оставаясь неизменным для сборщиков.

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

foo: макрос aload a * b

Намерение состояло в том, что вызывающий должен предоставить имя переменной, а «глобальная» переменная или константа b будет использоваться для умножения «a». Если foo вызывается с параметром а-с, макрорасширение загрузить a-c * b происходит. Чтобы избежать возможной двусмысленности, пользователи макропроцессоров могут заключать в скобки формальные параметры внутри определений макросов, или вызывающие программы могут заключать в скобки входные параметры.[24]

Поддержка структурного программирования

Написаны пакеты макросов, обеспечивающие структурное программирование элементы для кодирования потока выполнения. Самый ранний пример этого подхода был в Набор макросов Concept-14,[25] первоначально предложенный Харлан Миллс (Март 1970 г.) и реализован Марвином Кесслером из подразделения IBM Federal Systems, которое предоставило IF / ELSE / ENDIF и аналогичные блоки потока управления для программ ассемблера OS / 360. Это был способ уменьшить или исключить использование ИДТИ К операций в ассемблерном коде, что является одним из основных факторов, вызывающих код спагетти на языке ассемблера. Этот подход был широко принят в начале 1980-х (последние дни широкомасштабного использования языка ассемблера).

Любопытный дизайн был Натуральный, "поточно-ориентированный" ассемблер для 8080 /Z80, процессоры[нужна цитата ] из Whitesmiths Ltd. (разработчики Unix -подобно Идрис операционной системы, и то, что, как сообщалось, было первым коммерческим C компилятор ). Язык был классифицирован как ассемблер, потому что он работал с необработанными машинными элементами, такими как коды операций, регистры, и ссылки на память; но он включал синтаксис выражения, чтобы указать порядок выполнения. Скобки и другие специальные символы, наряду с конструкциями блочно-ориентированного структурного программирования, управляют последовательностью генерируемых инструкций. A-natural был создан как объектный язык компилятора C, а не для ручного кодирования, но его логический синтаксис завоевал некоторых поклонников.

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

Ассемблеры с мощным механизмом макросов позволяют структурированное программирование с помощью макросов, таких как макрос переключателя, поставляемый с пакетом Masm32 (этот код представляет собой полную программу):

включают masm32включаютmasm32rt.inc	; использовать библиотеку Masm32.коддемомен:  ПОВТОРЕНИЕ 20	выключатель rv(случайный, 9)	; создать число от 0 до 8	mov ecx, 7	дело 0		Распечатать "дело 0"	дело ecx				; в отличие от большинства других языков программирования,		Распечатать "дело 7"		; переключатель Masm32 допускает "переменные случаи"	дело 1 .. 3		.если eax==1			Распечатать "Случай 1"		.elseif eax==2			Распечатать "случай 2"		.еще			Распечатать «случаи с 1 по 3: другое»		.endif	дело 4, 6, 8		Распечатать "корпуса 4, 6 или 8"	дефолт		mov ebx, 19		     ; распечатать 20 звезд		.Повторение			Распечатать "*"			декабрь ebx		.До того как Sign?		 ; цикл, пока не будет установлен флаг знака	конец	Распечатать chr $(13, 10)  ENDM  выходконец демомен

Использование языка ассемблера

Историческая перспектива

Языки ассемблера не были доступны в то время, когда компьютер с хранимой программой был представлен. Кэтлин Бут "приписывают изобретение языка ассемблера"[28][29] на основе теоретической работы она начала в 1947 году, работая над ARC2 в Биркбек, Лондонский университет после консультации с Эндрю Бут (позже ее муж) с математиком Джон фон Нейман и физик Герман Голдстайн на Институт перспективных исследований.[29][30]

В конце 1948 г. Электронный автоматический калькулятор запоминания задержки (EDSAC) имел ассемблер (названный "начальные заказы"), интегрированный в его бутстрап программа. В нем использовалась однобуквенная мнемоника, разработанная Дэвид Уиллер, который признан компьютерным сообществом IEEE создателем первого «ассемблера».[14][31][32] В отчетах об EDSAC введен термин «сборка» для процесса объединения полей в командное слово.[33] МЫЛО (Символьная оптимальная программа сборки ) был языком ассемблера для IBM 650 компьютер, написанный Стэном Поли в 1955 году.[34]

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

Когда-то языки ассемблера широко использовались для всех видов программирования. Однако к 1980-м годам (1990-е годы по микрокомпьютеры ), их использование было в значительной степени вытеснено языками более высокого уровня в поисках улучшенных продуктивность программирования. Сегодня ассемблер по-прежнему используется для прямого управления оборудованием, доступа к специализированным инструкциям процессора или для решения критических проблем с производительностью. Типичное использование: драйверы устройств, низкий уровень встроенные системы, и в реальном времени системы.

Исторически многие программы были написаны полностью на ассемблере. В Берроуз MCP (1961 г.) был первым компьютером, для которого операционная система не была полностью разработана на языке ассемблера; это было написано в Проблемно-ориентированный язык исполнительных систем (ESPOL), диалект Алгола. Многие коммерческие приложения также были написаны на языке ассемблера, в том числе большое количество Мэйнфрейм IBM программное обеспечение, написанное крупными корпорациями. КОБОЛ, FORTRAN и некоторые PL / I в конечном итоге вытеснили большую часть этой работы, хотя ряд крупных организаций сохраняли инфраструктуры приложений на ассемблере и в 1990-е годы.

Большинство ранних микрокомпьютеров полагались на кодируемый вручную ассемблер, включая большинство операционных систем и крупных приложений. Это было связано с тем, что эти системы имели жесткие ограничения ресурсов, требовали особой архитектуры памяти и отображения, а также предоставляли ограниченные системные службы с ошибками. Возможно, более важным было отсутствие первоклассных компиляторов языков высокого уровня, подходящих для использования на микрокомпьютерах. Психологический фактор, возможно, также сыграл свою роль: первое поколение программистов микрокомпьютеров сохраняло увлеченность, «проволоку и плоскогубцы».

В более коммерческом контексте основными причинами использования языка ассемблера были минимальный раздут (размер), минимальные накладные расходы, большая скорость и надежность.

Типичными примерами больших программ на ассемблере того времени являются IBM PC. ДОС операционные системы, Турбо Паскаль компилятор и ранние приложения, такие как электронная таблица программа Лотос 1-2-3. Язык ассемблера использовался для обеспечения максимальной производительности Sega Saturn, консоль, для которой было очень сложно разрабатывать и программировать игры.[35] Аркадная игра 1993 года NBA Jam другой пример.

Ассемблер долгое время был основным языком разработки для многих популярных домашних компьютеров 1980-х и 1990-х годов (таких как MSX, Sinclair ZX Spectrum, Коммодор 64, Коммодор Амига, и Atari ST ). Это было во многом потому, что интерпретированный Диалекты BASIC в этих системах предлагали недостаточную скорость выполнения, а также недостаточные возможности для использования всех преимуществ доступного оборудования в этих системах. В некоторых системах даже есть интегрированная среда развития (IDE) с расширенными возможностями отладки и макросов. Некоторые компиляторы, доступные для Radio Shack TRS-80 и его преемники имели возможность комбинировать встроенный исходный код ассемблера с программными операторами высокого уровня. После компиляции встроенный ассемблер произвел встроенный машинный код.

Текущее использование

Всегда есть[36] Были споры о полезности и производительности языка ассемблера по сравнению с языками высокого уровня.

Хотя язык ассемблера имеет специфические ниши, где это важно (см. Ниже), есть и другие инструменты для оптимизации.[37]

По состоянию на июль 2017 г., то Индекс TIOBE по популярности языков программирования ассемблер занимает 11 место, опережая Visual Basic, Например.[38] Ассемблер можно использовать для оптимизации по скорости или для оптимизации по размеру. В случае оптимизации скорости современные оптимизация компиляторов заявлены[39] чтобы преобразовать языки высокого уровня в код, который может работать так же быстро, как рукописная сборка, несмотря на контрпримеры, которые можно найти.[40][41][42] Сложность современных процессоров и подсистем памяти затрудняет эффективную оптимизацию как для компиляторов, так и для программистов на ассемблере.[43][44] Более того, повышение производительности процессора привело к тому, что большинство процессоров большую часть времени простаивают,[45] с задержками, вызванными предсказуемыми узкими местами, такими как промахи кеша, Ввод / вывод операции и пейджинг. Это сделало скорость выполнения исходного кода не проблемой для многих программистов.

Есть несколько ситуаций, в которых разработчики могут использовать ассемблер:

  • Написание кода для систем со старыми процессорами, которые имеют ограниченные языковые возможности высокого уровня, такие как Atari 2600, Коммодор 64, и графические калькуляторы.[46]
  • Код, который должен напрямую взаимодействовать с оборудованием, например, в драйверы устройств и обработчики прерываний.
  • Во встроенном процессоре или DSP прерывания с большим числом повторений требуют наименьшего количества циклов на прерывание, например прерывание, которое происходит 1000 или 10000 раз в секунду.
  • Программы, которым необходимо использовать специфические для процессора инструкции, не реализованные в компиляторе. Типичным примером является побитовое вращение инструкция, лежащая в основе многих алгоритмов шифрования, а также запрос четности байта или 4-битного переноса добавления.
  • Требуется автономный исполняемый файл компактного размера, который должен выполняться без обращения к время выполнения компоненты или библиотеки ассоциируется с языком высокого уровня. Примеры включают прошивку для телефонов, автомобильных топливных систем и систем зажигания, систем управления кондиционированием воздуха, систем безопасности и датчиков.
  • Программы с внутренними циклами, зависящими от производительности, в которых язык ассемблера предоставляет возможности оптимизации, которые трудно реализовать на языке высокого уровня. Например, линейная алгебра с BLAS[40][47] или же дискретное косинусное преобразование (например. SIMD версия сборки от x264[48]).
  • Программы, которые создают векторизованные функции для программ на языках более высокого уровня, таких как C. На языке более высокого уровня этому иногда помогает компилятор. внутренние функции которые отображаются непосредственно в мнемонику SIMD, но тем не менее приводят к преобразованию сборки один к одному, специфичному для данного векторного процессора.
  • В реальном времени такие программы, как моделирование, системы навигации и медицинское оборудование. Например, в по проводам системы, телеметрия должна интерпретироваться и действовать в строгие сроки. Такие системы должны устранять источники непредсказуемых задержек, которые могут быть созданы (некоторыми) интерпретируемыми языками, автоматически вывоз мусора, операции подкачки или вытесняющая многозадачность. Однако некоторые языки более высокого уровня включают компоненты времени выполнения и интерфейсы операционной системы, которые могут вызывать такие задержки. Выбор сборки или языки нижнего уровня для таких систем дает программистам большую наглядность и контроль над деталями обработки.
  • Криптографические алгоритмы, которые всегда должны выполняться строго в одно и то же время, предотвращая время атаки.
  • Изменяйте и расширяйте унаследованный код, написанный для мэйнфреймов IBM.[49] [50]
  • Ситуации, когда требуется полный контроль над окружающей средой, в ситуациях с чрезвычайно высокой степенью безопасности, когда ничего нельзя принимать как должное.
  • Компьютерные вирусы, загрузчики, определенный драйверы устройств, или другие элементы, очень близкие к оборудованию или операционной системе нижнего уровня.
  • Симуляторы с инструкциями для мониторинга, отслеживания и отладка где дополнительные накладные расходы сведены к минимуму.
  • Ситуации, когда не существует языка высокого уровня, на новом или специализированном процессоре, для которого нет кросс-компилятор доступен.
  • Разобрать механизм с целью понять, как это работает и изменение программных файлов, таких как:
    • существующий двоичные файлы которые могут быть или не могут быть изначально написаны на языке высокого уровня, например, при попытке воссоздать программы, исходный код которых недоступен или был утерян, или при взломе защиты от копирования проприетарного программного обеспечения.
    • Видеоигры (также называемый ROM взлом ), что возможно несколькими способами. Наиболее широко используемый метод - изменение программного кода на уровне языка ассемблера.

Ассемблер по-прежнему преподается в большинстве Информатика и электроинженерия программы. Хотя сегодня немногие программисты регулярно работают с языком ассемблера в качестве инструмента, основные концепции остаются важными. Такие фундаментальные темы, как двоичная арифметика, выделение памяти, обработка стека, набор символов кодирование прерывать обработка и компилятор Было бы трудно изучить дизайн в деталях без понимания того, как компьютер работает на аппаратном уровне. Поскольку поведение компьютера в основном определяется его набором инструкций, логическим способом изучения таких концепций является изучение языка ассемблера. Большинство современных компьютеров имеют аналогичные наборы команд. Следовательно, изучения единственного языка ассемблера достаточно, чтобы усвоить: I) основные понятия; II) распознавать ситуации, когда использование ассемблера может быть уместным; и III) чтобы увидеть, как эффективный исполняемый код может быть создан из языков высокого уровня.[16]

Типичные области применения

  • Язык ассемблера обычно используется в системе ботинок code, низкоуровневый код, который инициализирует и тестирует оборудование системы перед загрузкой операционной системы и часто хранится в ПЗУ. (BIOS на IBM-совместимом ПК системы и CP / M это пример.)
  • Язык ассемблера часто используется для низкоуровневого кода, например для ядра операционной системы, который не может полагаться на доступность ранее существовавших системных вызовов и действительно должен реализовывать их для конкретной архитектуры процессора, на которой будет работать система.
  • Некоторые компиляторы переводят языки высокого уровня в сборку перед полной компиляцией, что позволяет просматривать код сборки для отладка и в целях оптимизации.
  • Некоторые компиляторы для языков относительно низкого уровня, такие как Паскаль или же C, позволяют программисту встраивать язык ассемблера непосредственно в исходный код (так называемый встроенная сборка ). Программы, использующие такие средства, могут затем создавать абстракции, используя разные языки ассемблера на каждой аппаратной платформе. Система портативный код может затем использовать эти зависящие от процессора компоненты через единый интерфейс.
  • Ассемблер полезен в разобрать механизм с целью понять, как это работает. Многие программы распространяются только в виде машинного кода, который легко перевести на язык ассемблера с помощью дизассемблер, но труднее перевести на язык более высокого уровня через декомпилятор. Такие инструменты, как Интерактивный дизассемблер широко использовать разборку для этой цели. Этот метод используется хакерами для взлома коммерческого программного обеспечения, а конкурентами - для создания программного обеспечения с аналогичными результатами от конкурирующих компаний.
  • Язык ассемблера используется для повышения скорости выполнения, особенно в ранних персональных компьютерах с ограниченной вычислительной мощностью и ОЗУ.
  • Ассемблеры могут использоваться для генерации блоков данных без накладных расходов на языке высокого уровня из отформатированного и прокомментированного исходного кода для использования в другом коде.[51][52]

Смотрите также

Примечания

  1. ^ «Используемый в качестве мета-ассемблера, он позволяет пользователю разрабатывать свои собственные языки программирования и создавать процессоры для таких языков с минимальными усилиями».
  2. ^ Это одна из двух повторяющихся форм этой инструкции, которые работают одинаково. 8086 и несколько других ЦП конца 1970-х - начала 1980-х имеют избыточность в своих наборах инструкций, потому что инженерам было проще спроектировать эти ЦП (для установки на кремниевые микросхемы ограниченного размера) с избыточными кодами, чем их исключить (см. условия безразличия ). Каждый ассемблер обычно генерирует только одну из двух или более избыточных кодировок инструкций, но дизассемблер обычно узнает любого из них.
  3. ^ AMD произвела вторые процессоры Intel 8086, 8088 и 80286 и, возможно, процессоры 8080A и / или 8085A по лицензии Intel, но, начиная с 80386, Intel отказывалась делиться своими процессорами x86 с кем-либо - AMD подала в суд на нарушение контракта - и AMD разработала, изготовила и продала 32-битные и 64-битные процессоры семейства x86 без помощи или одобрения Intel.
  4. ^ В 7070 Autocoder определение макроса - это программа-генератор макросов 7070, которую вызывает ассемблер; Autocoder предоставляет специальные макросы для использования генераторами макросов.
  5. ^ «Следующее незначительное ограничение или ограничение действует в отношении использования автокодера 1401 при кодировании макросов ...»

Рекомендации

  1. ^ а б «Ассемблерный язык». Ассемблер высокого уровня для z / OS & z / VM & z / VSE Language Reference Version 1 Release 6. IBM. 2014 [1990]. SC26-4940-06.
  2. ^ Саксон, Джеймс А .; Плетт, Уильям С. (1962). Программирование IBM 1401, самоучитель по программированию. Энглвуд Клиффс, Нью-Джерси, США: Prentice-Hall. LCCN  62-20615. (NB. Использование термина программа сборки.)
  3. ^ «Сборка: Обзор» (PDF). Компьютерные науки и инженерия. Инженерный колледж, Государственный университет Огайо. 2016. В архиве (PDF) из оригинала 2020-03-24. Получено 2020-03-24.
  4. ^ Арчер, Бенджамин (ноябрь 2016 г.). Ассемблерный язык для студентов. Северный Чарльстон, Южная Каролина, США: Независимая публикация CreateSpace. ISBN  978-1-5403-7071-6. Язык ассемблера также можно назвать символическим машинным кодом.
  5. ^ Корнелис, А. Ф. (2010) [2003]. «Ассемблер высокого уровня - обзор кодов операций, директивы ассемблера». В архиве из оригинала 2020-03-24. Получено 2020-03-24.
  6. ^ «Макроинструкции». Ассемблер высокого уровня для z / OS & z / VM & z / VSE Language Reference Version 1 Release 6. IBM. 2014 [1990]. SC26-4940-06.
  7. ^ Уилкс, Морис Винсент; Уилер, Дэвид Джон; Гилл, Стэнли Дж. (1951). Подготовка программ для ЭЦП. (Перепечатка изд. 1982 г.). Издательство Томаш. ISBN  978-0-93822803-5. OCLC  313593586.
  8. ^ Fairhead, Гарри (2017-11-16). "История компьютерных языков - классическое десятилетие 1950-х годов". Я программист. В архиве из оригинала 02.01.2020. Получено 2020-03-06.
  9. ^ «Как языки ассемблера зависят от операционных систем?». Обмен стеком. Stack Exchange Inc. 2011-07-28. В архиве из оригинала 2020-03-24. Получено 2020-03-24. (NB. Системные вызовы часто различаются, например, для MVS против. ВСЕ по сравнению с ВМ / CMS; двоичные / исполняемые форматы для разных операционных систем также могут отличаться.)
  10. ^ Дейнтит, Джон, изд. (2019). «мета-ассемблер». Словарь по вычислительной технике. В архиве из оригинала 2020-03-24. Получено 2020-03-24.
  11. ^ Xerox Data Systems (октябрь 1975 г.). Справочное руководство по языку и эксплуатации компьютеров Xerox Meta-Symbol Sigma 5-9 (PDF). п. vi. Получено 2020-06-07.
  12. ^ Компьютерные системы Sperry Univac (1977). Справочник программиста Sperry Univac Computer Systems Meta-Assembler (MASM) (PDF). Получено 2020-06-07.
  13. ^ «Как использовать встроенный язык ассемблера в коде C». gnu.org. Получено 2020-11-05.
  14. ^ а б c d Саломон, Дэвид (февраль 1993 г.) [1992]. Написано в Калифорнийском государственном университете, Нортридж, Калифорния, США. Чиверс, Ян Д. (ред.). Сборщики и погрузчики (PDF). Серия Эллиса Хорвуда в компьютерах и их приложениях (1-е изд.). Честер, Западный Сассекс, Великобритания: Эллис Хорвуд Лимитед / Simon & Schuster International Group. С. 7, 237–238. ISBN  0-13-052564-2. В архиве (PDF) из оригинала 2020-03-23. Получено 2008-10-01. (xiv + 294 + 4 страницы)
  15. ^ Бек, Леланд Л. (1996). «2». Системное программное обеспечение: введение в системное программирование. Эддисон Уэсли.
  16. ^ а б Гайд, Рэндалл (Сентябрь 2003 г.) [1996-09-30]. «Предисловие (« Зачем кому-то это изучать? »/ Глава 12 - Классы и объекты». Искусство ассемблера (2-е изд.). Пресс без крахмала. ISBN  1-886411-97-2. Архивировано из оригинал на 2010-05-06. Получено 2020-06-22. Опечатки: [1] (928 страниц) [2][3]
  17. ^ а б c d Руководство разработчика программного обеспечения для архитектуры Intel, том 2: Справочник по набору инструкций (PDF). 2. Корпорация Intel. 1999. Архивировано с оригинал (PDF) на 2009-06-11. Получено 2010-11-18.
  18. ^ Феррари, Адам; Батсон, Алан; Отсутствие, Майк; Джонс, Анита (2018-11-19) [весна 2006 г.]. Эванс, Дэвид (ред.). "Руководство по сборке x86". Компьютерные науки CS216: Программы и представление данных. Университет Вирджинии. В архиве из оригинала 2020-03-24. Получено 2010-11-18.
  19. ^ «Руководство по архитектуре SPARC, версия 8» (PDF). SPARC International. 1992. Архивировано с оригинал (PDF) на 2011-12-10. Получено 2011-12-10.
  20. ^ Моксхэм, Джеймс (1996). "Интерпретатор ZINT Z80". Коды операций Z80 для ZINT. В архиве из оригинала 2020-03-24. Получено 2013-07-21.
  21. ^ Гайд, Рэндалл. «Глава 8. MASM: директивы и псевдо-коды операций» (PDF). Искусство программирования. В архиве (PDF) из оригинала 2020-03-24. Получено 2011-03-19.
  22. ^ Пользователи 1401 Autocoder. В архиве из оригинала 2020-03-24. Получено 2020-03-24.
  23. ^ Грисволд, Ральф Э. (1972). "Глава 1". Макро-реализация SNOBOL4. Сан-Франциско, Калифорния, США: В. Х. Фриман и компания. ISBN  0-7167-0447-1.
  24. ^ «Макросы (C / C ++), библиотека MSDN для Visual Studio 2008». Microsoft Corp. 2012-11-16. В архиве из оригинала 2020-03-24. Получено 2010-06-22.
  25. ^ Кесслер, Марвин М. (1970-12-18). «* Концепция * Отчет 14 - Внедрение макросов для структурного программирования в OS / 360». Программное обеспечение MVS: макросы Concept 14. Гейтерсбург, Мэриленд, США: Международная корпорация бизнес-машин. В архиве из оригинала 2020-03-24. Получено 2009-05-25.
  26. ^ "язык ассемблера: определение и многое другое с сайта Answers.com". answers.com. Архивировано из оригинал на 2009-06-08. Получено 2008-06-19.
  27. ^ Провинчиано, Брайан (2005-04-17). «NESHLA: высокоуровневый ассемблер 6502 с открытым исходным кодом для Nintendo Entertainment System». В архиве из оригинала 2020-03-24. Получено 2020-03-24.
  28. ^ Дюфрен, Стивен (21.08.2018). «Кэтлин Бут: сборка первых компьютеров при изобретении сборки». В архиве из оригинала 2020-03-24. Получено 2019-02-10.
  29. ^ а б Бут, Эндрю Дональд; Бриттен, Кэтлин Хильда Валери (Сентябрь 1947 г.) [август 1947 г.]. Общие соображения при проектировании универсального электронного цифрового компьютера (PDF) (2-е изд.). Институт перспективных исследований, Принстон, Нью-Джерси, США: Биркбек-колледж, Лондон. В архиве (PDF) из оригинала 2020-03-24. Получено 2019-02-10. Неоригинальные идеи, содержащиеся в нижеследующем тексте, были получены из ряда источников ... Тем не менее, чувствуется, что следует отдать должное профессору Джону фон Нейману и доктору Герману Гольдштейну за многие плодотворные обсуждения ...
  30. ^ Кэмпбелл-Келли, Мартин (Апрель 1982 г.). «Развитие компьютерного программирования в Великобритании (1945-1955)». IEEE Annals of the History of Computing. 4 (2): 121–139. Дои:10.1109 / MAHC.1982.10016. S2CID  14861159.
  31. ^ Кэмпбелл-Келли, Мартин (1980). «Программирование EDSAC». IEEE Annals of the History of Computing. 2 (1): 7–36. Дои:10.1109 / MAHC.1980.10009.
  32. ^ "1985 Computer Pioneer Award" За программирование на ассемблере Дэвида Уиллера ".
  33. ^ Уилкс, Морис Винсент (1949). «EDSAC - электронная вычислительная машина». Журнал научных инструментов. 26 (12): 385–391. Bibcode:1949JScI ... 26..385W. Дои:10.1088/0950-7671/26/12/301.
  34. ^ да Круз, Франк (2019-05-17). "Калькулятор магнитного барабана IBM 650". История вычислений - хронология вычислений. Колумбийский университет. В архиве из оригинала на 2020-02-15. Получено 2012-01-17.
  35. ^ Петтус, Сэм (10 января 2008 г.). «SegaBase Volume 6 - Saturn». Архивировано из оригинал на 2008-07-13. Получено 2008-07-25.
  36. ^ Каулер, Барри (1997-01-09). Язык ассемблера Windows и системное программирование: 16- и 32-разрядное низкоуровневое программирование для ПК и Windows. CRC Press. ISBN  978-1-48227572-8. Получено 2020-03-24. Всегда бушуют споры о применимости языка ассемблера в нашем современном мире программирования.
  37. ^ Се, Пол (2020-03-24) [2016, 1996]. «Оптимизация программирования». В архиве из оригинала 2020-03-24. Получено 2020-03-24. ... изменения дизайна имеют тенденцию влиять на производительность больше, чем ... не следует сразу переходить к языку ассемблера, пока ...
  38. ^ "Индекс TIOBE". Программное обеспечение TIOBE. В архиве из оригинала 2020-03-24. Получено 2020-03-24.
  39. ^ Руслинг, Дэвид А. (1999) [1996]. "Глава 2 Основы программного обеспечения". Ядро Linux. В архиве из оригинала 2020-03-24. Получено 2012-03-11.
  40. ^ а б Марков, Джон Грегори (2005-11-28). «Написание самого быстрого кода вручную для развлечения: человеческий компьютер постоянно ускоряет процессоры». Нью-Йорк Таймс. Сиэтл, Вашингтон, США. В архиве из оригинала 2020-03-23. Получено 2010-03-04.
  41. ^ "Плохость битового поля". hardwarebug.org. 2010-01-30. Архивировано из оригинал на 2010-02-05. Получено 2010-03-04.
  42. ^ "GCC создает беспорядок". hardwarebug.org. 2009-05-13. Архивировано из оригинал на 2010-03-16. Получено 2010-03-04.
  43. ^ Гайд, Рэндалл. "Великие дебаты". Архивировано из оригинал на 2008-06-16. Получено 2008-07-03.
  44. ^ "Исходный код снова терпит неудачу". hardwarebug.org. 2010-01-30. Архивировано из оригинал на 2010-04-02. Получено 2010-03-04.
  45. ^ Щелкни, Клифф; Гетц, Брайан. «Ускоренный курс современного оборудования». В архиве из оригинала 2020-03-24. Получено 2014-05-01.
  46. ^ "Программирование 68K в Fargo II". В архиве из оригинала от 02.07.2008. Получено 2008-07-03.
  47. ^ «Тест BLAS - август 2008». eigen.tuxfamily.org. 2008-08-01. В архиве из оригинала 2020-03-24. Получено 2010-03-04.
  48. ^ "x264.git / common / x86 / dct-32.asm". git.videolan.org. 2010-09-29. Архивировано из оригинал на 2012-03-04. Получено 2010-09-29.
  49. ^ Босуорт, Эдвард (2016). «Глава 1 - Зачем изучать язык ассемблера». www.edwardbosworth.com. В архиве из оригинала 2020-03-24. Получено 2016-06-01.
  50. ^ https://www-01.ibm.com/servers/resourcelink/svc00100.nsf/pages/zOSV2R3sc236852/$file/idad500_v2r3.pdf
  51. ^ Пол, Маттиас Р. (2001) [1996], «Спецификация и справочная документация на NECPINW», NECPINW.CPI - драйвер переключения кодовых страниц DOS для NEC Pinwriters (2.08 ред.), FILESPEC.TXT, NECPINW.ASM, EUROFONT.INC из NECPI208.ZIP, в архиве из оригинала на 2017-09-10, получено 2013-04-22
  52. ^ Пол, Матиас Р. (13 мая 2002 г.). "[fd-dev] mkeyb". freedos-dev. В архиве из оригинала на 2018-09-10. Получено 2018-09-10.

дальнейшее чтение

внешняя ссылка