Как писать программы на машинном языке

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

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

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

Чем машинный код отличается от ассемблера

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

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

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

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

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

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

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

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

Как на самом деле работает двоичный код?

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

Язык ассемблера (англ. 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, 2426 просмотров.

Источник: myfilology.ru

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

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

Без разрядные команды
КОП
KOП — код операции, закодированное числом действие
Одноразрядные команды
КОП A1
КОП — код операции, закодированное числом действие; A1 – адрес ячейки памяти, в которой находиться данные для данной операции
Двухразрядные команды
КОП A1 A2
КОП — код операции, закодированное числом действие; A1 – адрес ячейки памяти, в которой находиться данные для данной операции A2 – адрес ячейки памяти, в который требуется поместить результат данной операции
Трехразрядные команды
КОП A1 A2 A3
КОП — код операции, закодированное числом действие; A1 – адрес ячейки памяти, в которой находиться первый операнд для данной операции A2 – адрес ячейки памяти, в которой находиться второй операнд для данной операции A3 – адрес ячейки памяти, в который требуется поместить результат данной операции
Команды с неопределенной разрядностью
КОП A1 A2 An
КОП — код операции, закодированное числом действие; A1-An – адреса ячеек памяти, в которых находится операнды для данной операции, а так же адреса ячеек в которые помещаются результаты выполнения данной операции.
Читайте также:
Программа для электропроводки авто

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

Рассмотрим простейший пример использования машинного кода, при вводе алгоритма в устройство вычислительной техники. Допустим, что мы имеем устройство вычислительной техники, память которого, состоит из 1000 ячеек, то есть от 000 до 999. Система команд этого устройства представлена в таблице 17. Для простоты восприятия, будем использовать только трехразрядные команды.

Таблица 17. Система команд гипотетического устройства вычислительной техники.

Операция КОП Назначение A1 Назначение A2 Назначение A3
Ввод данных Ячейка для записи Не используется Не используется
Сложение Адрес первого слагаемого Адрес второго слагаемого Адрес результата
Вычитание Адрес уменьшаемого Адрес вычитаемого Адрес результата
Умножение Адрес первого множителя Адрес второго множителя Адрес результата
Деление Адрес делимого Адрес делителя Адрес результата
Вывод Адрес выводимого значения Не используется Не используется

Рассмотрим теперь использование этой системы команд, так для записи числа 123,45 в ячейку памяти 201, нам необходимо написать следующую команду:

Для сложения данных, находящихся в ячейках 201 и 202, и помещения результата в ячейку 203, необходимо написать следующую команду:

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

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

Сначала построим алгоритм решения этой задачи. Первым делом, определимся с алгоритмической системой, для этого, разберемся с исходными данными, в заданном выражении они имеют символическое значение a,b,c,d и e, а так же с результатами вычисления, которое имеет символическое значение F. Проанализируем средства и инструменты, которые мы можем использовать, одной из проблем, связанными с программированием в машинном коде, является то, что требуется решать задачу выполняя отдельно каждое действие, то есть инструментами у нас являются простейшие арифметические операции, такие как сложение, вычитание, умножение и деление, глядя на заданное выражение, можно сделать вывод, что для решения задачи этими средствами, нам понадобиться еще один объект, для хранения промежуточного результата, придадим ему символическое название g. Теперь строим, непосредственно алгоритм решения данной задачи, рисунок 32. Для восприятия человека, не имеет значения символическое название объекта, мы воспринимаем и анализируем его суть, в отличие от нас, устройства вычислительной техники понимают только цифры.

Исполнителем алгоритма, является устройство вычислительной техники, которое не понимает, что такое символическое название, оно понимает лишь адреса и цифры. Для них символическим названием объекта является номер его ячейки памяти. Для перевода алгоритма в машинный код, первым делом надо распределить символизированные объекты по адресам, то есть определить, в каком адресе будет храниться значение того лили иного объекта. Выделим под эти нужды ячейки памяти нашего гипотетического устройства вычислительной техники с 201 по 207 и распределим их там, таблица 18 распределение символизированных объектов в памяти устройства.

Адрес Символическое имя
A
B
C
D
e
f
g

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

Алгоритм вычисления функции в машинном коде

Адрес Команда Примечание
КОП А1 А2 А3
Ввод значения объекта «a» в ячейку памяти с адресом 201
Ввод значения объекта «b» в ячейку памяти с адресом 202
Ввод значения объекта «c» в ячейку памяти с адресом 203
Ввод значения объекта «d» в ячейку памяти с адресом 204
Ввод значения объекта «e» в ячейку памяти с адресом 205
F=a*a
G=c+d
G=g*b
F=f+g
F=f-e
Вывод результата вычисления «а» из ячейки памяти с адресом 206

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

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

  1. Из памяти считывается очередная команда и передается на устройство управления для дешифровки;
  2. Адреса А1, А2 и А3, адресной части команды из устройства управления передаются в запоминающее(ЗУ) устройство (память);
  3. В запоминающем устройстве из ячеек с адресами А1 и А2 считываются числа и передаются в арифметико-логическое устройство (АЛУ);
  4. Код операции (КОП) передается в АЛУ, где над числами производиться арифметическая или логическая операция;
  5. Результат операции передается из АЛУ в ЗУ, где записывается в ячейку памяти с адресом А3;
  6. Если есть еще команды, то повторяются операции начиная с адреса А1.

Более подробно этот процесс можно проследить на графическом отображении алгоритма работы устройства вычислительной техники (рисунок 33). Этот процесс носит название принцип программного управления, и был сформулирован американским ученым Дж. Фон Нейманом и до сих пор служит основой для построения устройств вычислительной техники.

Рисунок 33

Принцип программного управления состоит в следующем:

ü Деление информации на данные и методы их обработки;

ü Кодирование данных и программы числами;

ü Запись данных и программы в память устройства вычислительной техники;

ü Последующую автоматическую работу устройства по выполнению программы.

Читайте также:
Можно ли вступить в программу

Тестовые и контрольные задания по алгоритмическому программированию студенты берут в учебно-практических и методических пособиях [1, 2, 3].

Литература

1. Попов А.А., Якушина Н.А., Роман О.В. Информатика. Учебно-практическое пособие. – М., МГУТУ, 2012. – 78 с.

2. Попов А.А. Программирование на алгоритмическом языке Бейсик.

Методические указания, лабораторный практикум и контрольные задания по

дисциплине «Информатика». – М.: МГУТУ, 2012. – 13 с.

3. Попов А.А. Программирование на алгоритмическом языке Паскаль.

Методические указания, лабораторный практикум и контрольные задания по

дисциплине «Информатика». – М.: МГУТУ, 2012. – 20 с.

Телефоны кафедры Информационных технологий

МГУТУ им. К.Г. Разумовского

(факс) 8(495) 670-66-00; 8(495) 678-25-34;

Сайт кафедры – kafedrait.com

Строкалов Владислав Викторович

Основы алгоритмизации и вычислений

Учебно-практическое пособие

Тираж: ____ экз., заказ № ____

Источник: studopedia.su

3.1. Машинный язык и ассемблер

На своем рабочем уровне микропроцессор реагирует на список операций, называемый машинной программой. На рис. 3.1, а приведено содержимое памяти, являющееся программой на машинном языке. Эта программа начинается с адреса 2000Н с содержимым КОП ОО11 11102 и оканчивается адресом 2006Н с содержимым 0111 01102. Человеку практически невозможно понять программу, представленную в такой форме.

Программа на машинном языке на рис. 3.1, а становится несколько проще для восприятия, когда она представлена в шестнадцатеричном коде (Н-коде), как показано на рис. 3.1, б. Однако, хотя двоичные данные приведены в шестнадцатеричном коде, эта часть программы всегда рассматривается как заданная на машинном языке и оказывается трудной для понимания.

В более приемлемой форме записанная на машинном языке она могла бы выглядеть так:

1. Загрузить двоичное число (1011 0100) в аккумулятор.

Инвертировать каждый двоичный бит содержимого аккумулятора.

Поместить результаты инверсии в ячейку памяти данных 2100Н.

В этой части осуществляется перевод двоичного 8-разрядного числа в его эквивалент в инверсной форме.

Возникает вопрос: как перейти от этой формы человеческого языка, иногда длинной и сложной, к машинному языку? Ответ состоит в использовании языка простого программирования – от самого высокого уровня до машинного, представленного на рис. 3.1. Ассемблер использует слова и фразы, преобразуя их в машинный код микропроцессора.

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

Сначала три буквы переведены в их эквивалент в коде ASCI , затем три кода AS СI преобразованы в оп­ределенный порядок специальной программой ассемблера, которая выдает код инверсии содержимого аккумулятора на машинном языке, т.е. 0010 11112 в данном случае или 2FH. Мнемоника преобразована в один единственный байт машинного языка.

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

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

Запомнить 244 восьмиразрядных двоичных кода очень трудно, и поэтому каждому коду ставится в соответствие мнемоническое название (мнемоника) команды, которое является сокращением от английских слов, описывающих ее действие. Например, IN 25 – input data at accumulator from port 25. На русский язык переводится так – ввести данные в аккумулятор из порта с адресом 25.

Мнемонический код команд позволяет легче запомнить их функции и значительно упрощает написание программ.

Такой язык написания программ называется языком ассемблера.

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

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

При работе микропроцессор реагирует на список команд, называемый машинной программой. На рис. 3.1 показаны программы: а) в двоичном машинном коде; б) в шестнадцатеричном машинном коде.

Программа на рис. 3.1, а начинается с адреса 2000Н с содержимым КОП 001111100 и оканчивается адресом 2006 с содержимым 01110110. Человеку практически невозможно понять программу, представленную в таком виде. Хотя любая микропроцессорная система будет работать только с такой программой.

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

А как программа, записанная на машинном языке, могла быть описана человеком?

1 – загрузить двоичное число 10110100 в аккумулятор;

2 – инвертировать каждый дв
оичный бит содержимого аккумулятора;

3 – поместить результат инверсии в ячейку памяти данных 2100Н;

4 – остановить микропроцессор.

Здесь осуществляется инвертирование двоичного восьмиразрядного числа.

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

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

Суть и процедура ассемблирования показаны на рис. 3.2, где вторая команда программы представлена единственной мнемоникой из трех букв CMA – complement accumulator – инвертировать содержимое аккумулятора.

Ход ассемблирования. Сначала три буквы переведены в их эквивалент в коде АСКИ, затем эти три кода АСКИ преобразованы в определенный порядок специальной программой ассемблера, которая выдает код инверсии содержимого аккумулятора на машинном языке – 2FH.

Программа, записанная человеком на языке ассемблера, выглядит следующим образом:

Программа разделена на 4 поля:

1 – поле метки; используется не всегда;

2 – поле мнемоники, содержит точную мнемонику, установленную разработчиком. Указывает программе ассемблера операцию для выполнения;

3 – поле операнда, содержит информацию о регистрах, данных и адресах, объединенных соответствующей операцией;

4 – поле комментариев, не учитывается ассемблером и ограничивается его перепечаткой. Очень важно, так как позволяет понять события в программе.

Таблица 3.1 Программа на языке ассемблер

Источник: electrono.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru