AAA
Обычный Черный

Кто не делится найденным, подобен свету в дупле секвойи (древняя индейская пословица)

версия для печатиВерсия для печати



Библиографическая запись: Основы языков программирования. Машинно-ориентированные языки (ассемблеры). — Текст : электронный // Myfilology.ru – информационный филологический ресурс : [сайт]. – URL: https://myfilology.ru//165/yazyki-programmirovaniya-i-ix-ispolzovanie-v-informaczionnyx-sistemax/yazyki-programmirovaniya-i-ix-ispolzovanie-v-informaczionnyx-sistemax/ (дата обращения: 19.04.2024)

Основы языков программирования. Машинно-ориентированные языки (ассемблеры)

Основы языков программирования. Машинно-ориентированные языки (ассемблеры)

Содержание

    Основы языков программирования

    Язык программирования — формальный язык, предназначенный для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением.

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

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

    Языки программирования можно классифицировать по следующим признакам.

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

    По степени детализации алгоритма получения результата языки программирования делятся на языки низкого уровня, языки высокого уровня и языки сверхвысокого уровня.

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

    По возможности дополнения новыми типами данных и операциями различают расширяемые и нерасширяемые языки.

    По возможности управления реальными объектами и процессами выделяют языки систем реального времени и языки систем условного времени.

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

    По типу решаемых задач различают языки системного программирования и языки прикладного программирования.

    Машинно-ориентированные языки (ассемблеры)

    Язык ассемблера (англ. assembly language) — машинно-ориентированный язык программирования низкого уровня. Представляет собой систему обозначений, используемую для представления в удобно читаемой форме программ, записанных в машинном коде. Его команды прямо соответствуют отдельным командам машины или их последовательностям. Является существенно платформо-зависимым: языки ассемблера для различных аппаратных платформ несовместимы, хотя могут быть в целом подобны.

    Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления).

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

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

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

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

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

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

    Таким образом, ассемблер — это машинно ориентированный язык программирования, позволяющий работать с компьютером напрямую, один на один. Отсюда и его полная формулировка — язык программирования низкого уровня второго поколения (после машинного кода). Команды ассемблера один в один соответствуют командам процессора, но поскольку существуют различные модели процессоров со своим собственным набором команд, то, соответственно, существуют и разновидности, или диалекты, языка ассемблера. Поэтому использование термина «язык ассемблера» может вызвать ошибочное мнение о существовании единого языка низкого уровня или хотя бы стандарта на такие языки. Его не существует. Поэтому при именовании языка, на котором написана конкретная программа, необходимо уточнять, для какой архитектуры она предназначена и на каком диалекте языка написана. Поскольку ассемблер привязан к устройству процессора, а тип процессора жестко определяет набор доступных команд машинного языка, то программы на ассемблере не переносимы на иную компьютерную архитектуру.

    Основными машинно-ориентированными языками являются языки ассемблеров или, как часто их называют, ассемблеры. Транслятор с такого языка также называют ассемблером. Когда говорят «ассемблер x86», то могут подразумевать как язык машинно-ориентированного программирования компьютеров с архитектурой Intel x86, так и сам компилятор с этого языка. Чтобы разобраться, что имеется в виду, нужно чувствовать контекст. Ассемблер архитектуры x86 совершенно не пригоден для разработки программ с иной целевой архитектурой, например, микроконтроллеров ARM. Ассемблер ARM также не может транслировать программы, предназначенные для x86. Для компьютеров семейства архитектур Intel x86 существует довольно много ассемблер-трансляторов, основными из которых являются: MASM, TASM, NASM, FASM, YASM, WASM, HLA. 

    Естественно считать машинно-ориентированным языком язык машинных кодов. Чаще всего машинные коды пишутся в шестнадцатеричной системе счисления (HEX-код), но для некоторых архитектур используется восьмеричная система. Использование машинных кодов выгодно в случаях, когда необходимо что-то изменить непосредственно в машинной программе, исходные коды для которой отсутствуют.

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

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

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

    Вторая область применения Ассемблера связана с оптимизацией выполнения тех больших программ, которые требуют много времени для счёта. Часто программы-переводчики (трансляторы) с языков высокого уровня дают не совсем эффективную программу на машинном языке. Причина этого заключается в том, что такие программы могут иметь специфические особенности, которые не сможет учесть транслятор. Особенно это касается программ вычислительного характера, которые бóльшую часть времени (более 99%) выполняют очень небольшой по длине (около 1-3%) участок программы (обычно называемый главным циклом). Для повышения эффективности выполнения этих программ могут использоваться так называемые многоязыковые системы программирования, которые позволяют записывать части программы на разных языках. Обычно основная часть оптимизируемой программы записывается на языке программирования высокого уровня (Фортране, Паскале, Си и т.д.), а критические по времени выполнения участки программы – на Ассемблере. Скорость работы всей программы при этом может значительно увеличиться.

    Часто это единственный способ заставить сложную программу дать результат за приемлемое время.

    Стоит отметить, что есть и "специфические" области применения Ассемблера, например, реинжениринг (reverse engineering). Под этим обычно подразумевают исследование и преобразование программ на машинном языке в программы на языках более высокого уровня (в основном на Ассемблер), в целях их изучения и изменения.


    1. Негода В. Н. Машинно-ориентированное программирование : учебное пособие / В. Н. Негода. – Ульяновск : УлГТУ, 2015. – 160 с.
    2. Погружение в assembler. Полный курс по программированию на асме от ][. — Текст : электронный // «Хакер» -  Безопасность, разработка, DevOps : [сайт]. – URL: https://xakep.ru/2017/09/11/asm-course-1/ (дата обращения: 5.01.2021)

    03.01.2021, 3045 просмотров.


    Уважаемые посетители! С болью в сердце сообщаем вам, что этот сайт собирает метаданные пользователя (cookie, данные об IP-адресе и местоположении), что жизненно необходимо для функционирования сайта и поддержания его жизнедеятельности.

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

    Dear visitors! It is a pain in our heart to inform you that this site collects user metadata (cookies, IP address and location data), which is vital for the operation of the site and the maintenance of its life.

    If you do not want to provide this data for processing under any pretext, please leave the site immediately and we will not tell anyone that you were here. With the same care, the site administration.