Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Базовые средства ассемблера в языках высокого уровня

Покупка
Новинка
Артикул: 842075.01.99
Доступ онлайн
800 ₽
В корзину
Предназначено для самостоятельного изучения дисциплины «Языки программирования». Приведено описание общей последовательности функционирования программных фрагментов на языке ассемблера в приложениях языка С++. Рассмотрены принципы адресации памяти ЭВМ с архитектурой фон Неймана, структура и назначение регистров процессора, основные команды процессора. Акцентировано внимание на взаимосвязи между командами процессора и операторами языка С++ и вопросах программирования на языках высокого уровня, понимание которых достижимо только при изучении соответствующих положений ассемблера. В каждом разделе пособия приведены вопросы и задания для самоконтроля. Для студентов, обучающихся по специальности 10.05.07 «Противодействие техническим разведкам».
Ковгар, А. А. Базовые средства ассемблера в языках высокого уровня : учебное пособие / А. А. Ковгар, В. П. Осипов. - Москва : Издательство МГТУ им. Баумана, 2018. - 72 с. - ISBN 978-5-7038-4922-4. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2169187 (дата обращения: 21.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
Федеральное государственное бюджетное  
образовательное учреждение высшего образования  
«Московский государственный технический университет имени Н.Э. Баумана  
(национальный исследовательский университет)»
А.А. Ковгар, В.П. Осипов
Базовые средства ассемблера 
в языках высокого уровня
Учебное пособие


УДК 621.3.049.77
ББК 32.85
 
К56
Издание доступно в электронном виде по адресу 
ebooks.bmstu.press/catalog/274/book1834.html
Факультет «Информатика и системы управления»
Кафедра «Защита информации»
Рекомендовано Научно-методическим советом  
МГТУ им. Н.Э. Баумана в качестве учебного пособия 
Ковгар, А. А. 
К56  
Базовые средства ассемблера в языках высокого уровня : учебное 
  
пособие / А. А. Ковгар, В. П. Осипов. — Москва : Издательство МГТУ 
  
им. Н. Э. Баумана, 2018. — 70, [2] с. : ил. 
ISBN 978-5-7038-4922-4
Предназначено для самостоятельного изучения дисциплины «Языки программирования». Приведено описание общей последовательности функционирования программных фрагментов на языке ассемблера в приложениях языка С++. Рассмотрены 
принципы адресации памяти ЭВМ с архитектурой фон Неймана, структура и назначение регистров процессора, основные команды процессора. Акцентировано внимание 
на взаимосвязи между командами процессора и операторами языка С++ и вопросах 
программирования на языках высокого уровня, понимание которых достижимо только 
при изучении соответствующих положений ассемблера. В каждом разделе пособия 
приведены вопросы и задания для самоконтроля.
Для студентов, обучающихся по специальности 10.05.07 «Противодействие 
техническим разведкам».
УДК 621.3.049.77
ББК 32.85
 
© МГТУ им. Н.Э. Баумана, 2018
    
 
© Оформление. Издательство
ISBN 978-5-7038-4922-4 
 
МГТУ им. Н.Э. Баумана, 2018


Предисловие 
Издание предназначено для самостоятельной подготовки к выполнению 
лабораторных работ по дисциплине «Языки программирования», входящей 
в образовательную программу по специальности 10.05.07 «Противодействие 
техническим разведкам».
Результатом выполнения лабораторных работ является освоение системы 
общих принципов построения и взаимосвязи языков программирования 
высокого уровня с низкоуровневым языком ассемблера. 
Изучение материала пособия позволит студентам овладеть следующими 
компетенциями:
•
• базовыми знаниями о концепциях архитектуры ЭВМ на принципах 
машины фон Неймана; 
•
• методами сравнительного анализа и оптимизацией программ для ЭВМ, 
разрабатываемых с использованием различных языковых средств; 
•
• практическими навыками программирования на языке ассемблера 
небольших, критичных по отношению к скорости выполнения фрагментов 
приложений на языке С++. 
Учебное пособие построено по модульному принципу, в соответствии с 
которым каждый модуль представляет собой логически завершенный раздел 
курса. Для каждого модуля приведен набор планируемых результатов обучения, заданных программой учебной дисциплины. Достижение этих результатов оценивается при текущем контроле усвоения дисциплины. 
Для изучения приведенных материалов необходимо предварительно 
освоить следующие дисциплины: 
•
• иностранный язык (Профессиональная и научная терминология); 
•
• математический анализ (Степенные ряды);
•
• информатика (Практикум по программированию на языке DELPHI).
На первом занятии каждый студент получает в электронном виде методические указания к выполнению лабораторных работ с примерами решений 
задач, дополненные краткими теоретическими сведениями, а также индивидуальные варианты заданий для рубежных контролей (см. Приложения). 
Лабораторные работы предназначены для практического усвоения профессиональной образовательной программы. Учебное пособие изучается студентами во время самостоятельной подготовки к лабораторным работам. 
Задание каждой лабораторной работы должно быть выполнено на аудиторных 
занятиях. В случае если студент не успел выполнить задание в аудитории, он 
должен закончить его выполнение самостоятельно. Результаты всех видов 
работ студентов учитываются на промежуточной аттестации. 
Поскольку в программе учебной дисциплины лекционные и семинарские занятия не предусмотрены, часть пособия посвящена рассмотрению 
ключевых базовых положений курса и разъяснению учебных заданий, предназначенных для самостоятельной работы.
Предусматривается также расширение материалов пособия за счет 
поиска, анализа, структурирования и представления в компактном виде 
3


современной информации из всех возможных источников. Для этого в начале 
каждого раздела учебного пособия после аннотации приводятся ключевые 
слова на русском и английском языках. 
Каждый раздел содержит дополнительный список контрольных заданий 
повышенной сложности, которые отличаются от типовых индивидуальных 
вариантов заданий. Их необходимо проработать самостоятельно, поскольку 
аналогичные задания могут быть предложены при текущем контроле усвоения каждого модуля учебной дисциплины. 
Текущий контроль проводится в течение каждого модуля, его итоговые 
результаты включают в себя оценки, полученные при защите следующих 
работ:
•
• домашнего задания;
•
• лабораторных работ;
•
• рубежного контроля.
Для завершения работы в семестре студент должен выполнить задания 
рубежного контроля, иметь полный комплект подготовленных заданий в 
электронном виде (два рубежных контроля и одно домашнее задание).
Промежуточная аттестация по учебной дисциплине (экзамен) основывается на результатах текущего контроля. Она служит для оценки владения студентом ключевыми, базовыми положениями предметной области, умением 
их применять, оценивать, анализировать и создавать объекты по задаваемым 
параметрам. 


Введение
Для большей части современных программистов знание языка ассемблера не только является конкурентным преимуществом перед коллегами, но 
и считается крупным достижением в областях личностного роста и мастерства программирования. Несмотря на сложившееся мнение, что программирование на языках ассемблера доступно лишь «избранным», в обучении 
столь «древнему» языку и стилю программирования нет ничего сложного.
Достаточно лишь хорошо понимать, как устроен и работает компьютер, что 
со стороны машины тривиальное принятие решений выглядит по-другому, 
и, конечно же, необходимы хорошая память и терпение. Более того, многие 
вопросы программирования на языках высокого уровня, таких, например, 
как DELPHI или С++, после изучения основ ассемблера приобретают полную ясность и прозрачность. Причем это знание не требует никаких дополнительных усилий. Последнее обстоятельство наряду с основной целью — собственно изучением основ программирования на языке ассемблера — является 
еще одной целью учебного пособия. И наконец, данное учебное пособие 
можно рассматривать как первый шаг на пути освоения языка ассемблера, 
упрощающий вход в этот действительно трудный, но многообещающий мир 
низкоуровневого программирования. 
Учебная дисциплина «Языки программирования» состоит из шести модулей, изучаемых последовательно в течение третьего и четвертого семестров. 
Материал настоящего учебного пособия относится к четвертому семестру и 
включает в себя три модуля:
•
• модуль 1 «Прямая и косвенная адресация, регистровая память и стек, 
арифметические операции», посвящен рассмотрению и анализу архитектуры 
машины фон Неймана; 
•
• модуль 2 «Битовые, строковые команды и команды передачи управления», посвящен собственно программированию на языке ассемблера;
•
• модуль 3 «Арифметический сопроцессор», содержит краткую информацию об обработке действительных чисел на арифметическом сопроцессоре. 
Для каждого модуля предусмотрен анализ применяемых методов и 
алгоритмов. Дополнительно рассматриваются вопросы взаимодействия программных единиц языка С++ и ассемблера. 


МОДУЛЬ 1
Прямая и косвенная адресация, 
регистровая память и стек, 
арифметические операции 
Анализ способов адресации позволяет понять назначение оперативной 
памяти компьютера, которая наряду с регистровой памятью является основополагающим понятием архитектуры фон Неймана. Поэтому в модуле 1 
формируются требования к формату ассемблерной команды на примере 
команды пересылки. Рассмотрены команды управления стеком, назначение 
и формат стековых команд. Приведены арифметические команды и рассмотрены особенности их выполнения.
Ключевые слова: прямая и косвенная адресация, команда процессора, регистры 
процессора, стек, регистр флагов, переполнение, арифметические команды. 
Планируемые результаты обучения
После изучения модуля 1 студенты смогут:
•
• объяснить прямой и косвенный способы адресации оперативной памяти, их достоинства и недостатки, состав и назначение регистровой памяти и стека; 
•
• представить на примере команд пересылки взаимодействие регистровой и оперативной памяти, работу с командами стека и стековых регистров;
•
• объяснить назначение регистра флагов и результаты воздействия на регистр 
флагов при выполнении ассемблерных команд; 
•
• уяснить особенности выполнения арифметических команд с переносом старшего 
разряда, причины переполнения разрядной сетки и способы их устранения.
1. Начало программирования на языке ассемблера
1.1. Терминология
Ассемблер — это язык команд процессора, представленных в мнемоническом виде, доступном для восприятия человека. В этом определении 
использованы следующие термины:
•
• команда процессора — последовательность двоичных чисел, содержащая информацию об операции и операндах. Операция представлена в виде 
кода операции (КОП), а операнды (ОП) — в виде своих адресов или двоичных констант. Например, команду сложения условно можно представить в 
формате <КОП> <ОП1> <ОП2> или 01 A12F 15CD. Здесь и далее угловые 
скобки (< и >) использованы для русскоязычных наименований и аббревиатур. Числа в подобных примерах, конечно же, выбраны произвольно;
•
• мнемонический (от греч. mnēmoniká — искусство запоминания) означает использование системы различных приемов, облегчающих запоминание путем образования искусственных ассоциаций. В данном случае 
6


вместо малопонятной записи команды сложения вполне допустима строка 
ADD X Y, где ADD — мнемонический КОП, а X и Y — мнемонические 
обозначения операндов. Из приведенного выше определения следует, что 
ассемблер — это язык низкого уровня. С точки зрения программиста степень его приближенности к человеческому мышлению невелика, а уровень 
его восприятия лишь ненамного выше, чем уровень восприятия собственно 
машинных команд. 
Основной недостаток ассемблера как низкоуровневого языка заключается в его зависимости от базового набора команд процессора и, следовательно, ассемблеры для процессоров с различной архитектурой будут разными. Для того чтобы подчеркнуть это, такие языки называют машинозависимыми. 
В данном учебном курсе рассматривается язык ассемблера для 32-разрядных процессоров с набором команд х86, работающих под управлением 
операционной системы Windows XP/7. Для более поздних моделей процессоров, например, 64-разрядных, все принципы программирования сохраняются. 
1.2. Встроенный ассемблер
Необходимым этапом обработки программ является компиляция исходного кода, написанного на алгоритмическом языке, например, на языке С++ 
или ассемблере, в набор машинных команд. Поскольку для языка ассемблера 
существует взаимно однозначное соответствие между машинной командой 
и ее мнемоническим кодом, то всегда можно выполнить обратное преобразование — дизассемблирование из машинных команд в программу на языке 
ассемблера. Для языков высокого уровня (DELPHI, C++ и т. п.) такое преобразование, как правило, недопустимо. Таким образом, любую программу, 
первоначально составленную на любом языке программирования, откомпилированную в выполняемый файл (*.exe), можно преобразовать в ассемблерный код. 
В данном учебном пособии рассматривается подмножество языка ассемблера, которое получило название встроенный ассемблер вследствие того, что 
оно является частью компилятора с языка высокого уровня С++, реализованного в интегрированной среде разработки Visual C++. Такой порядок 
изучения, по мнению авторов, позволяет сосредоточиться на базовых элементах — командах ассемблера, оставляя вопросы объявления переменных 
и организацию ввода/вывода за высокоуровневыми средствами языка С++. 
Термин «встроенный ассемблер» предполагает вставки в исходный код специфических компонентов программы — ассемблерных блоков. Поскольку ассемблерный блок является такой же частью программы, что и исходный код, 
для него действует главное правило языков программирования: объявление и 
инициализации констант и переменных выполняются до вызова ассемблерного 
блока. 
Для вставки ассемблерного блока в среде разработки Visual C++ используется директива компилятора _ 
_asm (двойной символ подчеркивания!), 
после которого в фигурных скобках располагается собственно текст на языке 
7


ассемблера. Причем строчные комментарии допускается использовать такие 
же, как и на языке С++: 
_ 
_asm {  
// ассемблерный блок вставлять здесь
}
Ассемблерный блок можно вставлять в любом месте программы, в том 
числе и построчно. Запись команд ассемблерного кода в процессе развития программирования осуществлялась заглавными символами английского 
алфавита, однако в настоящее время допустимо использовать как заглавные, 
так и строчные символы. В строке с ассемблерным кодом следует использовать комментарии с пояснением действий, что делает программу особенно 
наглядной и, можно сказать, является признаком «хорошего тона»: 
// ВАРИАНТ ЗАПИСИ №1:
_ 
_asm {
    ADD a, 10; // К переменной a прибавить число 10 и
    sub a, 2;  // вычесть  2
}
// ВАРИАНТ ЗАПИСИ №2
_ 
_asm  add a, 10;
_ 
_asm  SUB a, 2;
Точка с запятой в конце ассемблерной строки не является обязательной, 
но ее целесообразно ставить, чтобы программа была выдержана в едином 
стиле. Ее основное назначение — строчные комментарии в макроассемблере 
MASM, изучению которого посвящена вторая часть учебного пособия.
1.3. Регистровая и оперативная память
Процессор обрабатывает данные, которые физически могут находиться 
внутри процессора на его регистрах или вне его — в оперативной памяти.
Оперативная память реализована в виде микросхем памяти и представляет 
собой физическое наполнение адресного пространства компьютера. При 
32-битной длине адреса адресное пространство составит 232 байт. Другими 
словами, процессор может обратиться к любому байту по его адресу из диапазона значений 0…232.
Регистры являются неотъемлемыми элементами логической схемы 
процессора, частью его архитектуры. Каждый регистр имеет свое уникальное 
имя, и доступ процессора к регистрам проводится по его имени.
Число, разрядность и назначение регистров зависят от конкретного типа 
процессора, но можно выделить и общие свойства процессоров разных типов. 
Ниже рассмотрены регистры широко распространенного процессора типа 
Pentium с архитектурой х86.
К регистровой памяти процессоров с архитектурой х86 относятся:
•
• регистры общего назначения;
•
• регистр флагов;
•
• сегментные регистры;
8


Доступ онлайн
800 ₽
В корзину