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

Изучение языка низкого уровня ассемблер для написания примера программы для 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.