Изучение языка низкого уровня ассемблер для написания примера программы для 16 битного приложения. Разработка и реализация алгоритма поднесения чисел к степени чисел над полем за основанием 2 (mod 2). Иллюстрация техники создания DOS приложения.
Аннотация к работе
Программирование на языке ассемблер считается сложною задачею, причины его такие: Язык ассемблер любого процессора существенно сложнее любого языка высокого уровня. Программист, который использует язык ассемблер должен сам следить за распределением памяти и вместо регистров, чтоб корректно разделять и управлять памятью. Намного выгодней написать программу на языке высокого уровня, а наиболее критические части быстрого действия писать на языке ассемблер. Команды содержат код команды и адреса данных, которые используются в командах. Для реализаций разветвлений в программе в систему команд машины должны быть добавлены команды безусловного и условного перехода, т.е. уменьшение длины команды привело к необходимости увеличения числа команд.Для работы с программой необходимо выполнить следующие шаги: · скопировать в какой-либо каталог файл power.exe;· Вводим значение полевого элементаДля нормальной работы данной программы требуется IBM : · 8086, 80186, 80286, 80386, 80486, Р5 (Pentium), MMX, P6 (Pentium Pro и Pentium II).Пример на ассемблере: Operation EnterВ процессе курсовой работы была изучена техника программирования на языке ассемблер.#include #include #include unsigned long int Buffer=k; while(Buffer){Buffer>>=1;r ;} r-;;--------------------------------------------------------------------------strlen equ 5 string struc max db strlen 1 len db val db strlen 1 dup (?) string ends DISPMSG proc ;[IN] DS:DX - adress of string with forwarding "$" mov ah,9 ; Функция DOS 09h inth ; вывести строку на экран retn Str2I2 proc ;[IN] SI - string type, [OUT] AX - value; CF - if false xor ch,ch mov cl,[si].len lea di,[si].val xor ax,ax mov bx,10 ISDIGIT proc ;[IN] SI - string type; [OUT] CF - if false xor ch,ch mov cl,[si].len lea di,[si].
План
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. Анализ, постановка задачи, этапы создания
2. история развития ассемблера
3. определения которые будут встречатьса в программе
4. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
4.1 Установка программы и запуск программы
4.2 Работа с программой
4.3 Системные требования
5. ПРИМЕР ВЫПОЛНЕНОЙ ПРОГРАММЫ
Заключение
Список использованной литературы
Приложение
Введение
После создания процессора 8086 фирма Intel разработала более совершение процессоры объединенные под названием I 80x86, такое название означает, что все команды микропроцессора, которые выполняются на младших моделях обязательно , значит все ПО, которые разработаны для процессора 8086 успешно будут работать и на последних моделях 80486 и Pentium. Ми будем рассматривать процессоры с точки зрения программиста. Не смотря на разнообразность моделей процессоров, наиболее важным с точки зрения биологии программирования, есть 8086 як базовая модель и 80386 , як перший процессор фирмы Intel, который в полном объеме реализовал принцип многозадачности.
1. Анализ, постановка задачи
Программирование на языке ассемблер
Программирование на языке ассемблер считается сложною задачею, причины его такие: Язык ассемблер любого процессора существенно сложнее любого языка высокого уровня. Чтоб воспользоваться всеми возможностями языка ассемблер, нужно, по крайней мере, найти команды микропроцессора, а их число со всеми возможными вариантами перевешает 100, их количество значительно превышает количество операторов и ключевых слов других языков высокого уровня. Проблема усложняется еще тем, что изменения в ассемблере возникают намного быстрее, чем в языках высокого уровня, это связано с появлением новых микропроцессоров и соответственно новых команд.
Программист, который использует язык ассемблер должен сам следить за распределением памяти и вместо регистров, чтоб корректно разделять и управлять памятью. В языках высокого уровня это делается автоматически с помочью компилятора, но это обстоятельство имеет преимущество: можно оптимально расположить данные в памяти, обеспечить максимальную скорость выполнения и минимальную длину программы.
Программы на языке ассемблер тяжелее проектировать и настраивать, нужно все время помнить, что конкретно находиться в каждом из регистров в данной ячейки памяти. Принято считать, что разработка программы только на языке ассемблер, некоторого процессора, даже если он распространенный не рекомендуется. Понятно, что любую программу можно написать только с помощью ассемблера, но для этого нужно использовать намного больше количество команд и время, которое пойдет на ее выполнение и настройку будет намного больше, чем для языка высокого уровня. Намного выгодней написать программу на языке высокого уровня, а наиболее критические части быстрого действия писать на языке ассемблер.
Постановка задачи: Реализовать программы поднесения чисел к степени чисел над полем за основанием 2 (mod 2) на С на Ассемблере и сравнить время выполнения задачи в обоих кодах, и сделать вывод.
Возведение в степень может быть выполнено эффективно двойным методом, выделенным ниже.
Вход положительное целое число , полевой элемент
Выход a k.
1. Пусть k = kr kr-1 ... k1 k0 будет двоичным представлением числа , где старший бит равен 1.
2. Устанавливаем x ¬ a.
3. Для i от r - 1 до 0 do
3.1 Установить x ¬ x2.
3.2 Если ki = 1 тогда установить x ¬ a x.
4. Выход x.
Этапы создания программы.
Разработка программы на языке ассемблер включает в себя.
0) Создание кода программы на С ;
Подготовка начального текста программы на ассемблере;
Ассемблирование программы (получение объектного кода);
Компоновка программы (получение выполненного файла);
Отладка программы (нахождение ошибок).
Эти этапы циклически повторяются.
2. История развития асемблера. Характеристика машинного языка
Первые компьютеры "знали" один язык - машинный. Рассмотрим характеристики этого языка. Конструкциями машинного языка являются константы и команды. Команды содержат код команды и адреса данных, которые используются в командах. Структура 4-х адресной команды
Код операции 1 данное 2 данное Результат Адрес следующей команды
Большинство команд выполняется в том порядке, в котором они записаны в памяти (естественный порядок выполнения команды), поэтому задание четвертого адреса в большинстве команд не требуется. Так как переменная адресность для первых компьютеров не поддерживалась, вместо 4-х адресных стали использовать команды 3-х адресные. Структура 3-х адресной команды
Код команды 1 данное 2 данное Результат
Для реализаций разветвлений в программе в систему команд машины должны быть добавлены команды безусловного и условного перехода, т.е. уменьшение длины команды привело к необходимости увеличения числа команд. С увеличением общей памяти увеличивается размер адреса, т.к. необходимо под адрес отводить место, достаточное для записи максимального адреса. В этом случае увеличивается размер команды и всей программы. Кроме того при составлении программ очень часто результат записывается вместо одного из исходных данных. В этом случае адреса результата и одного из данных совпадают и можно задать только один адрес.
Получаем 2-х адресную структуру команды.
Структура 2-х адресной команды
Код операции 1 данное ( результат) 2 данное
Или Код операции 1 данное 2 данное (результат)
В литературе есть обоснование и первого и второго форматов команд. В настоящее время используются оба формата для разных типов процессоров. Т.к. результат помещается вместо одного из данных, могут потребоваться команды пересылки данных для создания их копии.
Заметим, что операторы языка С вида как раз отражают эту ситуацию и программируются одной командой после вычисления . Оператор вида = программируется несколькими командами (почему?).
Доступ к памяти требует значительно больше времени, чем выполнение операции процессором. Для уменьшения потерь памяти используется фиксированная ячейка, называемая Accumulator, доступ к которой значительно быстрее, чем к обычной ячейке памяти за счет того, что она одна и за счет аппаратной реализации. В этом случае в команде задается только один адрес, второе данное и результат получаются в фиксированной ячейке.
Структура 1 адресной команды.
Код операции Адрес данного
Заметим, что некоторые команды требуют задать только один адрес без использования аккумулятора, например, команда увеличения на 1 содержимого памяти.
Так оператор С x означает использование одноадресной команды вместо двухадресной сложения (x =1) или нескольких команд в случае x=x 1.
В систему команд должны быть добавлены команды для обмена данными между аккумулятором и памятью. Недостаток одноадресных команд - основную часть программы составляют команды пересылки данных.
В современных процессорах вместо одной фиксированной ячейки (регистра) используется несколько, в этом случае в команде задается адрес данного и регистр, т.е. опять возвращаемся к двух адресной структуре команды.
Структура безадресных команд
Некоторые из команд не требуют задания адреса, например, команда СТОП (Halt) для процессора. В случае использования команд с данными можно использовать стек для хранения данных, в этом случае адреса данных можно не задавать. Стек - это массив, заполнение и извлечение данных для которого выполняется по правилу "Первый вошел, последний вышел". В этом случае данные для операции записываются в стек. Результат помещается вместо этих данных.
Для упрощения распределения памяти и запоминания кодов команд вместо машинных кодов используются их обозначения, а вместо конкретных адресов - символические адреса. Символические коды для основных операций заданы в табл. 4.1
Таблица 4.1 Мнемонические коды арифметических команд
Код Обозначение
01 ( ) ADD
02 (-) SUB
03 (*) MUL
04 (/) DIV
Пусть данные занимают ячейки
D 0 : X
D 1: Y
D 2 : Z
D 3 : U
D 4 : V
D 5 : W
Пусть программа занимает ячейки P 0, P 1, …
Пусть в качестве ячеек для промежуточных данных используются R 0, R 1, …
Текст программы с учетом принятых обозначений задан в табл. 5.1.
Таблица 5.1. Текст программы
Адрес Код 1 данное 2 данное Результат Комментарий
P 0 ADD D 0 D 1 R 0 X Y ®R 0
P 1 SUB R 0 D 2 R 1 X Y-Z®R 1
P 2 MUL R 1 D 3 R 1 (X Y-Z)*U®R 1
P 3 ADD R ! D 4 R 1 (X Y-Z)*U V®R 1
P 4 DIV R 1 R 0 D 5 Результат
Пусть D= 0. В этом случае программа начинается с ячейки после D 5, т.е. с ячейки 6. (P = 6). Промежуточные данные можно располагать, начиная с P 5, т.е. R = 11. Преобразование кодов и адресов в машинные коды и адреса выполняется специальной программой.
Язык, в котором вместо машинных кодов используются их символические обозначения, а вместо абсолютных - относительные адреса, называется языком символического кодирования или ассемблером.
3. Определения которые будут встречаться в программе язык ассемблер программа алгоритм
Tiny (файл *.com). модель памяти. При этом регистры CS, DS, SS содержат одинаковых значений. Это наиболее компактная модель памяти. Размер памяти не может превышавать 63Кб. Адресация происходит с помочью смещения и меток . Так как программы на ассемблере не большая, то это не есть большим ограничением . Эта модель широко используется, особливо в резидентных программах. strlen - длина строки ввода (5 символов) string - структура для строкового ввода (исп.в функции 0Ah прерывания 21h)
Данные: Msg - строка приглашения ввода данных
Msg_A / Msg_K -- ->>- ->>- ввода значения основания / степени
Msg_Res - строка приглашения вывода числа
CRLF - последовательность перехода на новою строку
Str_A / Str_K - структура для хранения текстового значения основания / степени
Int_A / Int_K - ячейки памяти размерности СЛОВО для хранения двоичного значения основания / степени
Str_Pow - строка хранящая текстовое представление вычисленной степенной функции
Процедуры: KEYPRESS
Процедура ожидания нажатия любой клавиши на клавиатуре
DISPMSG
Процедура отображения строкового сообщения на экране (до символа "$").
В DS:DX передается адрес выводимой на экран строки.
Символ с кодом 13 (0Dh) осуществляет переход на начало строки.
Символ с кодом 10 (0Ah) осуществляет переход на новую строку.
READSTR
Процедура ввода данных со клавиатуры в строковой буфер с ограничением длины ввода. В DS:DX передается адрес структуры ввода (см. определение структуры string)
ISDIGIT
Процедура проверки являются ли все символы строки десятичными цифрами. Уст. флаг CF при ошибке. Адрес строки для проверки в SI.
Str2I2
Процедура преобразования числа размерности в слово из строкового вида в двоичный. При выходе за границы размерности уст. флаг CF.
Адрес строки для проверки в SI. Результат в AX.
Int2Str
Процедура преобразования числа из двоичного вида в строковый.
Исходное число в регистровой паре BX:AX, сохранение в строку с адресом в SI.
Power
Процедура возведения числа с основанием в SI в степень со значением в CX.
Результат сохраняется в регистровой паре BX:AX.
Вывод
В процессе курсовой работы была изучена техника программирования на языке ассемблер. В качестве системы программирования была использована MS DOS. В сравнительной характеристике с кодом С , асемблерский код показал не значительно, но меньшее время выполнения задачи. Значит, язык ассемблер может использоваться в тех случаях, когда надо повысить скорость выполнения программ.
Список литературы
1.Конспект лекций с курса программирования на языке ассемблер;
2.Глобальная сеть Internt;
3. Абель - Ассемблер Для Ibm Pc;
4. IEEE P1363 / D13 (Draft Version 13). Standard Specifications for Public Key Cryptography.