Помощь в написании студенческих работ
Антистрессовый сервис

Разработка программного обеспечения на языке низкого уровня — ассемблер

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

После создания процессора 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

Показать весь текст
Заполнить форму текущей работой