Языки ассемблера были разработаны для предоставления мнемоники или символов для инструкций кода машинного уровня. Программы на ассемблере состоят из мнемоник, поэтому они должны быть переведены в машинный код. Программа, которая отвечает за это преобразование, называется ассемблером . Язык ассемблера часто называют языком низкого уровня, потому что он напрямую работает с внутренней структурой ЦП. Для программирования на ассемблере программист должен знать все регистры процессора.
Различные языки программирования, такие как C, C ++, Java и различные другие языки, называются языками высокого уровня, потому что они не имеют дело с внутренними деталями процессора. Напротив, ассемблер используется для перевода программы на языке ассемблера в машинный код (иногда также называемый объектным кодом или кодом операции ). Аналогично, компилятор переводит язык высокого уровня в машинный код. Например, чтобы написать программу на языке C, необходимо использовать компилятор C для перевода программы на машинный язык.
Hello world на Assembler!
Структура ассемблера
Программа на языке ассемблера – это серия операторов, которые являются либо инструкциями на языке ассемблера, такими как ADD и MOV, либо операторами, называемыми директивами .
Инструкция говорит процессору, что делать, а директива (также называемая псевдоинструкцией ) дает инструкцию ассемблеру. Например, инструкции ADD и MOV – это команды, которые выполняет ЦП, а ORG и END – это директивы ассемблера. Ассемблер помещает код операции в ячейку памяти 0, когда используется директива ORG, а END указывает на конец исходного кода. Инструкция на языке программирования состоит из следующих четырех полей:
[ label: ] mnemonics [ operands ] [;comment ]
Квадратная скобка ([]) указывает, что поле является необязательным.
- Поле метки позволяет программе ссылаться на строку кода по имени. Поля метки не могут превышать определенного количества символов.
- Полямнемоники и операндов вместе выполняют реальную работу программы и выполняют задачи. Такие операторы, как ADD A, C «A, C» и «C, # 68» являются операндами. Эти два поля могут содержать директивы. Директивы не генерируют машинный код и используются только ассемблером, тогда как инструкции преобразуются в машинный код для выполнения CPU.
Поле метки позволяет программе ссылаться на строку кода по имени. Поля метки не могут превышать определенного количества символов.
Поля мнемоники и операндов вместе выполняют реальную работу программы и выполняют задачи. Такие операторы, как ADD A, C «A, C» и «C, # 68» являются операндами. Эти два поля могут содержать директивы. Директивы не генерируют машинный код и используются только ассемблером, тогда как инструкции преобразуются в машинный код для выполнения CPU.
1.0000 ORG 0H ;start (origin) at location 0 2 0000 7D25 MOV R5,#25H ;load 25H into R5 3.0002 7F34 MOV R7,#34H ;load 34H into R7 4.0004 7400 MOV A,#0 ;load 0 into A 5.0006 2D ADD A,R5 ;add contents of R5 to A 6.0007 2F ADD A,R7 ;add contents of R7 to A 7.0008 2412 ADD A,#12H ;add to A value 12 H 8.000A 80FE HERE: SJMP HERE ;stay in this loop 9.000C END ;end of asm source file
- Поле комментария начинается с точки с запятой, которая является индикатором комментария.
- Обратите внимание на ярлык «ЗДЕСЬ» в программе. Любая метка, которая ссылается на инструкцию, должна сопровождаться двоеточием.
Поле комментария начинается с точки с запятой, которая является индикатором комментария.
Ассемблер ДЛЯ НОВИЧКОВ: асм и дизасм
Обратите внимание на ярлык «ЗДЕСЬ» в программе. Любая метка, которая ссылается на инструкцию, должна сопровождаться двоеточием.
Сборка и запуск программы 8051
Здесь мы обсудим основную форму языка ассемблера. Шаги по созданию, сборке и запуску программы на языке ассемблера следующие:
- Во-первых, мы используем редактор для ввода программы, похожей на приведенную выше. Редакторы, такие как MS-DOS EDIT, которая поставляется со всеми операционными системами Microsoft, могут использоваться для создания или редактирования программы. Редактор должен иметь возможность создавать файл ASCII. Расширение «asm» для исходного файла используется ассемблером на следующем шаге.
- Исходный файл «asm» содержит программный код, созданный на шаге 1. Он подается на ассемблер 8051. Затем ассемблер преобразует инструкции языка ассемблера в инструкции машинного кода и создает файл .obj (объектный файл) и файл .lst (файл списка). Он также называется исходным файлом , поэтому некоторые ассемблеры требуют, чтобы этот файл имел расширения “src”. Файл “lst” является необязательным. Это очень полезно для программы, поскольку в ней перечислены все коды операций и адреса, а также ошибки, обнаруженные ассемблерами.
- Сборщикам требуется третий шаг, называемый связыванием . Ссылочная программа принимает один или несколько объектных файлов и создает абсолютный объектный файл с расширением «abs».
- Затем файл «abs» подается в программу под названием «OH» (преобразователь объекта в шестнадцатеричный формат), которая создает файл с расширением «hex», который готов записать в ПЗУ.
Во-первых, мы используем редактор для ввода программы, похожей на приведенную выше. Редакторы, такие как MS-DOS EDIT, которая поставляется со всеми операционными системами Microsoft, могут использоваться для создания или редактирования программы. Редактор должен иметь возможность создавать файл ASCII. Расширение «asm» для исходного файла используется ассемблером на следующем шаге.
Исходный файл «asm» содержит программный код, созданный на шаге 1. Он подается на ассемблер 8051. Затем ассемблер преобразует инструкции языка ассемблера в инструкции машинного кода и создает файл .obj (объектный файл) и файл .lst (файл списка). Он также называется исходным файлом , поэтому некоторые ассемблеры требуют, чтобы этот файл имел расширения “src”. Файл “lst” является необязательным. Это очень полезно для программы, поскольку в ней перечислены все коды операций и адреса, а также ошибки, обнаруженные ассемблерами.
Сборщикам требуется третий шаг, называемый связыванием . Ссылочная программа принимает один или несколько объектных файлов и создает абсолютный объектный файл с расширением «abs».
Затем файл «abs» подается в программу под названием «OH» (преобразователь объекта в шестнадцатеричный формат), которая создает файл с расширением «hex», который готов записать в ПЗУ.
Тип данных
Микроконтроллер 8051 содержит один тип данных из 8 бит, и каждый регистр также имеет размер 8 бит. Программист должен разбить данные размером более 8 бит (от 00 до FFH или до 255 в десятичном виде), чтобы они могли быть обработаны процессором.
DB (Определить байт)
Директива DB является наиболее широко используемой директивой данных в ассемблере. Он используется для определения 8-битных данных. Его также можно использовать для определения данных в десятичном, двоичном, шестнадцатеричном или ASCII-форматах. Для десятичного числа «D» после десятичного числа является необязательным, но это требуется для «B» (двоичный) и «Hl» (шестнадцатеричный).
Чтобы указать ASCII, просто поместите символы в кавычки («как это»). Ассемблер автоматически генерирует ASCII-код для чисел / символов. Директива DB является единственной директивой, которая может использоваться для определения строк ASCII длиннее двух символов; следовательно, его следует использовать для всех определений данных ASCII. Некоторые примеры БД приведены ниже –
ORG 500H DATA1: DB 28 ;DECIMAL (1C in hex) DATA2: DB 00110101B ;BINARY (35 in hex) DATA3: DB 39H ;HEX ORG 510H DATA4: DB «2591» ;ASCII NUMBERS ORG 520H DATA6: DA «MY NAME IS Michael» ;ASCII CHARACTERS
Вокруг строк ASCII можно использовать одинарные или двойные кавычки. БД также используется для выделения памяти кусками размером в байты.
Директивы ассемблера
Вот некоторые из директив 8051:
- ORG (origin) – директива origin используется для указания начала адреса. Он принимает числа в шестнадцатеричном или десятичном формате. Если после числа указано H, число считается шестнадцатеричным, в противном случае – десятичным. Ассемблер преобразует десятичное число в гекса.
- EQU (equate) – используется для определения константы, не занимая место в памяти. EQU связывает постоянное значение с меткой данных, так что метка появляется в программе, а ее постоянное значение будет заменено меткой. При выполнении инструкции «MOV R3, #COUNT» в регистр R3 будет загружено значение 25 (обратите внимание на знак #). Преимущество использования EQU состоит в том, что программист может изменить его один раз, а ассемблер изменит все его вхождения; программист не должен искать всю программу.
- Директива END – указывает конец исходного файла (asm). Директива END является последней строкой программы; что-нибудь после директивы END игнорируется ассемблером.
ORG (origin) – директива origin используется для указания начала адреса. Он принимает числа в шестнадцатеричном или десятичном формате. Если после числа указано H, число считается шестнадцатеричным, в противном случае – десятичным. Ассемблер преобразует десятичное число в гекса.
EQU (equate) – используется для определения константы, не занимая место в памяти. EQU связывает постоянное значение с меткой данных, так что метка появляется в программе, а ее постоянное значение будет заменено меткой. При выполнении инструкции «MOV R3, #COUNT» в регистр R3 будет загружено значение 25 (обратите внимание на знак #). Преимущество использования EQU состоит в том, что программист может изменить его один раз, а ассемблер изменит все его вхождения; программист не должен искать всю программу.
Директива END – указывает конец исходного файла (asm). Директива END является последней строкой программы; что-нибудь после директивы END игнорируется ассемблером.
Метки на ассемблере
Все метки на языке ассемблера должны соответствовать приведенным ниже правилам.
Первый символ должен быть в алфавитном порядке; это не может быть число.
Зарезервированные слова не могут использоваться в качестве метки в программе. Например, слова ADD и MOV являются зарезервированными словами, поскольку они являются мнемоникой инструкций.
Источник: coderlessons.com
Структура ассемблерной программы
Здесь представлена основная информация по ассемблеру всей серии AVR, т.к. все микроконтроллеры этой серии программно совместимы.
Ассемблер – это инструмент, с помощью которого создаётся программа для микроконтроллера. Ассемблер транслирует ассемблируемый исходный код программы в объектный код, который может быть непосредственно введен в программную память микроконтроллера, а также использоваться в симуляторах или эмуляторах AVR.
При работе с ассемблером нет никакой необходимости в непосредственном соединении с микроконтроллером.
Исходный файл, с которым работает ассемблер, должен содержать мнемоники, директивы и метки.
Перед каждой строкой программы можно ставить метку, которая является алфавитно-цифровой строкой, заканчивающейся двоеточием. Метки используются как указания для безусловного перехода и команд условного перехода.
Строка программы может быть в одной из четырёх форм:
[Метка:] директива [операнды] [Комментарий]
[Метка:] команда [операнды] [Комментарий]
Комментарий имеет следующую форму:
Таким образом любой текст после символа «;» игнорируется ассемблером и имеет значение только для пользователя.
Операнды можно задавать в различных форматах:
– десятичный (по умолчанию): 10,255
– шестнадцатеричный (два способа): 0x0а, $0а
– двоичный: 0b00001010, 0b11111111
– восьмеричный (впереди ноль): 010, 077
Директивы ассемблера
Ассемблер поддерживает множество директив. Директивы не транслируются непосредственно в коды операции. Напротив, они используются, чтобы корректировать местоположение программы в памяти, определять макрокоманды, инициализировать память и так далее. То есть это указания самому ассемблеру, а не команды микроконтроллера.
Директивы соответствуют второй версии компилятора ассемблера avrasm2.exe компании «Atmel».
Директивы ассемблера приведены в таблице 8.
Синтаксис всех директив следующий:
То есть перед директивой должна стоять точка. Иначе ассемблер воспринимает это как метку.
Таблица 8. Директивы ассемблера
Директива | Описание |
BYTE | Зарезервировать байт под переменную |
CSEG | Сегмент кодов |
DB | Задать постоянным(и) байт(ы) в памяти |
DEF | Задать символическое имя регистру |
DEVICE | Задать для какого типа микроконтроллера компилировать |
DSEG | Сегмент данных |
DW | Задать постоянное(ые) слово(а) в памяти |
EQU | Установить символ равный выражению |
ESEG | Сегмент EEPROM |
EXIT | Выход из файла |
INCLUDE | Включить исходный код из другого файла |
LIST | Включить генерацию.lst — файла |
NO.LIST | Выключить генерацию.lst — файла |
ORG | Начальный адрес программы |
SET | Установить символ, равный выражению |
Дадим несколько пояснений наиболее важным директивам ассемблера.
Директива CSEG указывает на начало сегмента кодов. Ассемблируемый файл может иметь несколько кодовых сегментов, которые будут объединены в один при ассемблировании. Синтаксис:
.DSEG; Начало сегмента данных
vartab:.BYTE 4; Резервируется 4 байта в ОЗУ
.CSEG; Начало сегмента кодов
const:.DW 2; Записать 0x0002 в программной памяти
mov r1,r0; Что-то делать
Директива DSEG указывает на начало сегмента данных. Ассемблируемый файл может содержать несколько сегментов данных, которые потом будут собраны в один при ассемблировании. Обычно сегмент данных состоит лишь из директив BYTE и меток. Синтаксис:
.DSEG; Начало сегмента данных
varl:.BYTE 1; Резервировать 1 байт под переменную varl
table:.BYTE tab_size; Резервировать tab_size байтов.
Директива ESEG указывает на начало сегмента EEPROM памяти.
Ассемблируемый файл может содержать несколько EEPROM сегментов, которые будут собраны в один сегмент при ассемблировании. Обычно сегмент EEPROM состоит из DB и DW директив (и меток). Сегмент EEPROM памяти имеет свой собственный счетчик. Директива ORG может использоваться для размещения переменных в нужной области EEPROM.
В данной версии комплекса программирование EEPROM может осуществляться только непосредственно из программы учащегося. Прямое программирование в процессе прошивки не предусмотрено.
.DSEG; Начало сегмента данных
varl:.BYTE 1; Резервировать 1 байт под переменную varl
table:.BYTE tab_size; Зарезервировать tab_size байт
eevarl:.DW 0xffff; Записать 1 слово в EEPROM
Директива ORG присваивает значения локальным счетчикам. Используется только совместно с директивами.CSEG,.DSEG,.ESEG.
.DSEG; Начало сегмента данных
.ORG 0x37; Установить адрес ОЗУ на 37h
variable:.BYTE 1; Зарезервировать байт СОЗУ по адресу 37h
.ORG 0x10; Установить счетчик команд на адрес 10h
mov r0,rl; Чего-нибудь делать
Директива DB резервирует ресурсы памяти (байты) в программной памяти или в EEPROM. Директиве должна предшествовать метка. DB задает список выражений и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.
Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между
–128 и 255.
Если директива указывается в сегменте кодов и список выражений содержит более двух величин, то выражения будут записаны так, что 2 байта будут размещаться в каждом слове Flash-памяти.
LABEL:.DB список выражений
сonsts:.DB 0, 255, 0b01010101, -128, 0хаа
Директива DW резервирует ресурсы памяти (слова) в программной памяти или в EEPROM. Директиве должна предшествовать метка. DW задает список выражений и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.
Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между
–32768 и 65535.
LABEL:.DW список выражений
varlist:.DW 0, 0xffff, 0b1001110001010101, -32768, 65535
eevarlst:.DW 0, 0xffff, 10
Директива DEF позволяет присвоить символическое имя регистру. Регистр может иметь несколько символических имен.
.DEF Имя = Регистр
. DEF temp=R16.DEF ior=R0
ldi temp,0xf0; Загрузить 0xf0 в регистр temp
in ior,0x3f; Прочитать SREG в регистр ior
Директива EQU присваивает значение метке. Эта метка может быть использована в других выражениях. Значение этой метки нельзя изменить или переопределить.
.EQU метка = выражение
.EQU io_offset = 0x23
.EQU porta = io_offset + 2
.CSEG; Начало сегмента кодов
clr r2; Очистить регистр r2
out porta,r2; Записать в порт А
Директива INCLUDE предлагает Ассемблеру начать читать из другого файла. Ассемблер будет ассемблировать этот файл до конца файла или до директивы EXIT. Включаемый файл может сам включать директивы INCLUDE.
.INCLUDE «имя файла»
.EQU sreg = 0x3f; Регистр статуса
.EQU sphigh = 0хЗе; Старший байт указателя стека.
.EQU splow = 0x3d;; Младший байт указателя стека.
.INCLUDE iodefs.asm; Включить файл «iodefs.asm»
in r0,sreg; Прочитать регистр статуса
EXIT – выйти из файла.
Директива EXIT позволяет ассемблеру остановить ассемблирование текущего файла. Обычно ассемблер работает до конца файла. Если он встретит директиву EXIT, то продолжит ассемблировать со строки, следующей за директивой INCLUDE.
.EXIT; выйти из этого файла
DEVICE – указать, для какого микроконтроллера ассемблировать.
Директива позволяет пользователю сообщить ассемблеру, для какого типа устройства пишется программа. Если ассемблер встретит команду, которая не поддерживается указанным типом микроконтроллера, то будет выдано сообщение. Также сообщение появится в случае, если размер программы превысит объем имеющейся в этом устройстве памяти.
.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtinyl1 | ATtinyl2 | ATtiny22 |
ATmega64 | ATmega128| Atmega8535
.DEVICE АТmega8535; использовать АТmega8535
jmp label1; При ассемблировании появится сообщение, что
; ATmega8535 не поддерживает команду jmp в
; таблице векторов прерываний
Структура ассемблерной программы
Программа, написанная на ассемблере, должна иметь определенную структуру.
Предлагается следующий шаблон (для ATmega8535)
; краткое описание, необходимые пояснения
; *********** подключаемые дополнительные файлы
.include «m8535def.inc»; файл описания ATmega8535
.include «имя_файла1.расширение»; включение дополнительных
.include «имя_файла2.расширение»; файлов
;****** глобальные регистровые переменные
def имя1 = регистр
def имя2 = регистр
.org ххх; адрес первого зарезервированного байта
label1:.BYTE 1; резервировать 1 байт под переменную label1
label2:.BYTE m; резервировать m байт под переменную label2
.****** сегмент ЕЕPROM (ЭСППЗУ)
.org ххх; адрес первого зарезервированного байта
.db выражение1,выражение2. ;записать список байтов в EEPROM
.dw выражение1,выражение2. ;записать список слов в EEPROM
.org $000; адрес начала программы в программной памяти
.****** вектора прерываний (если они используются)
rjmp reset; прерывание по сбросу
rjmp INT0; обработчик внешнего прерывания 0
rjmp INT1; обработчик внешнего прерывания 1
.org adrINTx; адрес следующего обработчика прерываний
rjmp INTx; обработчик прерывания х
. ; далее по порядку располагать обработчики остальных
;******* начало основной программы
;******* программы обработчиков прерываний
; конец программы никак не обозначается.
В комплексе предусмотрена работа с однофайловыми программами для учебных целей, поэтому подключение внешних файлов, кроме.include «m8535def.inc», смысл имеет только для внешних сред программирования типа AVRStudio.
При использовании подпрограмм нужно обязательно определять стек. Для этого в начале основной программы нужно занести значения адреса вершины стека в регистры SPH и SPL.
Примеры программ
Ниже приводятся 3 программы для решения одной и той же простейшей задачи, демонстрирующие использование директив ассемблера.
Рис. 8. Алгоритм программы № 1
Задача следующая: вычесть из числа 5 число 3. Если включен тумблер на входе РА2, то на индикацию выдать результат вычитания. Если тумблер отключен – на индикацию вывести цифру ноль.
При работе с портами ввода/вывода следует учитывать, что направление передачи данных через отдельные выводы задается с помощью регистров DDR (DDRA, DDRB, DDRC, DDRD). Если вывод порта сконфигурирован как выход, то его переключение производится через регистр PORT (PORTA, PORTB, PORTC, PORTD), если вывод сконфигурирован как вход, то его опрос следует производить через регистр входных данных PIN (PINA, PINB, PINC, PIND).
Алгоритм программы (рис. 8) соответствует программе № 1, использующей директиву equ ассемблера.
;Программа №1.Использование директивы equ
.include «m8535def.inc»;включить файл-описание ATmega8535
.equ cod0=$64;присвоение имен ячейкам ОЗУ
Источник: poisk-ru.ru
Язык ассемблера
Язык ассемблера (автокод) — язык программирования низкого уровня. В отличие от языка машинных кодов, позволяет использовать более удобные для человека мнемонические (символьные) обозначения команд. При этом для перевода с языка ассемблера в понимаемый процессором машинный код требуется специальная программа, называемая ассемблером.
Команды языка ассемблера один к одному соответствуют командам процессора, фактически, они представляют собой более удобную для человека символьную форму записи (мнемокод) команд и их аргументов.
Кроме того, язык ассемблера обеспечивает использование символических меток вместо адресов ячеек памяти, которые при ассемблировании заменяются на автоматически рассчитываемые абсолютные или относительные адреса, а также так называемых директив (команд, не переводящихся в процессорные инструкции, а выполняемых самим ассемблером).
Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макроопределения с параметрами.
Каждая модель (или семейство) процессоров имеет свой набор команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы: Intel-синтаксис и AT
С использованием программирования на ассемблере производятся:
- Оптимизация критичных к скорости участков программ написанных на языке высокого уровня, таком как C++. Это особенно актуально для игровых приставок, у которых фиксированная производительность, и для мультимедийныхкодеков, которые стремятся делать менее ресурсоемкими и более популярными.
- Создание операционных систем (ОС). ОС часто пишут на Си, языке, который специально был создан для написания одной из первых версий Unix. Аппаратно зависимые участки кода, такие, как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения — HAL и ядро, часто пишутся на ассемблере. Ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся к переносимости и надёжность, но тем не менее он присутствует. Некоторые любительские ОС, такие, как MenuetOS, целиком написаны на ассемблере. При этом MenuetOS помещается на дискету и содержит графический многооконный интерфейс.
- Программирование микроконтроллеров (МК) и других встраиваемых процессоров. По мнению профессора Танненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени. [1] На сегодняшний день для программирования МК весьма часто применяют ассемблер. В МК приходится перемещать отдельные байты и биты между различными ячейками памяти. Программирование МК весьма важно, так как, по мнению Танненбаума, в автомобиле и квартире современного цивилизованного человека в среднем содержится 50 микроконтроллеров. [2]
- Создание драйверов. Некоторые участки драйверов, взаимодействующие с аппаратным обеспечением, программируют на ассемблере. Хотя в целом в настоящее время драйверы стараются писать на языках высокого уровня в связи с повышенными требованиями к надёжности. Надёжность для драйверов играет особую роль, поскольку в Windows NT и Linux драйверы работают в режиме ядра. Одна ошибка может привести к краху системы.
- Создание антивирусов и других защитных программ.
- Написание трансляторов языков программирования.
Нелегальная сфера деятельности
Программирование на языке ассемблера характерно также для нелегальных сфер деятельности в ИТ, в частности, с использованием ассемблера производятся:
- Взлом программ. «Оригинал» ПО, копии которого продаются незаконно, если в нём использовались технические средства защиты авторских прав, вероятно, был взломан с помощью отладчика и знаний языка ассемблера. Это позволяет при помощи отладчика или дизассемблера найти внутри кода программы функцию, ответственную за ввод кода активации или прекращение работы демонстрационной версии программы. Взломщик может изменить исходный код программы при помощи специального редактора, либо создать генератор ключа. Первый способ более прост для конечного пользователя. Второй менее наказуем (УК РФ, ст. 272: до 2 лет). [3]
- Создание вирусов и других вредоносных программ (УК РФ, ст. 273: до 3 лет, при тяжких последствиях до 7 лет).
Связывание программ на разных языках
Поскольку на ассемблере часто разрабатываются только фрагменты программ, их необходимо связывать с остальными частями программной системы, написанными на других языках программирования.
Это достигается 2 основными способами:
- На этапе компиляции — вставка в программу ассемблерных фрагментов (привет) с помощью специальных директив языка (в частности, данный способ поддерживается языком программирования Си), в том числе написание функций на языке ассемблера. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода, с данными и подпрограммами, включая подпрограммы с множеством входов и выходов, не поддерживаемых высокоуровневыми языками, с помощью него сделать нельзя.
- На этапе компоновки, или раздельной компиляции. Для взаимодействия скомпонованных модулей достаточно, чтобы связующие функции (определённые в одних модулях и использующиеся в других) поддерживали нужные соглашения вызова (привет) и типы данных. Написаны же отдельные модули могут быть на любых языках, в том числе и на ассемблере.
Синтаксис
Синтаксис языка ассемблера определяется системой команд конкретного процессора.
Набор команд
Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):
- Команды пересылки данных (mov, lea и т. д.)
- Арифметичекие команды (add, sub, imul и т. д.)
- Логические и побитовые операции (or, and, xor, shr и т. д.)
- Команды управления ходом выполнения программы (jmp, loop, ret и т. д.)
- Команды вызова прерываний (иногда относят к командам управления): int, into
- Команды ввода/вывода в порты (in, out)
- Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:
- cbne — перейти, если не равно
- dbnz — декрементировать, и если результат ненулевой, то перейти
- cfsneq — сравнить, и если не равно, пропустить следующую команду
Инструкции
Типичный формат записи команд: [метка:] опкод [операнды] [;комментарий]
где опкод (код операции) — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.).
В качестве операндов могут выступать константы, адреса регистров, адреса в оперативной памяти и пр.. Различия между стандартами Intel и ATT-синтаксис (оригинальные мнемоники приводятся к синтаксису AThttps://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F:%D0%AF%D0%B7%D1%8B%D0%BA_%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%B0″ target=»_blank»]www.tadviser.ru[/mask_link]