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


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

В компьютерном программировании , языке ассемблера (или ассемблере ), [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, может использоваться для семейства связанных инструкций для загрузки, копирования и перемещения данных, будь то немедленные значения, значения в регистрах или ячейки памяти, на которые указывает значения в регистрах или по непосредственным (так называемым прямым) адресам. Другие ассемблеры могут использовать отдельные мнемоники кода операции, такие как 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 для «обработки транзакций в реальном времени», Customer Information Control System 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-х (последние дни широкомасштабного использования языка ассемблера). Набор инструментов IBM High Level Assembler Toolkit[26] включает в себя такой пакет макросов.

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

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

Ассемблеры с мощным механизмом макросов позволяют осуществлять структурированное программирование с помощью макросов, таких как макрос переключателя, поставляемый с пакетом 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Компилятор
  • Сравнение ассемблеров
  • Дизассемблер
  • Шестнадцатеричный
  • Архитектура набора команд
  • Маленький человечек-компьютер - учебная компьютерная модель на языке ассемблера 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) из оригинала 24 марта 2020 года . Проверено 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 Computer Systems Meta-Assembler (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 для 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". Макрореализация СНОБОЛ4 . Сан-Франциско, Калифорния, США: 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. ^ «Функция набора инструментов ассемблера высокого уровня увеличивает продуктивность программистов» . Письма с объявлениями . IBM. 1995-12-12. A95-1432.
  27. ^ «Ассемблер: определение и многое другое с сайта Answers.com» . answers.com . Архивировано из оригинала на 2009-06-08 . Проверено 19 июня 2008 .
  28. ^ Провинчиано, Брайан (2005-04-17). «NESHLA: Высокоуровневый ассемблер 6502 с открытым исходным кодом для Nintendo Entertainment System» . Архивировано 24 марта 2020 года . Проверено 24 марта 2020 .
  29. ^ Dufresne, Стивен (2018-08-21). «Кэтлин Бут: Сборка первых компьютеров при изобретении сборки» . Архивировано 24 марта 2020 года . Проверено 10 февраля 2019 .
  30. ^ a b Бут, Эндрю Дональд ; Бриттен, Кэтлин Хильда Валери (сентябрь 1947 г.) [август 1947 г.]. Общие соображения при проектировании универсального электронного цифрового компьютера (PDF) (2-е изд.). Институт перспективных исследований, Принстон, Нью-Джерси, США: Birkbeck College, Лондон . Архивации (PDF) с оригинала на 2020-03-24 . Проверено 10 февраля 2019 . Неоригинальные идеи, содержащиеся в нижеследующем тексте, были взяты из ряда источников ... Однако чувствуется, что следует отдать должное профессору Джону фон Нейману и доктору Герману Гольдштейну за многие плодотворные обсуждения ...
  31. Кэмпбелл-Келли, Мартин (апрель 1982 г.). «Развитие компьютерного программирования в Великобритании (1945-1955)». IEEE Annals of the History of Computing . 4 (2): 121–139. DOI : 10.1109 / MAHC.1982.10016 . S2CID 14861159 . 
  32. ^ Кэмпбелл-Келли, Мартин (1980). «Программирование EDSAC». IEEE Annals of the History of Computing . 2 (1): 7–36. DOI : 10.1109 / MAHC.1980.10009 .
  33. ^ "1985 Computer Pioneer Award 'За программирование на ассемблере' Дэвид Уиллер" .
  34. ^ Уилкс, Морис Винсент (1949). «EDSAC - электронная вычислительная машина». Журнал научных инструментов . 26 (12): 385–391. Bibcode : 1949JScI ... 26..385W . DOI : 10.1088 / 0950-7671 / 26/12/301 .
  35. ^ да Круз, Франк (2019-05-17). "Калькулятор магнитного барабана IBM 650" . История вычислений - хронология вычислений. Колумбийский университет . Архивировано 15 февраля 2020 года . Проверено 17 января 2012 .
  36. ^ Петтус, Сэм (2008-01-10). «SegaBase Volume 6 - Saturn» . Архивировано из оригинала на 2008-07-13 . Проверено 25 июля 2008 .
  37. ^ Каулер, Барри (1997-01-09). Язык ассемблера Windows и системное программирование: 16- и 32-разрядное низкоуровневое программирование для ПК и Windows . CRC Press . ISBN 978-1-48227572-8. Проверено 24 марта 2020 . Всегда ведутся споры о применимости языка ассемблера в нашем современном мире программирования.
  38. ^ Се, Пол (2020-03-24) [2016, 1996]. «Оптимизация программирования» . Архивировано 24 марта 2020 года . Проверено 24 марта 2020 . ... изменения дизайна имеют тенденцию влиять на производительность больше, чем ... не следует сразу переходить к языку ассемблера, пока ...
  39. ^ "Индекс TIOBE" . Программное обеспечение TIOBE . Архивировано 24 марта 2020 года . Проверено 24 марта 2020 .
  40. ^ Руслинг, Дэвид А. (1999) [1996]. «Глава 2 Основы программного обеспечения» . Ядро Linux . Архивировано 24 марта 2020 года . Проверено 11 марта 2012 .
  41. ^ a b Марков, Джон Грегори ( 28 ноября 2005 г.). «Написание самого быстрого кода вручную для развлечения: человеческий компьютер постоянно ускоряет работу микросхем» . Нью-Йорк Таймс . Сиэтл, Вашингтон, США. Архивировано 23 марта 2020 года . Проверено 4 марта 2010 .
  42. ^ "Плохое битовое поле" . hardwarebug.org . 2010-01-30. Архивировано из оригинала на 2010-02-05 . Проверено 4 марта 2010 .
  43. ^ "GCC делает беспорядок" . hardwarebug.org . 2009-05-13. Архивировано из оригинала на 2010-03-16 . Проверено 4 марта 2010 .
  44. ^ Хайд, Рэндалл . «Великие дебаты» . Архивировано из оригинала на 2008-06-16 . Проверено 3 июля 2008 .
  45. ^ "Источник кода снова терпит неудачу" . hardwarebug.org . 2010-01-30. Архивировано из оригинала на 2010-04-02 . Проверено 4 марта 2010 .
  46. ^ Щелкните, Клифф; Гетц, Брайан. «Ускоренный курс современного оборудования» . Архивировано 24 марта 2020 года . Проверено 1 мая 2014 .
  47. ^ "Программирование 68K в Фарго II" . Архивировано 2 июля 2008 года . Проверено 3 июля 2008 .
  48. ^ "Тест BLAS-август 2008" . eigen.tuxfamily.org. 2008-08-01. Архивировано 24 марта 2020 года . Проверено 4 марта 2010 .
  49. ^ "x264.git / common / x86 / dct-32.asm" . git.videolan.org. 2010-09-29. Архивировано из оригинала на 2012-03-04 . Проверено 29 сентября 2010 .
  50. ^ Босворт, Эдвард (2016). «Глава 1 - Зачем изучать язык ассемблера» . www.edwardbosworth.com . Архивировано 24 марта 2020 года . Проверено 1 июня 2016 .
  51. ^ «z / OS версии 2, выпуск 3, макроинструкции DFSMS для наборов данных» (PDF) . IBM. 2019-02-15 . Проверено 14 сентября 2021 .
  52. ^ Пол, Маттиас Р. (2001) [1996], «Спецификация и справочная документация для NECPINW» , NECPINW.CPI - драйвер переключения кодовых страниц DOS для NEC Pinwriters (изд. 2.08), FILESPEC.TXT, NECPINW.ASM, EUROFONT. INC из NECPI208.ZIP, архивируются с оригинала на 2017-09-10 , извлекаться 2013-04-22
  53. ^ Пол, Маттиас Р. (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 .
  • Канн, Чарльз В. (2021). « Введение в программирование на языке ассемблера: от супа к орехам: версия для ARM »
  • Нортон, Питер ; Соха, Джон (1986). Книга Питера Нортона по языку ассемблера для IBM PC . Нью-Йорк, США: Брейди Букс.
  • Певец, Майкл (1980). PDP-11. Программирование на языке ассемблера и организация машин . Нью-Йорк, США: John Wiley & Sons .
  • Sweetman, Доминик (1999). Смотрите MIPS Run . Издательство Морган Кауфманн . 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 на языке ассемблера
  • Советы по оптимизации сборки от Марка Ларсона
  • Таблица для преобразования языка ассемблера в машинный код
Источник « https://en.wikipedia.org/w/index.php?title=Assembly_language&oldid=1044363736 »