Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

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

Синтаксис языка ассемблера [ править ]

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

Терминология [ править ]

  • Макроассемблер включает в себя макроинструкцию объекта таким образом , что (параметрироваться) текст на языке ассемблера может быть представлен именем, и это имя может быть использовано для вставки расширенного текста в другой код.
  • Кросс ассемблер (смотри также кросс - компилятор ) является ассемблер , который запускается на компьютере или операционной системы (The хоста системы) другого типа от системы , на которой результирующий код должен работать (в целевой системе ). Перекрестная сборка облегчает разработку программ для систем, не имеющих ресурсов для поддержки разработки программного обеспечения, таких как встроенная система или микроконтроллер . В таком случае полученный объектный код должен быть передан в целевую систему через постоянную память (ПЗУ, СППЗУ и т. Д.), Программатор(когда постоянная память интегрирована в устройство, как в микроконтроллерах), или канал передачи данных, использующий либо точную побитовую копию объектного кода, либо текстовое представление этого кода (например, Intel hex или Motorola S-record ).
  • Ассемблер высокого уровня является программой , которая предоставляет языковые абстракции чаще , связанные с языками высокого уровня, такие как сложные структуры управления ( IF / THEN / ELSE , DO CASE, и т.д.) и высокого уровень абстрактных типов данных, в том числе структуры / записи, союзы, классы и множества.
  • Microassembler это программа , которая помогает подготовить микропрограмму , называемую прошивку , чтобы контролировать работу низкого уровня компьютера.
  • Мета-ассемблер является «программой , которая принимает синтаксическое и семантическое описание языка ассемблера, и генерирует ассемблер для этого языка». [10] Ассемблеры «метасимвола» для компьютеров серии SDS 9 и SDS Sigma являются метаассемблерами. [11] [nb 1] Sperry Univac также предоставил мета-ассемблер для серии UNIVAC 1100/2200 . [12]
  • встроенный ассемблер (или встроенный ассемблер ) - это код ассемблера, содержащийся в программе на языке высокого уровня. [13] Это чаще всего используется в системных программах, которым необходим прямой доступ к оборудованию.

Ключевые понятия [ править ]

Ассемблер [ править ]

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

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

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

Может быть несколько ассемблеров с разным синтаксисом для конкретного процессора или архитектуры набора команд . Например, инструкция по добавлению данных памяти в регистр процессора семейства x86 может быть add eax,[ebx]в оригинальном синтаксисе Intel , тогда как она будет записана addl (%ebx),%eaxв синтаксисе AT&T, используемом GNU Assembler . Несмотря на разный внешний вид, разные синтаксические формы обычно генерируют один и тот же числовой машинный код . Один ассемблер также может иметь разные режимы для поддержки вариаций синтаксических форм, а также их точных семантических интерпретаций (например, FASM -синтаксис,TASM -синтаксис, идеальный режим и т. Д. В частном случае программирования на ассемблере x86 ).

Количество проходов [ править ]

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

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

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

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

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

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

Ассемблеры высокого уровня [ править ]

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

  • Объявления и вызовы процедур / функций высокого уровня
  • Расширенные структуры управления (IF / THEN / ELSE, SWITCH)
  • Высокоуровневые абстрактные типы данных, включая структуры / записи, объединения, классы и множества.
  • Сложная обработка макросов (хотя доступна на обычных ассемблерах с конца 1950-х годов, например, для серий IBM 700 и IBM 7000 , а с 1960-х годов для IBM System / 360 (S / 360), среди других машин)
  • Возможности объектно-ориентированного программирования, такие как классы , объекты , абстракция , полиморфизм и наследование [16]

См. Дополнительные сведения в разделе " Языковой дизайн" ниже.

Язык ассемблера [ править ]

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

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

10110000 01100001

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

B0 61

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

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

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

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

88 E0

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

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

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

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

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

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

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

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

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

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

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

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

Языковой дизайн [ править ]

Основные элементы [ править ]

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

  • Мнемоника кода операции
  • Определения данных
  • Директивы сборки

Мнемоника опкодов и расширенная мнемоника [ править ]

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

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

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

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

Директивы данных [ править ]

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

Директивы сборки [ править ]

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

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

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

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

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

Макросы [ править ]

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

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

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

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

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

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

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

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

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

foo: макрос aзагрузить a * b

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

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

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

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

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

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

включают  \ masm32 \ include \ masm32rt.inc ; использовать библиотеку Masm32.code demomain:  REPEAT  20 switch  rv ( nrandom ,  9 ) ; сгенерировать число от 0 до 8 mov  ecx ,  7 case  0 вывести  «case 0» case  ecx ; в отличие от большинства других языков программирования, выведите  «case 7» ; переключатель Masm32 разрешает "переменные случаи" case  1  ..  3 .if  eax == 1 print  "case 1" .elseif  eax == 2 print  "case 2" .else print «варианты с 1 по 3: другие» .endif case  4 ,  6 ,  8 print  « case 4, 6 или 8» по умолчанию mov  ebx ,  19  ; напечатать 20 звезд. Повторить печать  «*» dec  ebx. До  Si gn?  ; цикл до тех пор, пока не будет установлен флаг знака. endw print  ch r $ ( 13 ,  10 )  ENDM  exit end  demomain

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

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

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

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

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

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

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

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

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

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

Ассемблер долгое время был основным языком разработки для многих популярных домашних компьютеров 1980-х и 1990-х годов (таких как MSX , Sinclair ZX Spectrum , Commodore 64 , Commodore Amiga и 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 , Commodore 64 и графические калькуляторы . [46]
  • Код, который должен напрямую взаимодействовать с оборудованием, например, в драйверах устройств и обработчиках прерываний .
  • Во встроенном процессоре или DSP прерывания с большим числом повторений требуют наименьшего количества циклов на прерывание, например прерывание, которое происходит 1000 или 10000 раз в секунду.
  • Программы, которым необходимо использовать специфические для процессора инструкции, не реализованные в компиляторе. Распространенным примером является команда поразрядного вращения, лежащая в основе многих алгоритмов шифрования, а также запрос четности байта или 4-битного переноса добавления.
  • Требуется автономный исполняемый файл компактного размера, который должен выполняться без обращения к компонентам времени выполнения или библиотекам, связанным с языком высокого уровня. Примеры включают прошивку для телефонов, автомобильных топливных систем и систем зажигания, систем управления кондиционированием воздуха, систем безопасности и датчиков.
  • Программы с внутренними циклами, зависящими от производительности, в которых язык ассемблера предоставляет возможности оптимизации, которые трудно реализовать на языке высокого уровня. Например, линейная алгебра с BLAS [40] [47] или дискретное косинусное преобразование (например, версия сборки SIMD из x264 [48] ).
  • Программы, которые создают векторизованные функции для программ на языках более высокого уровня, таких как C. На языке более высокого уровня этому иногда помогают встроенные функции компилятора, которые отображаются непосредственно на мнемонику SIMD, но, тем не менее, приводят к преобразованию сборки один к одному. для данного векторного процессора.
  • Программы реального времени , такие как моделирование, системы навигации и медицинское оборудование. Например, в проводной системе телеметрия должна интерпретироваться и действовать в рамках строгих временных ограничений. Такие системы должны устранять источники непредсказуемых задержек, которые могут быть созданы (некоторыми) интерпретируемыми языками, автоматической сборкой мусора , операциями подкачки или упреждающей многозадачностью . Однако некоторые языки более высокого уровня включают в себя компоненты времени выполнения и интерфейсы операционной системы, которые могут вызывать такие задержки. Выбор языка ассемблера или языков более низкого уровня для таких систем дает программистам большую наглядность и контроль над деталями обработки.
  • Криптографические алгоритмы, которые всегда должны выполняться строго в одно и то же время, предотвращая атаки по времени .
  • Изменяйте и расширяйте унаследованный код, написанный для мэйнфреймов IBM. [49] [50]
  • Ситуации, когда требуется полный контроль над окружающей средой, в ситуациях с чрезвычайно высокой степенью безопасности, когда ничто не может быть принято как должное .
  • Компьютерные вирусы , загрузчики , определенные драйверы устройств или другие элементы, очень близкие к оборудованию или операционной системе низкого уровня.
  • Симуляторы набора команд для мониторинга, отслеживания и отладки, где дополнительные накладные расходы сведены к минимуму.
  • Ситуации, когда не существует языка высокого уровня, на новом или специализированном процессоре, для которого нет кросс-компилятора .
  • Обратное проектирование и изменение программных файлов, таких как:
    • существующие двоичные файлы, которые могут быть или не быть изначально написаны на языке высокого уровня, например, при попытке воссоздать программы, исходный код которых недоступен или был утерян, или при взломе защиты от копирования проприетарного программного обеспечения.
    • Видеоигры (также называемые взломом ПЗУ ), что возможно несколькими способами. Наиболее широко используемый метод - изменение программного кода на уровне языка ассемблера.

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

Типовые приложения [ править ]

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

См. Также [ править ]

  • Компилятор
  • Сравнение ассемблеров
  • Дизассемблер
  • Шестнадцатеричный
  • Архитектура набора команд
  • Маленький человечек-компьютер - учебная компьютерная модель на языке ассемблера base-10
  • Клев
  • Типизированный язык ассемблера

Примечания [ править ]

  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 определение макроса - это программа-генератор макроса 7070, которую вызывает ассемблер; Autocoder предоставляет специальные макросы для использования генераторами макросов.
  5. ^ "Следующие незначительные ограничения или ограничения действуют в отношении использования автокодера 1401 при кодировании макросов ..."

Ссылки [ править ]

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

Дальнейшее чтение [ править ]

  • Бартлетт, Джонатан (2004). Программирование с нуля - введение в программирование с использованием языка ассемблера Linux . Bartlett Publishing . ISBN 0-9752838-4-7. Архивировано 24 марта 2020 года . Проверено 24 марта 2020 . [4]
  • Бриттон, Роберт (2003). Программирование на языке ассемблера MIPS . Прентис Холл . ISBN 0-13-142044-5.
  • Калингарт, Питер (1979) [1978-11-05]. Написано в Университете Северной Каролины в Чапел-Хилл . Горовиц, Эллис (ред.). Ассемблеры, компиляторы и перевод программ . Серия «Компьютерное программное обеспечение» (1-е изд., 1-е изд.). Потомак, Мэриленд, США: Computer Science Press, Inc. ISBN 0-914894-23-4. ISSN  0888-2088 . LCCN  78-21905 . Проверено 20 марта 2020 . (2 + xiv + 270 + 6 страниц)
  • Дантеманн, Джефф (2000). Язык ассемблера. Пошаговые инструкции . Вайли . ISBN 0-471-37523-3.
  • Канн, Чарльз В. (2015). «Введение в программирование на языке ассемблера MIPS» . Архивировано 24 марта 2020 года . Проверено 24 марта 2020 .
  • Нортон, Питер ; Соха, Джон (1986). Книга Питера Нортона по языку ассемблера для IBM PC . Нью-Йорк, США: Брейди Букс.
  • Певец, Майкл (1980). PDP-11. Программирование на языке ассемблера и организация машин . Нью-Йорк, США: John Wiley & Sons .
  • Sweetman, Доминик (1999). См. "Запуск MIPS" . Издательство Морган Кауфманн . ISBN 1-55860-410-3.
  • Уолдрон, Джон (1998). Введение в программирование на языке ассемблера RISC . Эддисон Уэсли . ISBN 0-201-39828-1.
  • Юричев, Денис (2020-03-04) [2013]. «Понимание языка ассемблера (обратный инжиниринг для начинающих)» (PDF) . Архивации (PDF) с оригинала на 2020-03-24 . Проверено 24 марта 2020 .
  • "Книга сообщества ASM" . 2009. Архивировано из оригинала на 2013-05-30 . Проверено 30 мая 2013 . («Электронная книга, полная полезной информации по ASM, руководств и примеров кода» от сообщества ASM, заархивированная в интернет-архиве.)

Внешние ссылки [ править ]

  • Ассемблер в Curlie
  • Программирование на языке ассемблера Unix
  • Сборка Linux
  • PPR: Изучение языка ассемблера
  • NASM - Netwide Assembler (популярный ассемблер)
  • Примеры программирования на языке ассемблера
  • Создание приложений Windows на языке ассемблера
  • Советы по оптимизации сборки от Марка Ларсона
  • Таблица для ассемблера в машинный код