Программа которая переводит в машинные коды программы
Компилятор (англ. compiler — составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.
1) GCC
2) Free Pascal Compiler
3) Компиляторы C , C ++ и Fortran от Sun Microsystems Inc .
4) Watcom Fortran/C++ Compiler
5) Intel C++/Fortran compiler
6) ICC AVR.
Компилятор обеспечивает преобразование программы с одного языка на другой. Команды исходного языка сильно отличаются по организации и мощности, нежели команды машинного языка. Бывают такие, в которых одна команда исходного языка транслируется в 7-10 машинных команд.
Существуют даже такие, в которых в каждой команде может соответствовать более 100 машинных команд (например язык программирования Пролог). В исходных языках довольно часто используется строгая типизация данных, которая осуществляется через их предварительное описание. Программирование на таких языках может опираться не только на кодирование алгоритма, но и на тщательное обдумывание структур данных или классов. Весь процесс трансляции с таких языков программирования обычно называется компиляцией, а исходные языки обычно относятся к языкам высокого уровня.
Почему МАШИНЫ говорят на ДВОИЧНОМ КОДЕ? — Научпок #shorts
Интерпретатор (англ. interpreter — истолкователь, устный переводчик) переводит и выполняет программу строка за строкой.В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы.
Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким.
Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.
Компилятор VS интерпретатор: ключевые отличия
Интерпретаторы и компиляторы отвечают за преобразование языка программирования или сценариев (язык высокого уровня) в машинный код. Но если обе программы делают одно и то же, чем они различаются? Давайте разберемся.
Компилятор
Что такое компилятор?
Компилятор — это компьютерная программа, которая переводит компьютерный код с одного языка программирования на другой. Компилятор берет программу целиком и преобразует ее в исполняемый компьютерный код. Для этого требуется целая программа, так как компьютер понимает только то, что написано двоичным кодом. Задача компилятора — преобразовать исполняемую программу в машинный код, который и распознается компьютером. Примерами скомпилированных языков программирования являются C и C++.
Перевод числа в двоичную систему за два шага!!!
Компилятор в основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык программирования более низкого уровня.
Компилятор способен выполнять многие или даже все операции: предварительную обработку данных, парсинг, семантический анализ, преобразование входных программ в промежуточное представление, оптимизацию и генерацию кода.
Интерпретатор
Что такое интерпретатор?
Интерпретатор — это компьютерная программа, которая преобразует каждый программный оператор высокого уровня в машинный код. Сюда входят исходный код, предварительно скомпилированный код и сценарии.
Интерпретатор представляет собой машинную программу, которая непосредственно выполняет набор инструкций без их компиляции. Примерами интерпретируемых языков являются Perl, Python и Matlab.
- И компилятор, и интерпретатор выполняют одну и ту же работу — преобразовывают язык программирования высокого уровня в машинный код. Однако компилятор преобразовывает исходный материал в машинный код перед запуском программы. Интерпретатор выполняет эту функцию при ее запуске.
Как это работает?
Сначала компилятор создает программу. Он анализирует все операторы языка, чтобы проверить, правильны они или нет. Если компилятор найдет какую-нибудь ошибку, он выдаст соответствующее сообщение. Если же он не обнаружит никаких ошибок, то преобразует исходный код в машинный. Компилятор связывает различные кодовые файлы в программы, которые можно запустить (например, формата .exe).
После этого запускается программа.
Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Происходит построчное выполнение исходных операторов во время исполнения программы.
Что такое компилятор
В этом гайде вы узнаете о том, что такое компилятор и как он работает. Мы разберем этапы компиляции и от чего зависит выбор подходящего компилятора. Этот материал поможет лучше понять, как компьютер выполняет программный код и почему иногда код не компилируется.
Зачем нужен компилятор?
Процессор — самая важная часть компьютера. Он обрабатывает информацию, выполняет команды пользователя и следит за работой всех подключенных устройств. Но процессор может разобрать только машинный код — набор 0 и 1, которые записаны в определённом порядке.
Почему именно 0 и 1? В процессор поступают электрические сигналы. Сильный сигнал обозначается цифрой 1, а слабый — 0. Набор таких цифр обозначает какую-то команду. Процессор ее распознает и выполняет.
Программы для первых компьютеров выглядели как огромные наборы 0 и 1. Чтобы записать такую программу, инженеры пользовались гибкими картонными карточками — перфокартами. Цифры на перфокарте записывались поочередно, в несколько строк. Чтобы записать 1, программист делал отверстие в карте. Места без отверстия обозначали 0.
Компьютер считывал перфокарту специальным устройством и выполнял записанную команду. Для одной программы составляли сотни перфокарт.
Писать их было долго и сложно, поэтому инженеры стали создавать языки программирования, обозначая команды словами и знаками. Для того, чтобы процессор понимал, какие команды записаны в программе, программисты создали компилятор — программу, которая преобразует программный код в машинный.
Как работает компилятор?
Преобразование программного кода в машинный называется компиляцией. Компиляция только преобразует код. Она не запускает его на исполнение. В этот момент он «статически» (то есть без запуска) транслируется в машинный код. Это сложный процесс, в котором сначала текст программы разбирается на части и анализируется, а затем генерируется код, понятный процессору.
Разберём этапы компиляции на примере вычисления периметра прямоугольника:
После запуска программы компилятору нужно определить, какие команды в ней записаны. Сначала компилятор разделяет программу на слова и знаки — токены, и записывает их в список. Такой процесс называется лексическим анализом. Его главная задача — получить токены.
Затем компилятор читает список и ищет токен-операторы. Это могут быть оператор присваивания( = ), арифметические операторы( + , — , * , / ), оператор вывода( printf() ) и другие операторы языка программирования. Такие операторы работают с числами, текстом и переменными.
Компилятор должен понять, какие токены в списке связаны с токен-оператором. Чтобы сделать это правильно, для каждого оператора строится специальная структура — логическое дерево или дерево разбора.
Так операция P = 2*(a + b) будет преобразована в логическое дерево:
Теперь каждое дерево нужно разобрать на команды, и каждую команду преобразовать в машинный код. Компилятор начинает читать дерево снизу вверх и составляет список команд:
- Взять переменную a , взять переменную b , сложить их
- Взять результат сложения, взять число 2 и найти их произведение
- Результат произведения присвоить (записать) в переменную P
Компилятор еще раз проверяет команды, находит ошибки и старается улучшить код. При успешном завершении этого этапа, компилятор переводит каждую команду в набор 0 и 1. Наборы записываются в файл, который сможет прочитать и выполнить процессор.
На чем написан компилятор?
В 1950-е годы группа разработчиков IBM под руководством Джона Бэкуса разработала первый высокоуровневый язык программирования Fortran, который позволил писать программы на понятном человеку языке. Помимо языка, инженеры работали и над компилятором. Он представлял собой программу с набором исполняемых команд, которая могла компилировать другие программы на Fortran, в том числе и улучшенную версию себя.
В дальнейшем язык Fortran и его компилятор использовали, чтобы написать компиляторы для новых языков программирования. Такой подход используют программисты и в настоящее время. Писать машинный код долго и неудобно. К тому же, для современных процессоров он может отличаться. Придется писать несколько версий одного и того же компилятора для разных компьютеров.
Быстрее и проще написать компилятор на существующем языке программирования. Для этого разработчики выбирают удобный язык и пишут на нем первую версию своего компилятора. Он будет более универсальным для компьютеров и легко скомпилирует улучшенную версию себя.
Какие бывают компиляторы?
Ни один компилируемый язык программирования не обходится без компилятора. Некоторые компиляторы работают с несколькими языками программирования. Но программист должен учитывать еще и параметры компьютера, на котором программа будет запускаться.
Дело в том, что современные процессоры отличаются друг от друга устройством, поэтому машинный код для одного процессора будет понятен, а для другого нет. Это касается и операционных систем: одна и та же программа будет работать на Windows, но не запустится на Linux или MacOS. Поэтому нужно пользоваться тем компилятором, который работает с нужным процессором и операционной системой.
Если программа будет работать на нескольких операционных системах, то нужен кросс-компилятор — компилятор, который преобразует универсальный машинный код. Например, GNU Compiler Collection(сокращенно GCC) поддерживает C++, Objective-C, Java, Фортран, Ada, Go и поддерживает разную архитектуру процессоров.
Начинающие программисты даже не знают о наличии компилятора на компьютере. Они пишут программы в интегрированной среде разработки, в которую встроен компилятор, а иногда и не один. В этом случае, выбор компилятора делает среда, а не программист. Например, MS Visual Studio поддерживает компиляторы для операционных систем Windows, Linux, Android. Выбирая тип проекта, Visual Studio определяет процессор и операционную систему компьютера, и после этого выбирает подходящий компилятор.
Какие ошибки может определить компилятор?
Когда компилятор анализирует текст программы, он проверяет, соответствует ли запись оператора стандартам языка. Если найдено несоответствие, то компилятор выводит об этом информацию пользователю в виде ошибки. Когда вся программа разобрана, пользователь видит список ошибок, которые есть в коде, и может их исправить. Пока программист не исправит ошибки, компилятор не перейдет к следующему этапу — генерации машинного кода для процессора. Чаще всего компилятор показывает пользователю:
- ошибки объявления переменных или отсутствие их начальных значений
- ошибки несоответствия типов
- ошибки неправильной записи операторов и функций
Иногда компилятор определяет код, который при выполнении дает неправильный результат. Но преобразовать такую программу в машинный код все-таки можно. В этом случае компилятор показывает пользователю предупреждение. Такая реакция компилятора больше похожа на рекомендации, но на них стоит обратить внимание.
Программист сам решает оставить код с предупреждением или изменить программу. Анализируя текст программы, компилятор не только ищет ошибки, но еще и упрощает ее код. Такой процесс называется оптимизацией. Во время оптимизации компилятор изменяет программный код, но функции, которые выполняла программа, остаются прежними.
Выводы и рекомендации
Компилятор — переводчик между программистом и процессором. Он преобразует текст программы в машинный код, определяет ряд ошибок в программе и оптимизирует ее работу. Выбирая, где компилировать программу, важно помнить о том, что машинный код для процессоров и операционных систем будет разным, и подобрать правильный компилятор. Чем точнее компилятор определит команды, тем корректнее и быстрее будет работать программа. Для этого следуйте простым рекомендациям:
- использовать простые, понятные команды;
- помнить о соответствии типов данных;
- внимательно набирать код, избегая синтаксических ошибок;
- избегать повторяющихся действий и бесполезных переменных.
Частые вопросы
Чем компилятор отличается от интерпретатора?
Компилятор это программа, которая выполняет преобразование текста программы в другое представление, обычно машинный код, без его запуска, статически. Затем эта программа уже может быть запущена на выполнение. Интерпретатор сразу запускает код и выполняет его в процессе чтения. Промежуточного этапа как в компиляции нет.
Компилятор
Компиля́тор — транслятор, который осуществляет перевод всей исходной программы в эквивалентную ей результирующую программу на языке машинных команд или на языке ассемблера.
Основы
Большинство компиляторов переводят программу с некоторого высокоуровневого языка программирования в низкоуровневом языке . Например, для языка Java это язык Java Virtual Machine, .NET Framework компилируются заранее).
Для каждой целевой машины ( Apple и т. д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора. Существуют также так называемые «кросс-компиляторы», позволяющие на одной машине и в среде одной ОС получать код, предназначенный для выполнения на другой целевой машине или в среде другой ОС. Кроме того, компиляторы для одной и той же целевой машины могут быть оптимизированы под разные Intel , создаёт машинный код, который быстрее всего выполняется на компьютерах с этими процессорами.
Существуют программы, которые решают обратную задачу — перевод программы с низкоуровневого языка на высокоуровневый. Этот процесс называют декомпиляцией, а программы — Структура компилятора
Процесс компиляции состоит из следующих этапов:
-
Компиляция и компоновка
Важной исторической особенностью компилятора, отраженной в его названии ( Шаблон:Lang-en — собирать вместе, составлять), являлось то, что он мог производить и GCC) до сих пор физически объединены со своими компоновщиками. В связи с этим, вместо термина «компилятор» иногда используют термин «транслятор» как его синоним: либо в старой литературе, либо когда хотят подчеркнуть его способность переводить программу в машинный код (и наоборот, используют термин «компилятор» для подчеркивания способности собирать из многих файлов один).
Похожие публикации:
- Intrusion win ms17 010 o сетевая атака как устранить
- Как добавить картинку в readme github
- Как найти ошибку в коде python
- Crashpad handler exe что это
Источник: gshimki.ru
Как называется программа, которая переводит в машинные коды символьную запись машинных команд?
1 Смотреть ответы Добавь ответ +10 баллов
Ответы 1
Ответ разместил: Mezhanova16
Доступ после просмотра рекламы
Ответы будут доступны после просмотра рекламы
Показать ответы
Ассемблер – программа, которая переводит в машинные коды символьную запись машинных команд
Удалить ответ +1 балл
Другие вопросы по Информатике
Информатика, hahatiktok542
Проанализировать представленый код, исправить логические и синтаксические ошибки. опеределить, какая стояла перед программистом. добавить комментарий к каждой строчке программы,поя.
Информатика, АннаКольцева
Составить алгоритм и программу вычисления значений функции: y=|12| если x> 0 y= если x< 1.
Информатика, 123456Вопрос654321
Вершины треугольника заданы координатами. найти площадь треугольника и вывести ее на экран. решить надо через бейсик.
Информатика, erkeaiymalmazbekova
Закончи предложения так, чтобы они: стали суждениями: звуковая не стали суждениями: звуковая.
Информатика, genochka2018
Назови исполнителя и системы команд исполнителя из сказок: 1.волшебная лампа аладина. 2.емеля. 3.сивка-бурка. 4.хаврошечка. 5.маша и медведь. 6.цветик-семицветик. пример: царевна л.
Источник: 0tvet.com
2 как называется программа которая переводит в машинные коды символьную запись машинных команд
Любая программа для ЭВМ — системная или прикладная — воспринимается (распознается) процессором только в том случае, если она состоит из специальных команд, коды которых известны процессору определенного типа. Команды записаны в памяти компьютера в специальном формате. Каждая команда состоит из операционной и адресной частей.
В первой из них находится позиционный двоичный код, определяющий требуемое от процессора действие (сложение, вычитание и т.д.). Во второй – адресной части команды, также в виде двоичного позиционного кода, находятся адреса данных (операндов), над которыми это действие необходимо выполнить, либо сами операнды. В вольном переводе на русский язык некоторую команду можно, например, интерпретировать так: сложить два числа, находящиеся в памяти по адресам 100 и 120.
Разные типы ЭВМ имеют отличные друг от друга способы кодировки команд. Так, на персональных IВМ-совместимых компьютерах некоторая команда сложения в двоичном коде может иметь вид: 0000001111000011D или в шестнадцатиричном коде 03С3H . А на «древних» компьютерах типа М-220 команда сложения двух чисел могла выглядеть так:
001 00000001100100 00000001111000 00000001111011.
Поэтому программа в кодах компьютера (машинных кодах) является машинно-зависимойи непереносимой,т.е. подготовленная для компьютера одного типа, она не сможет выполняться на других. Этот факт определяет основной недостаток программирования в машинных кодах.
Вторым недостатком программирования в кодах является сильное дробление программы. Дело в том, что логически команды процессора достаточно примитивны и обуславливают выполнение простейших операций. Так, программирование несложной формулы x=(a+b)(c+d) требовало задания серии команд типа:
— сложить а и b, промежуточный результат записать в ,
— сложить c и d, промежуточный результат записать в ,
— умножить на , результат записать в х.
При программировании в кодах визуально каждая программа состояла из большого количества команд-строк, похожих на приведенные выше двоичные коды. Это определяло третий недостаток программирования в кодах — затрудненную читаемость программы и, как следствие, сложность исправления (отладки) или доработки программы.
Однако программированию в кодах присущи и значительные плюсы. Программист управляет всеми ресурсами компьютера, полностью контролирует текущее состояние ЭВМ, выбирает наиболее оптимальный код команды. Самые короткие по объему и наиболее быстрые по выполнению программы или их фрагменты разрабатываются и сегодня в кодах.
Для облегчения наглядности программы в кодах разработаны специальные символические языки — ассемблеры. В них каждой команде компьютера сопоставляется определенный символьный код, являющийся сокращением «родных» для человека слов. Специальная программа (она также называется ассемблером) переводит (транслирует)«непонятную» для компьютера (но более понятную для человека) символьную строку в коды компьютера. Так, приведенные выше коды команд сложения на ассемблере могли выглядеть так: ADD АХ, BX (сложить числа из регистров АХ и ВХ и результат запомнить в АХ). При программировании на ассемблере программист может оперировать не с адресами памяти, в которых хранятся данные, а с их символическим представлением. Например, вначале ассемблеру специальной инструкцией сообщается, что по такому-то адресу хранится число, названное для программиста как . Далее программист не задумывается над тем, по какому адресу находится соответствующее число, но просто использует его имя .
Ассемблер является машинно-зависимым языком программирования, так как его инструкции соответствуют кодам команд компьютера. Поэтому ассемблерная программа может выполняться только на тех ЭВМ, для которых она разрабатывалась. Кроме того, для работы на ассемблере требуется детальное знание особенностей конкретной ЭВМ.
Дата добавления: 2016-07-18; просмотров: 1074;
Похожие статьи:
1. Идентификация математических операторов
1.1 Идентификация оператора «+»
1.2 Идентификация оператора «-»
1.3 Идентификация оператора «/»
1.4 Идентификация оператора «%»
1.5 Идентификация оператора «*»
1.6 Комплексные операторы
2. Идентификация SWITCH — CASE – BREAK
2.1 Отличия switch от оператора case языка Pascal
2.2 Обрезка (балансировка) длинных деревьев
2.3 Сложные случаи балансировки
или оптимизирующая балансировка
2.4 Ветвления в case-обработчиках.
Дизассемблирование (От англ. disassemble — разбирать, демонтировать) – это процесс или способ получения исходного текста программы на ассемблере из программы в машинных кодах. Полезен при определении степени оптимальности транслятора и при генерации кодов собственной программы.
Программирование в машинных кодах
Позволяет понять алгоритм или метод построения программ, у которых отсутствуют исходные тексты. Существуют специальные программы дизассемблеры, которые выполняют этот процесс.
Одним из передовых продуктов для дизассемблирования программ является пакет программ от CSO Computer Services — IDA (Interactive Disassembler). IDA не является автоматическим дизассемблером. Это означает, что IDA выполняет дизассемблирование лишь тех участков программного кода, на которые имеются явные ссылки.
При этом IDA старается извлечь из кода максимум информации, не делая никаких излишних предположений. После завершения предварительного анализа программы, когда все обнаруженные явные ссылки исчерпаны, IDA останавливается и ждет вмешательства; просмотрев готовые участки текста, можно как бы подсказать ей, что нужно делать дальше. После каждого вмешательства снова запускается автоматический анализатор IDA, который на основе полученных сведений пытается продолжить дизассемблирование.
IDA является не только дизассемблером, но и одним из самых мощных средств исследования программ. Это возможно благодаря наличию развитой навигационной системы, позволяющей быстро перемещаться между различными точками программы, объектами и ссылками на них, отыскивать неявные ссылки и т.д. Исследование даже больших и сложных программ в IDA занимает в десятки и сотни раз меньше времени, чем путем просмотра текста, полученного обычным дизассемблером.
Целью, данной работы, является задача дизассемблирования программ написанных на языке программирования C/C++ и скомпилированных на компиляторах Microsoft Visual C++ 6.0, Borland C++ 5.0 и WATCOM.
В процесс дизассемблирования входит:
1) идентификация математических операций таких как: сложение, вычитание, деление, операция вычисления остатка, умножение и определения комплексных операций;
2) Идентификация операторов SWITCH — CASE – BREAK.
В ходе работы будет проведен анализ по качеству оптимизации, сгенерированных приведенными выше компиляторами программ, что позволит сравнить их и определить каким из них необходимо воспользоваться для получения наиболее оптимального и быстрого кода в программировании.
1. Идентификация математических операторов
1.1 Идентификация оператора «+»
В общем случае оператор «+» транслируется либо в машинную инструкцию ADD, «перемалывающую» целочисленные операнды, либо в инструкцию FADDx, обрабатывающую вещественные значения. Оптимизирующие компиляторы могут заменять «ADD xxx, 1» более компактной командой «INC xxx», а конструкцию «c = a + b + const» транслировать в машинную инструкцию «LEA c, [a + b + const]». Такой трюк позволяет одним махом складывать несколько переменных, возвратив полученную сумму в любом регистре общего назначения, — не обязательно в левом слагаемом как это требует мнемоника команды ADD. Однако, «LEA» не может быть непосредственно декомпилирована в оператор «+», поскольку она используется не только для оптимизированного сложения (что, в общем-то, побочный продукт ее деятельности), но и по своему непосредственному назначению — вычислению эффективного смещения. Рассмотрим следующий пример: main()
Результат его компиляции компилятором Microsoft Visual C++ 6.0 с настройками по умолчанию должен выглядеть так: main proc near ; CODE XREF: start+AF p var_c = dword ptr -0Chvar_b = dword ptr -8var_a = dword ptr -4 push ebpmov ebp, esp; Открываем кадр стека sub esp, 0Ch; Резервируем память для локальных переменных mov eax, [ebp+var_a]; Загружаем в EAX значение переменной var_a add eax, [ebp+var_b]; Складываем EAX со значением переменной var_b и записываем результат в EAX mov [ebp+var_c], eax; Копируем сумму var_a и var_b в переменную var_c, следовательно:; var_c = var_a + var_b mov ecx, [ebp+var_c]push ecxpush offset asc_406030 ; «%xn»call _printfadd esp, 8; printf(«%xn», var_c) mov edx, [ebp+var_c]; Загружаем в EDX значение переменной var_c add edx, 1; Складываем EDX со значением 0х1, записывая результат в EDX mov [ebp+var_c], edx; Обновляем var_c; var_c = var_c +1 mov eax, [ebp+var_c]push eaxpush offset asc_406034 ; «%xn»call _printfadd esp, 8; printf(«%n»,var_c) mov esp, ebppop ebp; Закрываем кадр стека retn main endp
Теперь посмотрим, как будет выглядеть тот же самый пример, скомпилированный с ключом «/Ox» (максимальная оптимизация): main proc near ; CODE XREF: start+AF ppush ecx; Резервируем место для одной локальной переменной; (компилятор посчитал, что три переменные можно ужать в одну и это дейст. так) mov eax, [esp+0]; Загружаем в EAX значение переменной var_a mov ecx, [esp+0]; Загружаем в EAX значение переменной var_b; (т.к .переменная не инициализирована загружать можно откуда угодно) push esi; Сохраняем регистр ESI в стеке lea esi, [ecx+eax]; Используем LEA для быстрого сложения ECX и EAX с последующей записью суммы; в регистр ESI; «Быстрое сложение» следует понимать не в смысле, что команда LEA выполняется; быстрее чем ADD, — количество тактов той и другой одинаково, но LEA; позволяет избавиться от создания временной переменной для сохранения; промежуточного результата сложения, сразу направляя результат в ESI; Таким образом, эта команда декомпилируется как; reg_ESI = var_a + var_b push esipush offset asc_406030 ; «%xn»call _printf; printf(«%xn», reg_ESI) inc esi; Увеличиваем ESI на единицу; reg_ESI = reg_ESI + 1 push esipush offset asc_406034 ; «%xn»call _printfadd esp, 10h; printf(«%xn», reg_ESI) pop esipop ecxretn main endp
Остальные компиляторы (Borland C++, WATCOM C) генерируют приблизительно идентичный код, поэтому, приводить результаты бессмысленно — никаких новых «изюминок» они в себе не несут.
Программирование в машинных кодах и ассемблере
Любая программа для ЭВМ — системная или прикладная — воспринимается (распознается) процессором только в том случае, если она состоит из специальных команд, коды которых известны процессору определенного типа. Команды записаны в памяти компьютера в специальном формате. Каждая команда состоит из операционной и адресной частей.
В первой из них находится позиционный двоичный код, определяющий требуемое от процессора действие (сложение, вычитание и т.д.). Во второй – адресной части команды, также в виде двоичного позиционного кода, находятся адреса данных (операндов), над которыми это действие необходимо выполнить, либо сами операнды. В вольном переводе на русский язык некоторую команду можно, например, интерпретировать так: сложить два числа, находящиеся в памяти по адресам 100 и 120.
Разные типы ЭВМ имеют отличные друг от друга способы кодировки команд. Так, на персональных IВМ-совместимых компьютерах некоторая команда сложения в двоичном коде может иметь вид: 0000001111000011D или в шестнадцатиричном коде 03С3H . А на «древних» компьютерах типа М-220 команда сложения двух чисел могла выглядеть так:
001 00000001100100 00000001111000 00000001111011.
Поэтому программа в кодах компьютера (машинных кодах) является машинно-зависимойи непереносимой,т.е. подготовленная для компьютера одного типа, она не сможет выполняться на других. Этот факт определяет основной недостаток программирования в машинных кодах.
Вторым недостатком программирования в кодах является сильное дробление программы. Дело в том, что логически команды процессора достаточно примитивны и обуславливают выполнение простейших операций. Так, программирование несложной формулы x=(a+b)(c+d) требовало задания серии команд типа:
— сложить а и b, промежуточный результат записать в ,
— сложить c и d, промежуточный результат записать в ,
— умножить на , результат записать в х.
При программировании в кодах визуально каждая программа состояла из большого количества команд-строк, похожих на приведенные выше двоичные коды. Это определяло третий недостаток программирования в кодах — затрудненную читаемость программы и, как следствие, сложность исправления (отладки) или доработки программы.
Однако программированию в кодах присущи и значительные плюсы. Программист управляет всеми ресурсами компьютера, полностью контролирует текущее состояние ЭВМ, выбирает наиболее оптимальный код команды. Самые короткие по объему и наиболее быстрые по выполнению программы или их фрагменты разрабатываются и сегодня в кодах.
Для облегчения наглядности программы в кодах разработаны специальные символические языки — ассемблеры. В них каждой команде компьютера сопоставляется определенный символьный код, являющийся сокращением «родных» для человека слов. Специальная программа (она также называется ассемблером) переводит (транслирует)«непонятную» для компьютера (но более понятную для человека) символьную строку в коды компьютера. Так, приведенные выше коды команд сложения на ассемблере могли выглядеть так: ADD АХ, BX (сложить числа из регистров АХ и ВХ и результат запомнить в АХ). При программировании на ассемблере программист может оперировать не с адресами памяти, в которых хранятся данные, а с их символическим представлением. Например, вначале ассемблеру специальной инструкцией сообщается, что по такому-то адресу хранится число, названное для программиста как .
Секреты машинного кода
Далее программист не задумывается над тем, по какому адресу находится соответствующее число, но просто использует его имя .
Ассемблер является машинно-зависимым языком программирования, так как его инструкции соответствуют кодам команд компьютера. Поэтому ассемблерная программа может выполняться только на тех ЭВМ, для которых она разрабатывалась. Кроме того, для работы на ассемблере требуется детальное знание особенностей конкретной ЭВМ.
Дата добавления: 2016-07-18; просмотров: 1075;
Источник: steptosleep.ru