Разработка программного обеспечения на языке низкого уровня - ассемблер
Изучение языка низкого уровня ассемблер для написания примера программы для 16 битного приложения. Разработка и реализация алгоритма поднесения чисел к степени чисел над полем за основанием 2 (mod 2). Иллюстрация техники создания DOS приложения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 08.11.2011 |
Размер файла | 33,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ХАРЬКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ РАДИОЭЛЕКТРОНИКИ
КУРСОВАЯ РАБОТА
по дисциплине: программирование
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
Тема: "Разработка программного обеспечения на языке низкого уровня - ассемблер"
Выполнил: Руководитель:
Ст. гр. ИБ-05-1 Олешко О.И.
Могила Сергей Виталиевич
Харьков 2007
Реферат
Пояснительная записка содержит в себе стр., 2 приложения.
При выполнении курсовой работы на тему "Разработка программного приложения на языке низкого уровня - ассемблер" ставилась обучения программированию на уровне процессора с использованием стандартных функций.
Объект исследования - Изучить язык ассемблер для написания примера программы на ассемблере для 16 битного приложения (DOS приложение) реализации алгоритма поднесения чисел к степени чисел над полем за основанием 2 (mod 2)
Метод исследования - изучение литературы, составления и отладка приложения
Разработанная программа служит наглядной иллюстрацией техники создания DOS приложения.
Для программной реализации проекта использовалась среда программирования MS-DOS
КЛЮЧЕВЫЕ СЛОВА: процедура, оператор, ячейка, отладчик программы, приложение, адрес , директива.
СОДЕРЖАНИЕ
- ВВЕДЕНИЕ
- 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) на С++ на Ассемблере и сравнить время выполнения задачи в обоих кодах, и сделать вывод.
Возведение в степень может быть выполнено эффективно двойным методом, выделенным ниже.
Вход положительное целое число , полевой элемент
Выход k.
1. Пусть k = kr kr-1 ... k1 k0 будет двоичным представлением числа , где старший бит равен 1.
2. Устанавливаем x .
3. Для i от r - 1 до 0 do
3.1 Установить x x2.
3.2 Если ki = 1 тогда установить x 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-ZR+1 |
|
P+2 |
MUL |
R+1 |
D+3 |
R+1 |
(X+Y-Z)*UR+1 |
|
P+3 |
ADD |
R+! |
D+4 |
R+1 |
(X+Y-Z)*U + VR+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.
4. Руководство пользователя
4.1 Установка программы и запуск программы
Для работы с программой необходимо выполнить следующие шаги:
· скопировать в какой-либо каталог файл power.exe;
· запустить программу
4.2 Работа с программой
· Вводим значение полевого элемента A.
· Вводим значение степенного элемента k.
· Получаем результат.
4.3 Системные требования
Для нормальной работы данной программы требуется IBM :
· 8086, 80186, 80286, 80386, 80486, Р5 (Pentium), MMX, P6 (Pentium Pro и Pentium II).
· любая ОЗУ;
· видеокарта SuperVGA;
· операционная система MS DOS.
5. Пример выполненной программы
Пример на С++:
Y=A^k
А=128 Temp: 0.005cek
K=3
2097152.
Пример на ассемблере:
Operation A ^ k
Enter A: 128 Temp: 0.001cek
Enter k: 3
Result: 2097152
Заключение
В процессе курсовой работы была изучена техника программирования на языке ассемблер. В качестве системы программирования была использована MS DOS. В сравнительной характеристике с кодом С++, асемблерский код показал не значительно, но меньшее время выполнения задачи. Значит, язык ассемблер может использоваться в тех случаях, когда надо повысить скорость выполнения программ.
Список использованной литературы
1.Конспект лекций с курса программирования на языке ассемблер;
2.Глобальная сеть Internt;
3. Абель - Ассемблер Для Ibm Pc;
4. IEEE P1363 / D13 (Draft Version 13). Standard Specifications for Public Key Cryptography.
Приложение А
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
void main()
{
int A;
unsigned int k;
cout<<"Y=A^x"<<endl;
cout<<"Put A: ";
cin>>A;
cout<<"Put k: ";
cin>>k;
int r=0;
unsigned long int Buffer=k;
while(Buffer){Buffer>>=1;r++;}
r--;
Buffer=A;
int Mask=1;
for(int i=0;i<r-1;i++)Mask<<=1;
while(Mask)
{
Buffer*=Buffer;
if(k&Mask)Buffer*=A;
Mask>>=1;
}
cout<<Buffer;
getch();
}
//---------------------------------------------------------------------------
Приложение В
;--------------------------------------------------------------------------
.model tiny
LOCALS
;--------------------------------------------------------------------------
.stack 100h
;--------------------------------------------------------------------------
strlen equ 5
string struc
max db strlen+1
len db
val db strlen+1 dup (?)
string ends
;--------------------------------------------------------------------------
.data
;--------------------------------------------------------------------------
Msg db 13,10,"Operation: A ^ k",13,10,13,10,"$"
Msg_A db " ",13,"Enter A: ","$"
Msg_K db " ",13,"Enter k: ","$"
Msg_Res db 13,10,"Result: ","$"
CrLf db 13,10,"$"
Str_A string <>
Str_K string <>
Int_A dw 0
Int_K dw 0
Str_Pow db 16 dup (0)
;--------------------------------------------------------------------------
.code
;--------------------------------------------------------------------------
KeyPress proc
mov ah,0 ;иначе - прочитать клавишу
inth
retn
KeyPress endp
;--------------------------------------------------------------------------
DispMsg proc ;[IN] DS:DX - adress of string with forwarding '$'
mov ah,9 ; Функция DOS 09h
inth ; вывести строку на экран
retn
DispMsg endp
;--------------------------------------------------------------------------
ReadStr proc ;[IN] DS:DX - adress of string structure
mov ah,0Ah ;осуществляет переход на новую строку
inth
retn
ReadStr endp
;--------------------------------------------------------------------------
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
@@1:
mul bx
cmp dx,0
jnz @@2
mov dl,[di]
and dl,0Fh
add ax,dx
jc @@2
inc di
loop @@1
clc
retn
@@2:
stc
retn
Str2I2 endp
;--------------------------------------------------------------------------
IsDigit proc ;[IN] SI - string type; [OUT] CF - if false
xor ch,ch
mov cl,[si].len
lea di,[si].val
@@1:
cmp byte ptr [di],'9'
ja @@2
cmp byte ptr [di],'0'
jb @@2
inc di
loop @@1
clc
retn
@@2:
stc
retn
IsDigit endp
;--------------------------------------------------------------------------
Int2Str proc ;[IN] BX:AX - number; SI - string to save ($)
push si
@@1:
push ax
xor dx,dx
mov ax,bx
mov cx,10000
div cx
mov bx,ax ;<- 1 chastnoe v bx
pop ax
div cx
push ax
mov ax,dx
mov cx,4 ;<- 4 cyfry
call @@P
pop ax
cmp ax,0
jnz @@1
cmp bx,0
jnz @@1
@@2:
dec si
cmp byte ptr [si],'0'
je @@2
pop di
push si
mov cx,si
sub cx,di
shr cx,1
jz @@4
@@3:
mov al,[si]
mov ah,[di]
mov [si],ah
mov [di],al
inc di
dec si
loop @@3
@@4:
pop si
inc si
mov byte ptr [si],'$'
retn
@@P:
xor dx,dx
mov di,10
div di
or dl,30h
mov [si],dl
inc si
loop @@P
retn
Int2Str endp
;--------------------------------------------------------------------------
Power proc ;[IN] SI - base; CX - power [OUT] BX:AX - number
xor ax,ax
xor dx,dx
cmp si,0
je @@exit
;
mov bx,cx
mov cx,15
@@0:
shl bx,1
jc @@1
loop @@0
@@1:
mov ax,si ;x=a
@@2:
mul ax ;x=x*x
shl bx,1 ;ki == 1 ?
jnc @@3 ;no -> jump
mul si ;x=a*x
@@3:
loop @@2
clc
;
@@exit:
mov bx,dx
retn
Power endp
;--------------------------------------------------------------------------
begin:
mov ax,@data
mov ds,ax
lea dx,Msg
call DispMsg
@@1:
lea dx,Msg_A
call DispMsg
lea dx,Str_A
call ReadStr
lea si,Str_A
call IsDigit
jc @@1
call Str2I2
jc @@1
mov Int_A,ax
lea dx,CrLf
call DispMsg
@@2:
lea dx,Msg_K
call DispMsg
lea dx,Str_K
call ReadStr
lea si,Str_K
call IsDigit
jc @@2
call Str2I2
mov Int_K,ax
jc @@2
lea dx,CrLf
call DispMsg
@@3:
lea dx,Msg_Res
call DispMsg
;
mov si,Int_A
mov cx,Int_K
;
call Power
;
lea si,Str_Pow
call Int2Str
lea dx,Str_Pow
call DispMsg
call KeyPress
mov ax,4C00h ;конец программы и вывод данных из буфера
inth
end begin
Размещено на Allbest.ru
Подобные документы
Ввод и вывод чисел при помощи подключаемого модуля IO. Особенности работы с одномерными и двухмерными массивами. Тестирование состояние флагов. Рринципы и навыки работы с компилятором и отладчиком. Разработка схемы алгоритма программы на языке ассемблер.
курсовая работа [1,3 M], добавлен 02.12.2009Анализ технического задания. Разработка программы по вычислению функции на языке ассемблер для микропроцессора Кр580ВМ80. Алгоритмы программного умножения, деления, сложения, вычитания и сдвига влево многобайтных чисел. Расчет времени работы программы.
курсовая работа [88,2 K], добавлен 19.09.2012Особенности ассемблера - машинно-ориентированного языка низкого уровня, применяемого для создания простых приложений. Связывание программ на разных языках. Типичный формат записи команд, инструкции и директивы языка ассемблера. Разработка игры "Змейка".
курсовая работа [215,0 K], добавлен 20.07.2014Битовые представления ASCII-кодов для однобитовых символов и чисел. Сложение двоичных чисел, определение двоичных дополнений. Положительные значения для отрицательных двоичных цифр, шестнадцатеричные представления. Типы сегментов, их размеры и адреса.
тест [371,9 K], добавлен 11.10.2012Оптимизация с использованием языка низкого уровня ассемблера. Его связь с языками высокого уровня. Отдельно компилируемые модули. Разработка программных модулей на ассемблере с использованием компиляторов TASM5.0 фирмы Borlandи MASM6.14 фирмы Microsoft.
курсовая работа [405,5 K], добавлен 18.05.2014Принципы и алгоритмы обработки прерываний. Набор действий по реализации этапов обработки прерываний микропроцессора. Разработка структуры и алгоритма резидентной программы. Реализация программы на языке Ассемблер, методы её отладки и тестирования.
курсовая работа [348,7 K], добавлен 22.12.2014Проектирование приложения, предназначенного для демонстрационного показа операций сдвигов чисел влево и вправо на n-битов и их результатов. Требования к функциональным характеристикам, параметрам технических средств. Компиляция и компоновка программы.
курсовая работа [712,4 K], добавлен 08.11.2013Разработка программы создания заметок в любом месте компьютера. Выбор технологии, языка и среды разработки приложения. Описание основных алгоритмов работы программного обеспечения. Проектирование пользовательского интерфейса. Выбор стратегии тестирования.
отчет по практике [700,5 K], добавлен 24.11.2014Эволюция языков программирования от низкого уровня до современности. Языки программирования второго поколения - ассемблер. Императивные, функциональные, логические и объектно-ориентированные языки. Машинная независимость. Парадигмы программирования.
презентация [353,5 K], добавлен 14.10.2013Структурные подразделения и отделы организации, ее технические программные средства. Разработка приложений обработки данных на ассемблере, языке программирования высокого уровня. Тестирование и оптимизация программных модулей. Разработка документации.
отчет по практике [175,0 K], добавлен 30.09.2022