Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
128.17 Кб
Скачать

Содержание.

Y

Введение 3

1Теоретический раздел 5

1.1. Основные сведения о языке Ассемблер 5

1.2. Битовые операции в языке Ассемблер. 12

1.3. Примеры использования битовых операций. 13

2 Практический раздел 17

2.1 Индивидуальное задание практической части 17

Заключение 20

Список литературы 21

Введение

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

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

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

Виды ассемблера:

Ассемблеры для DOS

Наиболее известными ассемблерами для операционной системы DOS являлись Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM) и Watcom Assembler (WASM). Также в своё время был популярен простой ассемблер A86.

Windows.

При появлении операционной системы Windows появилось расширение TASM, именуемое TASM 5+ (неофициальный пакет, созданный человеком с ником !tE), позволившее создавать программы для выполнения в среде Windows. Последняя известная версия TASM — 5.3, поддерживающая инструкции MMX, на данный момент включена в Turbo C++ Explorer. Но официально развитие программы полностью остановлено. Последнее развитие компилятор получил благодаря современной среде разработки TASM Visual. Среда неофициальная, но с её помощью работа с компилятором многократно упрощается [2].

Microsoft поддерживает свой продукт под названием Microsoft Macro Assembler. Она продолжает развиваться и по сей день, последние версии включены в наборы DDK. Но версия программы, направленная на создание программ для DOS, не развивается. Кроме того, Стивен Хатчессон создал пакет для программирования на MASM под названием «MASM32».

GNU и Linux.

Проблема: Наименьшая единица информации, которая обычно используется в различных языках программирования, - байт. Но при теоретических изысканиях и в практической деятельности (например, в сетевых технологиях, цифровой технике) возникают ситуации, требующие работы с информацией на более низком уровне – на уровне битов. Для этого существуют специальные битовые операции, которые доступны в языках низкого уровня (ассемблерах) [1].

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

Задачи работы:

1. Изучить основные сведения о языке Ассемблер (структура и компоненты программы на Ассемблере, формат команд, представление данных в памяти, режимы адресации и др.);

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

3. Рассмотреть примеры использования логических команд в Ассемблере;

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

5. Сформулировать вывод о проделанной работе.

1Теоретический раздел

1.1. Основные сведения о языке Ассемблер

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

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

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

Данный тип языков получил свое название от названия транслятора (компилятора) с этих языков — ассемблера (англ. assembler — сборщик).

Использование термина «язык ассемблера» также может вызвать ошибочное мнение о существовании единого языка низкого уровня, или хотя бы стандарта на такие языки [7]. 

Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):

Команды пересылки данных (movlea и т. д.)

Арифметичекие команды (addsubimul и т. д.)

Логические и побитовые операции (orandxorshr и т. д.)

Команды управления ходом выполнения программы (jmploopret и т. д.)

Команды вызова прерываний  (иногда относят к командам управления): intinto.

Команды ввода/вывода в порты (inout).

Для микроконтроллеров и микрокомпьютеров  характерны также команды, выполняющие проверку и переход по условию, например:

cbne — перейти, если не равно;

dbnz — декрементировать, и если результат ненулевой, то перейти;

cfsneq — сравнить, и если не равно, пропустить следующую команду.

Достоинства:

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

-объём кода. Сокращение объёма кода также не редко повышает скорость выполнения программы.

-язык ассемблера используется для создания “прошивок” BIOS.

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

Недостатки:

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

-отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд [8].

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

  • Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийных кодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.

  • Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си — языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (hardware abstraction layer) и ядро, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует. Некоторые любительские ОС, такие как MenuetOS и KolibriOS, целиком написаны на языке ассемблера. При этом MenuetOS и KolibriOS помещаются на дискету и содержат графический многооконный интерфейс.

  • Программирование микроконтроллеров (МК) и других встраиваемых процессоров. По мнению профессора Таненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени[9]. Сейчас (2013 г.) для программирования МК весьма часто применяют язык ассемблера (хотя и в этой области широкое распространение получают языки вроде Си). В МК приходится перемещать отдельные байты и биты между различными ячейками памяти. Программирование МК весьма важно, так как, по мнению Таненбаума, в автомобиле и квартире современного цивилизованного человека в среднем содержится 50 микроконтроллеров[10].

  • Создание драйверов. Драйверы (или их некоторые программные модули) программируют на языке ассемблера. Хотя в настоящее время драйверы также стремятся писать на языках высокого уровня (на высокоуровневом языке много проще написать надёжный драйвер) в связи с повышенными требованиями к надёжности и достаточной производительностью современных процессоров (быстродействие обеспечивает временно́е согласование процессов в устройстве и процессоре) и достаточным совершенством компиляторов с языков высокого уровня (отсутствие ненужных пересылок данных в сгенерированном коде), подавляющая часть современных драйверов пишется на языке ассемблера. Надёжность для драйверов играет особую роль, поскольку в Windows NT и UNIX (в том числе в Linux) драйверы работают в режиме ядра системы. Одна тонкая ошибка в драйвере может привести к краху всей системы.

  • Создание антивирусов и других защитных программ.

  • Написание трансляторов языков программирования.

Связывание программ на разных языках.

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

  • На этапе компиляции — вставка в исходный код программы на языке высокого уровня ассемблерных фрагментов (англ. inline assembler) с помощью специальных директив языка. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода с данными и подпрограммами, включая подпрограммы со множеством входов и выходов, не поддерживаемых языком высокого уровня, с его помощью сделать невозможно.

  • На этапе компоновки при раздельной компиляции. Для взаимодействия компонуемых модулей достаточно, чтобы импортируемые функции (определённые в одних модулях и используемые в других) поддерживали определённое соглашение о вызове (англ. calling conventions). Написаны же отдельные модули могут быть на любых языках, в том числе и на языке ассемблера [7].

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

Типичный формат записи команд:

[метка:] [ [префикс] мнемокод [операнд {, операнд}] ] [;комментарий]

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

В качестве операндов могут выступать константы, адреса регистров, адреса в оперативной памяти и пр. Различия между синтаксисом Intel и AT&T касаются в основном порядка перечисления операндов и указания различных методов адресации [1].

Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров x86ARMSPARCPowerPCM68k). Они описываются в спецификации процессоров. Возможные исключения:

  • если ассемблер использует кроссплатформенный AT&T-синтаксис (оригинальные мнемоники приводятся к синтаксису AT&T);

  • если изначально существовало два стандарта записи мнемоник (система команд была наследована от процессора другого производителя).

Наиболее известными ассемблерами для операционной системы DOS являлись TASM, MASM и WASM. Также в своё время был популярен Ассемблер А86.

При появлении операционной системы Windows появилось расширении TASM, позволившее создавать программы для выполнения в среде Windows.

Так же существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот Ассемблер NASM [2].

Макроассемблер- макропроцессор базовым языком которого является язык ассемблера.

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

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

Примеры программ-дизассемблеров:

Ida, Beye, CADt, Hiew, Sourcer, HT editor, Radare.

По режиму дизассемблеры делятся на:

-автоматические

-интерактивные

Примером автоматических дизассемблеров может служить Sourcer. Такие дизассемблеры генерируют готовый листинг, который можно затем править в текстовом документе [5].

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

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

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

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

Рассмотрим сначала целые числа без знака и со знаком. Числа без знака получили своё название потому, что среди этих чисел нет отрицательных. Это самый вид чисел: они представляют собой весь диапазон двоичных чисел, которые можно записать в байте, слове или двойном слове. Для байта числа без знака могут принимать значения от 00h(0) до FFh(255); для слова- от 0000h(0) до FFFFh (65535); для двойного слова- от 00000000h(0) до FFFFFFFF(4294967295) [6].

Предложения.

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

Директивы определения данных.

Для того чтобы в программе на ASM зарезервировать ячейки памяти под переменные и константы, необходимо воспользоваться директивами определения данных- с названиями db- (описывает данные размером в байт),

dw- (размером в слово), dd- (размером в двойное слово).

В простейшем случае в директиве db, dw или dd описывается одна константа, которой дается имя для последующих ссылок на неё. По этой директиве ассемблер формирует машинное представление константы и записывает в очередную ячейку памяти. Адрес этой ячейки становиться значением имени: все вхождения имени в программу ассемблер будет заменять на этот адрес.

Имена, указанные в директивах db, dw и dd, называются именами переменных (в отличии от меток- имени команд).

В ASM числа записываются в нормальном виде в системах счисления с основанием 10, 16, 8 или 2.

Десятичные числа записываются как обычно, за шестнадцатиричным числом ставится буква (если число начинается с “цифры” А, В, …, F, то вначале обязателен 0), за восьмиричным числом- буква q или о, за двоичным числом- буква b.

Константы-символы описываются в директиве двояка: указывается либо код символа (целое от 0 до 255), либо сам символ в кавычках (одинарных или двойных); в последнем случае ассемблер сам заменит символ на его код.

Команды вызова процедуры или возврата из процедуры.

На языке Ассемблер команда вызова процедуры имеет следующий вид:

Call op1.

Если op1 = i16, r16, m16, то это близкий вызов процедуры.

Команда вызова процедур по-другому, называется командами перехода с запомненными точками возврата [4].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]