Разработка программного обеспечения на языке низкого уровня — ассемблер
После создания процессора 8086 фирма Intel разработала более совершение процессоры объединенные под названием I 80×86, такое название означает, что все команды микропроцессора, которые выполняются на младших моделях обязательно, значит все ПО, которые разработаны для процессора 8086 успешно будут работать и на последних моделях 80 486 и Pentium. Ми будем рассматривать процессоры с точки зрения… Читать ещё >
Разработка программного обеспечения на языке низкого уровня — ассемблер (реферат, курсовая, диплом, контрольная)
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ ХАРЬКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ РАДИОЭЛЕКТРОНИКИ КУРСОВАЯ РАБОТА по дисциплине: программирование ПОЯСНИТЕЛЬНАЯ ЗАПИСКА Тема: «Разработка программного обеспечения на языке низкого уровня — ассемблер»
Выполнил: Руководитель:
Ст. гр. ИБ-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 80×86, такое название означает, что все команды микропроцессора, которые выполняются на младших моделях обязательно, значит все ПО, которые разработаны для процессора 8086 успешно будут работать и на последних моделях 80 486 и Pentium. Ми будем рассматривать процессоры с точки зрения программиста. Не смотря на разнообразность моделей процессоров, наиболее важным с точки зрения биологии программирования, есть 8086 як базовая модель и 80 386, як перший процессор фирмы 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, 80 186, 80 286, 80 386, 80 486, Р5 (Pentium), MMX, P6 (Pentium Pro и Pentium II).
· любая ОЗУ;
· видеокарта SuperVGA;
· операционная система MS DOS.
5. Пример выполненной программы Пример на С++:
Y=A^k
А=128 Temp: 0.005cek
K=3
2 097 152.
Пример на ассемблере:
Operation A ^ k
Enter A: 128 Temp: 0.001cek
Enter k: 3
Result: 2 097 152
Заключение
В процессе курсовой работы была изучена техника программирования на языке ассемблер. В качестве системы программирования была использована MS DOS. В сравнительной характеристике с кодом С++, асемблерский код показал не значительно, но меньшее время выполнения задачи. Значит, язык ассемблер может использоваться в тех случаях когда надо повысить скорость выполнения программ.
1.Конспект лекций с курса программирования на языке ассемблер;
2.Глобальная сеть Internt;
3. Абель — Ассемблер Для Ibm Pc;
4. IEEE P1363 / D13 (Draft Version 13). Standard Specifications for Public Key Cryptography.
Приложение А
//—————————————————————————————————————;
#include
#include
#include
#pragma hdrstop
//—————————————————————————————————————;
#pragma argsused
void main ()
{
int A;
unsigned int k;
cout<<" Y=A^x" <
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<<=1;
while (Mask)
{
Buffer*=Buffer;
if (k&Mask)Buffer*=A;
Mask>>=1;
}
cout<
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, 10 000
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