Contribution to International Economy

  • контрольная по информатике
О Г Л А В Л Е Н И Е
Вступление 2
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 3
1.1 Программа с точки зрения ЭВМ 3
1.2 АССЕМБЛИРОВАНИЕ ПРОГРАММЫ 4
1.3 ПРОГРАММИРОВАНИЕ НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ 5
1.3.1 ЭТАП 1 - ПОСТРОЕНИЕ ОБЪЕКТНОГО МОДУЛЯ 6
1.3.2 ЭТАП 2 – ПОЛУЧЕНИЕ ЗАГРУЗОЧНОГО МОДУЛЯ 8
2. ПРАКТИЧЕСКАЯ ЧАСТЬ 9
2.1 РЕДАКТИРОВАНИЕ ИСХОДНОГО МОДУЛЯ 9
2.2 СОЗДАНИЕ ОБЪЕКТНОГО МОДУЛЯ 10
2.3. СОЗДАНИЕ ЗАГРУЗОЧНОГО МОДУЛЯ 11
2.3 АССЕМБЛЕРЫ, ТРАНСЛЯТОРЫ И ИНТЕРПРЕТАТОРЫ 12
ВЫВОДЫ 17
ЛИТЕРАТУРА 18

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

1. Теоретическая часть
1.1 Программа с точки зрения ЭВМ
Реальная программа, выполняемая ЭВМ, представляет собой последовательность единиц и нулей, которая хранится в памяти машины. Эту цепочку единиц и нулей (бит) называют машинным языком. Машинный язык - это язык, который понимает машина. ЭВМ вполне определенным образом выбирает из памяти команды машинного языка. Затем в соответствии с конфигурацией битов в команде ЭВМ выполняет предписываемые ей действия.
Однако машинный язык трудно воспринимать людям. Если вы хотите сложить с помощью микропроцессора два числа, например, сложить содержимое регистров AX и BX, то соответствующая машинная команда должна иметь вид
0000001111000011B (или 03C3H в шестнадцатеричном коде)
В этих двух байтах содержится точное указание ЭВМ, какую операцию требуется выполнить. Аналогично для вычитания двух чисел (из содержимого регистра AX вычесть содержимое регистра BX) используется машинная команда
0010101111000011B (или 2BC3H в шестнадцатеричном коде)
Регистр - это часть микропроцессора, предназначенная для хранения данных. К данным, хранящимся в регистрах, микропроцессор может обратиться быстро, гораздо быстрее, чем к данным, хранящимся в памяти.
Хотя с точки зрения ЭВМ машинный язык - это прекрасный язык, но людьми, занимающимися программированием он воспринимается с трудом. К счастью, существует более легкий метод, чем программирование на машинном языке. Этим методом, более удобным для человека, является программирование на языке ассемблера.
При разработке программ, особенно, сложных, используется принцип модульности, разбиения сложной программы на составные части, каждая из которых может подготавливаться отдельно. Модульность является основным инструментом структурирования программного изделия, облегчающим его разработку, отладку и сопровождение.
Программный модуль - программа или функционально завершенный фрагмент программы, предназначенный для хранения, трансляции, объединения с другими программными модулями и загрузки в оперативную память.
При выборе модульной структуры должны учитываться следующие основные правила:
функциональность - модуль должен выполнять законченную функцию;
несвязность - модуль должен иметь минимум связей с другими модулями, связь через глобальные переменные и области памяти нежелательна;
специфицируемость - входные и выходные параметры модуля должны четко формулироваться.
1.2 Ассемблирование программы
Язык программирования, наиболее близький к машинному языку, - это язык асемблера. Язык ассемблера - это язык программирования, понятный программисту больше, чем машинный язык, и, в то же время, сохраняющий подобие машинному языку. ЭВМ читает программы на языке ассемблера и переводит их в машинный язык, в ту форму, которая ЭВМ понятна. Этот процесс, называемый ассемблированием программы, является фактически, одним из видов перевода с одного языка на другой. Операцию перевода (трансляции) с языка ассемблера на машинный язик осуществляет программа, называемая ассемблером.
На языке ассемблера команда сложения содержимого регистров AX и BX есть просто
АDD AX, BX
Аналогично для вычитания из содержимого регистра AX содержимого регистра BX мы пишем
SUB AX, BX
Ассемблер преобразует эти предложения в приведенные выше команды машинного языка. Задачу преобразования понятного человеку фрагмента текста в программу на машинном языке, которую микропроцессор может выполнить, решает сама ЭВМ.
1.3 Программирование на языках высокого уровня
Язык ассемблера не похож на языки типа Фортран, Бейсик или Паскаль. Эти и другие, аналогичные им языки, являются языками высокого уровня. Языки высокого уровня созданы для того, чтобы непосредственно отражать задачу, которая решается с помощью программы. Поэтому их иногда называют процедурными языками, так как они описывают ту процедуру, которая используется для решения соответствующей задачи. Языки высокого уровня являются машиннонезависимыми. Программа, написанная на языке Фортран для IBM PC, будет работать правильно и даст те же результаты, если ее выполнять на ЭВМ системы IBM/370. Язык программирования высокого уровня не зависит от машины, на которой он применяется.
Программы на языке ассемблера, напротив, непосредственно связаны с той ЭВМ, на которой они будут выполняться. Язык ассемблера - машиннозависимый. Язык ассемблера для IBM PC совершенно отличен от языка ассемблера для системы IBM/370.
Это связано с тем, что команды языка ассемблера почти без изменений преобразуются в команды машинного языка, т.е. каждая команда языка ассемблера обычно транслируется точно в одну команду машинного языка. Так как машинные языки у различных ЭВМ разные, то и языки ассемблера у них тоже различаются.
Как правило, каждое предложение языка ассемблера порождает какую-то команду машинного языка. Однако есть случаи, когда это не так. Они связяны с тем, что имеются команды языка ассемблера, предназначенные для ассемблера и не относящиеся к программе, которая затем должна выполняться. Эти команды описывают операции, которые должен выполнить ассемблер. Ассемблер выполняет эти команды во время ассемблирования. Примером такого указания ассемблеру (представляющим одну из таких команд ассемблера) является команда
TITLE Example Program
Эта команда сообщает ассемблеру название программы. После того, как ассемблер транслирует программу, название Example Program появляется вверху каждой страницы ассемблерной распечатки. Данная команда относится только к ассемблеру. Эту операцию не может выполнить ни одна из команд микропроцессора 8088.
1.3.1 Этап 1 - построение объектного модуля
Рассмотрим теперь работу ассемблера в целом. Ассемблер обрабатывает программу, записанную на языке ассемблера, и преобразует ее в машинный язык. Файл, содержащий исходную программу на языке ассемблера, называется исходным файлом. Результатом работы асемблера будет не полностью машинный язык, а некоторое промежуточное представление исходной программы. Этот выходной файл называется объектным. Данные, составляющие объектный файл, называются объектным кодом. Чтобы получить программу действительно на машинном языке, требуется предобразовать объектный код. В IBM PC это выполняется с помощью программы редактора связей LINK. Процедуру преобразования объектного кода в машинный язык обычно называют редактированием связей.
Кроме преобразования исходного кода в объектный, асемблер формирует также несколько других выходных файлов. Одним из этих файлов является ассемблерный листинг. Это распечатка всех операций, выполненных ассемблером. Листинг содержит оригинальный исходный код, включая комментарии, а также выработанный ассемблером объектный код.
С правой стороны листинга печатается исходный оператор. С левой стороны - данные, которые сформировал ассемблер. В первом столбце располагается номер, который присваивается каждой строке листинга. Нумерация строк в исходном файле выполняется ассемблером, и она не обязательно будет соответствовать какой-либо нумерации строк в исходном файле, осуществляемой текстовым редактором при вводе. Во втором столбце расположен адрес команды. В дальнейшем компоновщик может его изменить, но это лучшее предполагаемое значение адреса, которое может сделать ассемблер на этапе ассемблирования. В следующем столбце печатается машинный код команды. Так как команды микропроцессора могут иметь длину от 8 до 56 бит, размер этого поля будет переменным. Некоторые данные в объектном коде, относящиеся к этому полю, также могут быть изменены компоновщиком. Компоновщик может изменить любую часть команды, содержащую адрес. Однако за исключением полей, связанных с адресами, ассемблерный листинг дает точное представление о машинном коде, который будет в дальнейшем выполняться ЭВМ.
Другим файлом, создаваемым ассемблером, является файл перекрестных ссылок. Этот файл описывает связь между метками и командами, в которых эти метки используются. Такая информация незаменима в тех случаях, когда вы пытаетесь модифицировать программу. Данные о перекрестных ссылках можно использоватьдля того, чтобы выявить команды, в которых содержатся ссылки на конкретную область памяти. Это позволит программисту определить все команды, которые будут затронуты изменением какой-то другой части программы
Трансляторы языков высокого (С++, Delphi, Fortran, Perl и др.) и низкого (Assembler) уровней переводят программу в объектный код, то есть в код понятный машине и не требующий дальнейших преобразований.
1.3.2 Этап 2 – получение загрузочного модуля
Редактоp связей (или компоновщик) не обеспечен связью со всем математическим обеспечением компьютера. Однако, он поставляется вместе с трансляторами, пpименение которых невозможно в отсутствие компоновщика. Компоновщик - это сервисная программа, пpеобpазующая программу (модуль) в объектном коде таким обpазом, чтобы она стала перемещаемой. Перемещаемый модуль - это выполняемая программа или подпрограмма (в кодах машины), которая будет работать независимо от ее месторасположения в памяти. Компоновщик также используется пpи объединении отдельно откомпилированных объектных модулей в один перемещаемый. Полученный перемещаемый модуль носит название "выполняемого файла". Компоновщик обрабатывает программы в объектном коде.
Первая процедура, пpоизводимая компоновщиком, - поиск указаного модуля на рабочем или указанном диске. При введении соответствующей директивы, компоновщик создает текстовый файл, содеpжащий инфоpмацию о генерируемом выполняемом файле. Он также осуществляет поиск неразрешенных внешних ссылок в указанных или стандаpтных библиотеках тpанслятоpа.

2. ПРАКТИЧЕСКАЯ ЧАСТЬ
2.1 Редактирование исходного модуля
Рассмотрим, как происходит создание программного модуля, способного выполнять заданные действия. В программировании первой программой традиционно является программа, выводящая на экран сообщение "Привет!". Не будет исключением и наша программа. Войдем в текстовый редактор (любой из редакторов, которые формируют файлы в коде ASCII) и введем следующие строки программы:
.MODEL SMALL
.STACK 100h
.DATA
Message DB 'Привет!',13,10,'$'
.CODE
mov ax,@Data
mov ds,ax ; установить регистр DS таким
; образом, чтобы он указывал
; на сегмент данных
mov ah,9 ; функция DOS вывода строки
mov dx,OFFSET Message ; ссылка на сообщение "Привет!"
int 21h ; вывести "Привет!" на экран
mov ah,4ch ; функция DOS завершения
; программы
int 21h ; завершить программу
END
После этого сохраним ее на диске под названием HELLO.ASM. Созданный текстовый файл может быть прочитан, изменен, сохранен с помощью какого-либо редактора, но он сам не может выполнять какие-либо действия. Прежде чем выполнять запрограммированные действия, следует преобразовать программный файл к выполняемому виду. На Рис.1 изображен полный цикл создания программы (редактирование, ассемблирование, компоновка и выполнение). Следовательно, требуется выполнение двух дополнительных шагов – ассемблирования и компоновки.
2.2 Создание объектного модуля
На этапе ассемблирования исходный код (текст программы) превращается в промежуточную форму, которая называется объектным модулем, а на этапе компоновки один или несколько модулей комбинируются в выполняемую программу. Для ассемблирования файла HELLO.ASM надо набрать:
TASM hello.
Если не задать другое имя, файл HELLO.ASM будет ассемблирован в файл HELLO.OBJ. (Расширение имени файла вводить не требуется. Турбо Ассемблер подразумевает в этом случае, что файл имеет расширение .ASM.)
Если ввести файл HELLO.ASM в точности так, как показано, то не будет никаких предупреждающих сообщений или сообщений об ошибках. Если же есть такие сообщения, они появляются на экране наряду с номерами строк, указывающими строки, где содержатся ошибки. При получении сообщений об ошибках надо проверить исходный код (текст) программы и устранить ошибки, а затем снова ассемблировать код программы.
Когда ассемблируется файл HELLO.ASM, Турбо Ассемблер превращает текст инструкций из этого файла в их двоичный эквивалент и записывает их в объектном файле HELLO.OBJ. Этот файл является промежуточным файлом (промежуточным звеном в процессе перехода от текстового к выполняемому файлу). Файл HELLO.OBJ содержит всю информацию, необходимую для создания выполняемого кода из инструкций, содержащихся в файле HELLO.ASM, но она записана в виде, который позволяет комбинировать ее с другими объектными файлами для создания одной программы.
2.3. Создание загрузочного модуля
После ассемблирования файла HELLO.ASM мы продвинулись на один шаг в процессе создания программы. Теперь, надо скомпоновать полученный объектный код в выполняемый вид, и можно запускать программу на выполнения. Для компоновки программы используется программа TLINK, представляющая собой поставляемый вместе с Турбо Ассемблером компоновщик. Введем командную строку:
TLINK HELLO
Здесь опять не требуется вводить расширение имени файла. Компоновщик TLINK по умолчанию предполагает, что этим расширением является расширение .OBJ. Когда компоновка завершится (самое большее через несколько секунд), компоновщик автоматически присвоит файлу с расширением .EXE имя, совпадающее с именем нашего объектного файла (если не определить другое имя). При успешной компоновке на экране появляется сообщение:
Turbo Linker Version 3.0 Copyright (c) 1988, 1991 by Borland International Inc.
В процессе компоновки могут возникнуть ошибки (в данной программе это маловероятно). Если вы получили сообщения об ошибках компоновки (они выводятся на экран), измените исходный код программы так, чтобы устранить ошибки, а затем снова надо выполнить ассемблирование и компоновку.
Теперь программу можно запустить на выполнение. Для этого в ответ на подсказку операционной системы DOS надо ввести hello. На экран будет выведено сообщение:
Привет!
Мы создали и выполнили программу на Ассемблере. На диске мы найдем список файлов HELLO. Это будут файлы HELLO.ASM, HELLO.OBJ, HELLO.EXE и HELLO.MAP.
2.3 Ассемблеры, трансляторы и интерпретаторы
Первым (не для всех языков программирования обязательным) этапом подготовки программы является обработка ее Макропроцессором (или Препроцессором). Макропроцессор обрабатывает текст программы и на выходе его получается новая редакция текста. В большинстве систем программирования Макропроцессор совмещен с транслятором, и для программиста его работа и промежуточный модуль "не видны". Следует иметь в виду, что Макропроцессор выполняет обработку текста, это означает, с одной стороны, что он "не понимает" операторов языка программирования и "не знает" переменных программы, с другой, что все операторы и переменные Макроязыка (тех выражений в программе, которые адресованы Макропроцессору) в промежуточном модуле уже отсутствуют и для дальнейших этапов обработки "не видны". Так, если Макропроцессор заменил в программе некоторый текст A на текст B, то транслятор уже видит только текст B, и не знает, был этот текст написан программистом "своей рукой" или подставлен Макропроцессором.
Следующим этапом является трансляция. Трансляция – это преобразование программы, представленной на одном языке программирования, в программу на другом языке программирования, в определенном смысле равносильную первой.
Как правило, выходным языком транслятора является машинный язык целевой вычислительной системы. (Целевая вычислительная система - та вычислительная система, на которой программа будет выполняться.)
Трансляторы - общее название для программ, осуществляющих трансляцию. Они подразделяются на Ассемблеры и Компиляторы - в зависимости от исходного языка программы, которую они обрабатывают. Ассемблеры работают с автокодами или языками ассемблера, компиляторы - с языками высокого уровня.
Автокод - символьный язык программирования, предложения которого по своей структуре в основном подобны командам и обрабатываемым данным конкретного машинного языка.
Язык Ассемблера - язык программирования, который представляет собой символьную форму машинного языка с рядом возможностей, характерных для языка высокого уровня (обычно включает в себя макросредства).
Язык высокого уровня - язык программирования, понятия и структура которого удобны для восприятия человеком.
Объектный модуль - программный модуль, получаемый в результате трансляции исходного модуля.
Поскольку результатом трансляции является модуль на языке, близком к машинному, в нем уже не остается признаков того, на каком исходном языке был написан программный модуль. Это создает принципиальную возможность создавать программы из модулей, написанных на разных языках. Специфика исходного языка, однако, может сказываться на физическом представлении базовых типов данных, способах обращения к процедурам/функциям и т.п. Для совместимости разноязыковых модулей должны выдерживаться общие соглашения.
Большая часть объектного модуля - команды и данные машинного языка именно в той форме, в какой они будут существовать во время выполнения программы. Однако, программа в общем случае состоит из многих модулей. Поскольку транслятор обрабатывает только один конкретный модуль, он не может должным образом обработать те части этого модуля, в которых запрограммированы обращения к данным или процедурам, определенным в другом модуле. Такие обращения называются внешними ссылками. Те места в объектном модуле, где содержатся внешние ссылки, транслируются в некоторую промежуточную форму, подлежащую дальнейшей обработке. Говорят, что объектный модуль представляет собой программу на машинном языке с неразрешенными внешними ссылками.
Разрешение внешних ссылок выполняется на следующем этапе подготовки, который обеспечивается редактором связей (компоновщиком). Редактор связей соединяет вместе все объектные модули, входящие в программу. Поскольку редактор связей "видит" уже все компоненты программы, он имеет возможность обработать те места в объектных модулях, которые содержат внешние ссылки. Результатом работы редактора связей является загрузочный модуль.
Загрузочный модуль сохраняется в виде файла на внешней памяти. Для выполнения программа должна быть перенесена (загружена) в оперативную память. Иногда при этом требуется некоторая дополнительная обработка (например, настройка адресов в программе на ту область оперативной памяти, в которую программа загрузилась). Эта функция выполняется Загрузчиком, который обычно входит в состав операционной системы.
Возможен также вариант, в котором редактирование связей выполняяется при каждом запуске программы на выполнение и совмещается с загрузкой. Это делает связывающий загрузчик. Вариант связывания при запуске более расходный, т.к. затраты на связывание тиражируются при каждом запуске. Но он обеспечивает:
• большую гибкость в сопровождении, так как позволяет менять отдельные объектные модули программы, не меняя остальных модулей;
• экономию внешней памяти, т.к. объектные модули, используемые во многих программах не копируются в каждый загрузочный модуль, а хранятся в одном экземпляре.
Вариант интерпретации подразумевает прямое исполнение исходного модуля. Интерпретация - реализация смысла некоторого синтаксически законченного текста, представленного на конкретном языке.
Интерпретатор читает из исходного модуля очередное предложение программы, переводит его в машинный язык и выполняет. Все затраты на подготовку тиражируются при каждом выполнении, следовательно, интерпретируемая программа принципиально менее эффективна, чем транслируемая. Однако, интерпретация обеспечивает удобство разработки, гибкость в сопровождении и переносимость.
Примеры интерпретаторов: языки процедур (sell, REXX), JVM.

Рис.2. Этапы подготовки программы
Не обязательно подготовка программы должна вестись на той же вычислительной системе и в той же операционной среде, в которых программа будет выполняться. Системы, обеспечивающие подготовку программ в среде, отличной от целевой называются кросс-системами. В кросс-системе может выполняться вся подготовка или ее отдельные этапы:
• Макрообработка и трансляция
• Редактирование связей

ВЫВОДЫ
Языки программирования высокого уровня играют роль средства связи между программистом и машиной, а также между программистами. Это обстоятельство накладывает на язык многие обязательства:
1.Язык должен быть близок к тем фрагментам естественных языков, которые обеспечивают конкретную предметную область деятельности человека; (Язык, ориентированный на деловые сферы применений, должен содержать понятия, используемые в этом виде деятельности: документ, счет, база данных и т.п.).
2.Все средства языка должны быть формализованы в такой степени, чтобы их можно было реализовать как машинные программы; (например, предложение “Найти документ X в базе Y“ должно породить программу в машинном языке, осуществляющую требуемый поиск).
3.Язык программирования не только поддерживает предметно-ориентированную деятельность, но и стимулирует ее развитие. (понятие базы данных, вычислительной сети привело к революции в деловой деятельности).
4.Язык программирования - нечто большее, чем средство описания алгоритмов: он несет в себе систему понятий, на основе которых человек может обдумывать свои задачи, и нотацию, с помощью которой он может выразить свои соображения по поводу решения задачи.
К языкам программирования, лучше всего относиться, как к любому иностранному языку: средства языка принимать как данные от Бога, даже если они нам кажутся непонятными, плохими или ненужными.


ЛИТЕРАТУРА
Д.Дж.Брэдли Программирование на ассемблере
Деревянко А.С. "Системное программирование" http://khpi-iip.mipk.kharkiv.edu/library/ sp/sp2/index.html


Другие работы по теме: