У вас вопросы?
У нас ответы:) SamZan.net

Языки программирования Ассемблер

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 29.12.2024

CBC5CA 2 CEC0DF  D5C0D0C0CAC5D0C8CAC0 DFC7DB  C0D1C5CCC1CBC5D0C0

DDEBE5

F3E5E1-E5F2EEE4E5F1 EAEEECEBE5EAF1

ЯЗЫКИ

ПРОГРАММИРОВАНИЯ

Учебная программа дисциплины Конспект лекций. Язык С Конспект лекций. Ассемблер

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

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

Банк тестовых заданий в системе UniTest

Красноярск

ИПК  СФУ

2008

УДК  004.438

ББК 32.973

Т39

Электронный учебно-методический комплекс по дисциплине «Языки программи- рования» подготовлен  в  рамках  инновационной  образовательной  программы  «Ин- форматизация и автоматизированные системы управления», реализованной в ФГОУ ВПО СФУ в 2007 г.

Рецензенты:

Красноярский краевой фонд науки;

Экспертная комиссия СФУ по подготовке учебно-методических комплексов дис- циплин

Титовский, С. В.

Т39 Языки программирования. Ассемблер. Версия 1.0 [Электронный ресурс] :

конспект лекций / С. В. Титовский, Н. В. Титовская. – Электрон. дан. (2 Мб). –

Красноярск :  ИПК СФУ, 2008. –  (Языки программирования :  УМКД № 147-

2007 / рук. творч. коллектива Ю. А. Шитов). – 1 электрон. опт. диск (DVD). –

Систем. требования : Intel Pentium (или аналогичный процессор других произ-

водителей) 1 ГГц ; 512 Мб оперативной памяти ; 2 Мб свободного дискового пространства ; привод DVD ; операционная система Microsoft Windows

2000 SP 4 / XP SP 2 / Vista (32 бит) ; Adobe Reader 7.0 (или аналогичный про- дукт для чтения файлов формата pdf).

ISBN 978-5-7638-1250-3 (комплекса)

ISBN 978-5-7638-1460-6 (конспекта лекций)

Номер  гос.  регистрации  в  ФГУП  НТЦ  «Информрегистр»  0320802545 от 02.12.2008 г. (комплекса)

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

Даны общая характеристика языков ассемблера и обзор услуг операционной сис- темы, рассмотрены основы архитектуры ЭКМ линии х86, система прерывайний х86 и макросредства ассемблера.

Предназначен  для  студентов  направления  подготовки  специалистов  090102.65

«Компьютерная безопасность» укрупненной группы 090000 «Информационная безо- пасность».

© Сибирский федеральный университет, 2008

Рекомендовано к изданию

Инновационно-методическим управлением СФУ

Редактор Т. И. Тайгина

Разработка и оформление электронного образовательного ресурса: Центр технологий элек- тронного обучения информационно-аналитического департамента СФУ; лаборатория по разработке мультимедийных электронных образовательных ресурсов при КрЦНИТ

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

Подп. к использованию 01.10.2008

Объем 2 Мб

Красноярск: СФУ, 660041, Красноярск, пр. Свободный, 79

ОГЛАВЛЕНИЕ

ЛЕКЦИЯ  1  ВВЕДЕНИЕ В НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ............................................... 6

1. Обзор и общая характеристика языков программирования.............................. 6

2. Стандарты языков программирования. ................................................................ 9

3. Понятие низкоуровневого программирования .................................................. 10

ЛЕКЦИЯ  2  ОБЩАЯ  ХАРАКТЕРИСТИКА  ЯЗЫКОВ АССЕМБЛЕРА............................................................ 13

1. Назначение языков ассемблера. .......................................................................... 13

2. Синтаксис ассемблера............................................................................................ 15

3. Директивы ассемблера. ......................................................................................... 20

4. Обзор системы команд процессора ..................................................................... 26

ЛЕКЦИЯ  3  СРЕДСТВА  ВЗАИМОДЕЙСТВИЯ.......... 27

АССЕМБЛЕРНЫХ  ПРОГРАММ  С  ОС ..................... 27

1. Взаимодействие ассемблерных программ с ОС................................................ 27

2. Ассемблеры для x86. .............................................................................................. 28

ЛЕКЦИЯ  4 ОСНОВЫ  АРХИТЕКТУРЫ

ЭВМ  ЛИНИИ  Х86 ..................................................... 32

1. Набор регистров процессора, их форматы, назначение, особенности

использования ............................................................................................................. 32

2. Программируемые регистры................................................................................. 33

3. Регистр флажков. .................................................................................................... 34

ЛЕКЦИЯ  5  АДРЕСАЦИЯ  ПАМЯТИ.......................... 38

1. Режимы адресации.................................................................................................. 38

2. Сегментация памяти в процессоре х86................................................................ 39

3. Система команд. ...................................................................................................... 42

ЛЕКЦИЯ  6 РЕШЕНИЕ  ВЫЧИСЛИТЕЛЬНЫХ  ЗАДАЧ

В  АССЕМБЛЕРЕ  Х86 ............................................... 48

1. Ввод и вывод информации на ассемблере ........................................................ 48

2. Вычисление выражений ........................................................................................ 56

3. Реализация многоразрядной арифметики. ......................................................... 61

4. Организация циклов в ассемблере. Реализация вложенных циклов ............ 64

ЛЕКЦИЯ  7 РАБОТА  С  ФАЙЛАМИ

В  АССЕМБЛЕРЕ  Х86 ............................................... 67

1. Основные понятия файловых систем. ................................................................ 67

2. Средства взаимодействия программ с ОС.......................................................... 68

3. Пример программы. ................................................................................................ 70

ЛЕКЦИЯ  8  РАБОТА  С  ПАМЯТЬЮ

В  АССЕМБЛЕРЕ  Х86 ............................................... 74

1. Распределение памяти, системные структуры данных,

набор запросов к ОС. .................................................................................................. 74

2. Пример программы. ................................................................................................ 76

ЛЕКЦИЯ  9  СИСТЕМА  ПРЕРЫВАНИЙ  Х86 ............ 79

1. Понятие прерывания. Классификация прерываний. ........................................ 79

2. Аппаратная поддержка системы прерываний. .................................................. 80

ЛЕКЦИЯ  10 КОНТРОЛЛЕР  ПРЕРЫВАНИЙ ............. 83

1. Понятие контроллера прерываний, схемы его построения............................. 83

2.Работа контроллера прерываний .......................................................................... 85

ЛЕКЦИЯ  11 ПРОГРАММНОЕ  ОБЕСПЕЧЕНИЕ СИСТЕМЫ ПРЕРЫВАНИЙ ........................................ 88

2.Общие принципы функционирования обработчиков прерываний и

требования к ним......................................................................................................... 90

3. Пример программы. ................................................................................................ 91

ЛЕКЦИЯ  12  ВЗАИМОДЕЙСТВИЕ  ПРОГРАММ  С ОПЕРАЦИОННЫМИ  СИСТЕМАМИ .......................... 94

1. Принципы взаимодействия ассемблерных программ с ОС. ........................... 94

2. Общие вопросы взаимодействия программ с операционной системой. ...... 97

ЛЕКЦИЯ  13  МОДУЛЬНОЕ  ПРОГРАММИРОВАНИЕ  99

ЛЕКЦИЯ  14 ОСОБЕННОСТИ  ПРОГРАММИРОВАНИЯ В  МУЛЬТИПРОГРАММНОЙ

И  МУЛЬТИЗАДАЧНОЙ  СРЕДАХ .......................... 108

1. Реентерабельные программы............................................................................. 108

2. Синхронизация процессов и потоков. ............................................................... 110

2. Критические секции............................................................................................... 111

ЛЕКЦИЯ  15  СИНХРОНИЗАЦИЯ

ЧЕРЕЗ  ОБЪЕКТЫ  ЯДРА ....................................... 113

1. Общие принципы. .................................................................................................. 113

2. События. ................................................................................................................. 114

3. Мьютексы. .............................................................................................................. 115

4. Семафоры............................................................................................................... 116

5. Ждущие таймеры. .................................................................................................. 117

ЛЕКЦИЯ  16  МАКРОСРЕДСТВА  АССЕМБЛЕРА..... 119

1. Понятие макросредств.......................................................................................... 119

2. Макрокоманды. ...................................................................................................... 120

3. Аргументы макрокоманд, исключение дублирования меток. ....................... 122

ЛЕКЦИЯ  17  БЛОКИ  ПОВТОРЕНИЙ ....................... 126

1. Директивы rept и while.......................................................................................... 126

2. Директивы IRP и IRPC. .......................................................................................... 127

3. Пример макробиблиотеки. ................................................................................... 128

ЗАКЛЮЧЕНИЕ ......................................................... 131

БИБЛИОГРАФИЧЕСКИЙ  СПИСОК ........................ 132

ЛЕКЦИЯ  1

ВВЕДЕНИЕ В НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ

План лекции

1. Обзор и общая характеристика языков программирования

2. Стандарты языков программирования.

3. Понятие низкоуровневого программирования.

1. Обзор и общая характеристика языков программирования.

В настоящее время разработаны сотни языков программирования. Од- нако далеко не все из них нашли широкое применение. Выбор подходящего языка программирования для решения той или иной задачи часто зависит от того, к какой предметной области она принадлежит. В  таблице приведены итоги использования различных языков программирования в различных предметных областях и в разные периоды.

Таблица

Период Область применения Основные языки Другие языки

1960-E5 E3

Обработка деловой инфор-

мации COBOL Assembler

Научные вычисления FORTRAN ALGOL, BASIC, APL

Системная область Assembler JOVIAL, Forth

Искусственный интеллект LISP SNOBOL

Настоящее время

Обработка деловой информации

COBOL, C++, Java, spreadsheet

C, PL/1,

4GLs

Научные вычисления FORTRAN, C, C++, Java

 

BASIC

Системная область C, C++, Java Ada, BASIC, Modula

Искусственный интеллект LISP, Prolog

Издательская деятельность TeX, Postscript,

текстовые процессоры

Создание процессов UNIX, shell, TCL, Perl, JavaScript

 

AWK, Marvel, SED

Новые парадигмы ML, Smalltalk Eifell

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

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

себя программы для учета поступления заказов, управления ресурсами и персо- налом, а также для начисления зарплаты. Они были предназначены для считы- вания больших объемов данных, собранных за длительный период времени и хранящихся на магнитных лентах, и создания новых данных, обновленных в результате незначительных преобразований. Для таких приложений был разра- ботан язык COBOL. Программисту, использовавшему COBOL, обычно требова- лось несколько месяцев на создание типичного приложения.

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

дачи численного анализа, решения дифференциальных и интегральных уравне- ний, также задачи статистики. Изначально компьютеры создавались для со- ставления баллистических таблиц во время Второй мировой войны. Здесь всегда доминировал FORTRAN. Его синтаксис был близок к математи- ческому языку, и ученым было легко использовать его.

Системная область. Для создания операционных систем и реализа-

ции компиляторов в то время не существовало эффективного языка. Такие приложения должны были иметь доступ ко всем функциональным возмож- ностям и ресурсам аппаратной части компьютера. Для достижения макси- мальной  эффективности  часто  выбирался  язык  ассемблер.  В некоторых проектах  Министерства  обороны США использовался JOVIAL — разно- видность языка ALGOL, кроме того, вплоть до конца 1960-х гг. для таких приложений использовались также языки типа PL/1.

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

в течение отведенного на один ход времени выбирает наилучший вариант.

Приложения XXI века. В свое время язык Ada был разработан с целью устранения дублирования возможностей в конкурирующих между собой языках программирования. В настоящее время ситуация гораздо более сложная, чем в 60-е гг. ХХ в. Сейчас мы имеем больше областей приме- нения, для которых разработаны и реализованы специализированные язы-

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

Приложения для обработки деловой информации. По-прежнему ос- новным языком в этой области остается COBOL, хотя иногда используются языки  С и  C++.  Однако  сценарий  оценки  возможных  вариантов  карди- нально изменился. Электронные таблицы, используемые на персональных

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

Языки четвертого поколения 4GL (Fourth Generation Languages) так- же заняли определенную нишу в этой области. Языки 4GL – это языки, специально адаптированные под конкретные области применения обра- ботки деловой информации. Как правило, они имеют средства для созда- ния оконного интерфейса и простой доступ к записям базы данных. Также предусмотрены специальные возможности для создания форм заполнения стандартного  бланка  и генерирования  красиво  оформленных  отчетов. Иногда компиляторы языков 4GL в качестве результата выдают программы на языке COBOL.

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

Научные вычисления. Здесь по-прежнему FORTRAN не сдает своих пози- ций, хотя языки Java и C++ вполне успешно конкурируют с FORTRAN 90.

Системная область. В этой области доминирует язык С, созданный в конце 1960-х гг., и его более новый вариант C++. Язык С обеспечивает очень эффективное выполнение программ и позволяет программисту получить пол- ный доступ к операционной системе и аппаратной части. Кроме того, исполь-

зуются такие языки, как Modula и современный вариант BASIC. Хотя язык Ada и создавался для применения в этой области, он не получил здесь статуса ос- новного языка.

С появлением недорогих микропроцессоров, используемых в автомоби- лях, микроволновых печах, видеоиграх и электронных часах, возросла необхо- димость в языках, позволяющих писать программы для работы в реальном вре- мени. К таким языкам относятся С, Ada и C++.

Искусственный интеллект. Здесь по-прежнему используется LISP, хо- тя на смену MIT LISP 1.5 середины прошлого века пришли современные версии Scheme и Common LISP. Также развился Prolog. Оба языка признаны наиболее подходящими для задач поиска оптимального решения.

Издательская деятельность. Издательская деятельность является относи- тельно новой областью применения языков программирования. Системы обра-

ботки текстов имеют свой собственный синтаксис входных команд и выходных файлов.

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

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

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

Новые парадигмы  программирования. Постоянно появляются  и изучаются новые модели приложений. В области исследования теории типов в языках программирования используется язык ML. Хотя промыш-

ленное  применение  этого  языка не слишком значительно, его  популяр- ность постоянно растет. Другой важный язык – Smalltalk. Хотя он также не получил широкого использования в коммерческой области, но оказал глу- бокое воздействие на идеологию языков. Многие из объектно- ориентированных свойств языков C++ и Ada заимствованы из Smalltalk.

Специализированные языки, предназначенные для решения задач в

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

2. Стандарты языков программирования.

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

1. Частный стандарт. Сюда входят определения, сделанные той компанией,

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

2. Согласительный стандарт. К нему относятся созданные специальны- ми организациями документы, основанные на соглашении всех заинтересо-

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

В каждой стране, как правило, есть одна или несколько организаций, на- деленных правом разработки стандартов. В Соединенных Штатах это Амери- канский национальный институт стандартов (ANSI — American National Stan- dards Institute). Стандарты языков программирования могут разрабатываться комитетом ХЗ Ассоциации производителей делового компьютерного оборудо-

вания (СВЕМА — Computer Business Equipment Manufactures Association), а также Институтом инженеров по электротехнике и электронике (IEEE — Insti- tute of Electrical and Electronic Engineers).

В Великобритании такими полномочиями наделен Британский инсти- тут стандартов (BSI — British Standards Institute). Международные стандарты

2. Стандарты языков программирования.

создаются Организацией международных стандартов (ISO — International Stan- dards Organization), штаб-квартира которой находится в Женеве (Швейцария).

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

ром, перестают отвечать стандарту, что создает неудобства потребителям.

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

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

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

2. Соответствие. Программа   считается   соответствующей  стандарту, если она использует  только те возможности,  которые определены  данным стандартом.  Компилятор  является  соответствующим стандарту,  когда по- сле компиляции  соответствующей стандарту  программы  при ее выполне-

нии получается правильный результат.

3.  Устаревание.  Процесс  стандартизации   предусматривает   возмож- ность обновления.  Каждый стандарт должен пересматриваться раз в пять лет и либо обновляться, либо совсем отменяться.

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

точки зрения поставщика программного обеспечения являются полезными и спо- собствуют распространению программного продукта. Благодаря такому подходу появляются нововведения и развивается язык. Конечно, большинство програм- мистов не связывают себя никакими стандартами, а разрабатывают свои собст- венные продукты, в которых языки модифицированы и расширены подходящим для них образом. Это создает плодородную почву для испытания новых языковых

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

3. Понятие низкоуровневого программирования.

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

структуру и функционирование системы в целом;

организацию оперативной памяти;

состав внешних устройств, их адреса и форматы регистров;

организацию и функционирование процессора, состав и форматы его регистров, способы адресации, систему команд;

систему прерываний и т. д.

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

существенное влияние на разработку программ.

В истории развития программирования существовали три разновидно- сти низкоуровневых языков, последовательно сменивших друг друга:

машинный код; мнемокод; ассемблер.

В машинных кодах программа представляется в виде последовательно- сти чисел, являющихся кодами команд процессора, адресами оперативной памяти, номерами регистров процессора и внешних устройств и т. д. Фраг- мент последовательности кодов команд микропроцессора Intel 8086 для до- бавления двухбайтового слова с адресом 36 к слову с адресом 32:

Адрес Код

0000 A1

0001 20

0002 00

0003 03

0004 06

0005 24

0006 00

0007 A3

0008 20

0009 00

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

Для решения этой задачи были разработаны так называемые мнемоко-

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

Mov ax,ds:[32] Add ax,ds:[36] Mov ds:[32],ax

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

Ассемблер отличается от своего предшественника – мнемокода об- ширным набором директив транслятора, существенно упрощающих процесс

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

ЛЕКЦИЯ  2

ОБЩАЯ  ХАРАКТЕРИСТИКА  ЯЗЫКОВ АССЕМБЛЕРА

План лекции

1. Общие сведения о языках ассемблера.

2. Синтаксис ассемблера.

3. Директивы ассемблера.

4. Обзор системы команд процессора.

1. Назначение языков ассемблера.

Ассемблер (от англ. assemble — собирать) — компилятор с языка ас- семблера в команды машинного языка.

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

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

Сейчас разработка программ на ассемблере применяется в основном в программировании небольших микропроцессорных  систем (микроконтрол-

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

вание для загрузчиков операционной системы).

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

Язык ассемблера — тип языка программирования низкого уровня. Ко- манды языка ассемблера один в один соответствуют командам процессора и представляют собой удобную символьную форму записи (мнемокод) команд и аргументов. Язык ассемблера обеспечивает связывание частей программы и данныx через метки, выполняемое при ассемблировании (для каждой метки

высчитывается адрес, после чего каждое вхождение метки заменяется на этот адрес).

Каждая модель процессора имеет свой набор команд и соответствую- щий ему язык (или диалект) ассемблера.

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

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

приемами:

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

ками, с помощью него сделать нельзя.

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

компилятором (ассемблером).

Достоинства языков ассемблера.

1. Максимально  оптимальное использование средств процессора, ис-

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

2. Использование расширенных наборов инструкций процессора

(MMX, SSE, SSE2, SSE3).

3. Доступ к портам ввода-вывода и особым регистрам процессора (в большинстве ОС эта возможность доступна только на уровне модулей ядра и драйверов)

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

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

5. Максимальная адаптация для нужной платформы.

Однако следует отметить, что последние технологии безопасности, внедряемые в операционные системы и компиляторы, не позволяют делать самомодифицирующего кода, так как исключают одновременную возмож- ность исполнения программы и запись в одном и том же участке памяти (технология W^X).

Технология W^X используется в OpenBSD , в других BSD-системах, в Linux. В Microsoft Windows (начиная с Windows XP SP2) применяется схожая технология DEP.

Недостатки языков ассемблера.

1. Большие объемы кода, большое число дополнительных мелких за-

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

2. Трудоемкость чтения и поиска ошибок (хотя здесь многое зависит от комментариев и стиля программирования).

3. Часто компилятор языка высокого уровня, благодаря современным

алгоритмам оптимизации, даёт более эффективную программу (по соотно- шению качество/время разработки).

4. Непереносимость на другие платформы (кроме совместимых).

5. Ассемблер более сложен для совместных проектов.

2. Синтаксис ассемблера.

Синтаксис общих элементов языка. В отличие от языков программи- рования высокого уровня, где основным элементом языка является оператор, синтаксически  программа  на  ассемблере  состоит  из  последовательности строк. Строка – основная единица ассемблерной программы (рис. 2.1).

Рис. 2.1. Синтаксис программы

Если строка в программе одна, то она должна содержать директиву ас- семблера end, завершающую процесс трансляции.

Синтаксис строки схематично может быть изображен в виде следую- щей диаграммы (рис.2.2).

Рис. 2.2. Синтаксис строки

Комментарий описывается следующей диаграммой (рис.2.3).

Символ – любой отображаемый (печатный) символ.

Рис. 2.3. Синтаксис комментария

Команда – указание команды (инструкции) процессора (рис. 2.4).

Рис. 2.4. Синтаксис команды

Директива – команда, выполняемая транслятором во время обработки программы, имеет следующий синтаксис (рис. 2.5).

Рис. 2.5.Синтаксис директивы

Синтаксис макрокоманды выглядит следующим образом (рис. 2.6).

Рис. 2.6. Синтаксис макрокоманды

В приведенных синтаксических диаграммах в качестве необязательно- го элемента присутствует метка (рис. 2.7).

Рис. 2.7. Синтаксис метки

Понятие буквы в ассемблере включает в себя все латинские буквы, причем по умолчанию заглавные и прописные буквы не различаются, и сим- волы @, $, &, _, ?. Цифры – арабские от 0 до 9.

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

Традиционно первая программа в изучении языков программирования.

Title hello

Assume cs:c, ds:d, ss:s

s segment stack

dw 128 dup (?)

s ends

d segment

msg db ‘hello’, 0dh, 0ah, ‘world!$’

d ends

c segment

start: mov ax,d mov ds,ax

mov ah,9

lea dx,msg int 21H

mov ah,4ch int 21h

c ends

end start

Из приведенного примера видно, что по существу программа состоит из описаний сегментов, начинающихся с директивы segment и оканчиваю- щихся директивой ends.

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

Типичный набор сегментов программы содержит сегмент стека, сег- мент данных и сегмент кодов команд (в приведенном примере – это сегменты с именами s, d и c соответственно). Вне сегментов указываются директивы транслятора, определяющие общие особенности трансляции программы.

В примере это директивы:

title – дает модулю имя hello;

assume – информируюет транслятор о том, что во время исполнения программы регистр cs будет содержать начальный адрес сегмента с именем c, ds – сегмента d, ss – сегмента s;

end – указывает, что запускать программу следует с метки start (опре-

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

Синтаксическая диаграмма сегмента приведена на  рис. 2.8.

Рис. 2.8. Синтаксис сегмента

Описание  сегмента начинается с директивы segment и  оканчивается директивой ends, перед которыми указывается имя сегмента. После ключево- го слова segment могут следовать аргументы, описывающие атрибуты сег- мента (в приведенном примере сегмент s имеет атрибут stack, указывающий, что данный сегмент является сегментом стека).

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

Максимальный размен сегмента ограничен и составляет 216 байт.

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

директиве end, заставляющей транслятор завершить свою работу.

3. Директивы ассемблера.

Директивы ассемблера можно классифицировать следующим образом

(рис. 2.9).

 DF EFF0E0ECECE8F0E2E0EDE8FF. C0F1F1E5ECE1EBE5F0. CAEEEDF1EFE5EA EBE5EAF6




1. Реклама алкогольной продукции1
2. бірге ж~не hnmoni байланысу ~ндесу деген ма~ынаны білдіретін с~здері бойынша жасал~ан термин
3. Документооборот
4. Доклад- Кант Иммануил Кант Иммануил Кант Иммануил Knt Immnuel 17241804 выдающийся немецкий философ
5. Тема- Учет и контроль затрат по видам местам возникновения центрам ответственностиЗатраты делятся на прямы
6. Понятие, принципы и участники административного процесса
7.  Иностранный язык- два иностранных языка II курс Вопросы- Вопрос 1 When did Romn legions under Emperor Cludius i
8. Немного истории [3] Раздел 2
9. 03.140401.зчн.плн. обучение Сист
10. Тема- Животные жарких стран Провела- учитель ~ логопед Бояркина Елен
11. Наука Брайана Трейси основанная на 25летних исследованиях и жизненной практике автора открывает всякому
12. Реферат- Психоаналитические идеи и представления в терапевтическом анализе
13. Тема- ИСПОЛЬЗОВАНИЕ ФУНКЦИЙ В РАСЧЕТАХ Цель занятия
14. Об основах туристской деятельности в РФ - Законе РФ О защите прав потребителей I- S- Географическ
15. а гликолипиды рецепторы стероиды прочность
16. ТЕМА ’ 4 1 Своеобразие философии Средневековья.html
17. Потребительский кооператив Потребительским кооперативом признается добровольное объединение граждан
18. фелинология переводится как наука о кошках
19. квалификационного деления работ требований к должностям и рабочим местам штатного расписания органи
20. Автоматический потенциометр с кулачковым механизмом