Основы Ассемблирования

Автор работы: Пользователь скрыл имя, 09 Декабря 2013 в 19:09, курсовая работа

Описание работы

Ассемблер - низкоуровневый язык программирования. Для каждого процессора существует свой ассемблер. Программируя на ассемблере вы непосредственно работаете с аппаратурой компьютера. Исходный текст на языке ассемблера состоит из команд (мнемоник), которые после компиляции преобразуются в коды команд процессора.Разработать программу на ассемблере тяжело. Взамен потраченному времени вы получаете эффективную программу. Программы на ассемблере пишут, когда важен каждый такт процессора. На ассемблере вы даёте конкретные команды процессору. Этим и достигается высокая скорость выполнения вашей программы.Чтобы грамотно использовать ассемблер необходимо знать программную модель микропроцессорной системы.

Содержание работы

Введение 4
1.Анализ задания 8
2.Запись решения задачи вычисления функции на языке высокого уровня С++ 9
3.Блок-схема записи решения задачи вычисления функции на языке высокого уровня С++ 10
4.Запись решения задачи вычисления функции на языке высокого уровня С++, с использованием функций на Ассемблере 11
5.Запись решения задачи вычисления функции на языке Ассемблер 12
Расчет результатов программы на языке с++ 13
Расчет результатов программы на с++ c ассемблерными вставками 16
Вывод 17
Использованная литература 18

Файлы: 7 файлов

BS1.vsd

— 277.00 Кб (Скачать файл)

BS2.vsd

— 322.50 Кб (Скачать файл)

BS3.vsd

— 164.00 Кб (Скачать файл)

Клеткин Д.В.docx

— 866.42 Кб (Скачать файл)

Министерство  образования науки Российской Федерации 

Государственное образовательное учреждение

Высшего профессионального  образования

«Владимирский государственный  университет им. А.Г. и Н.Г.Столетовых»

Кафедра «вычислительной  техники»

 

 

 

 

 

Курсовой проект

по дисциплине

«Программирование»

 

Выполнил:

Ст. гр. Вт-112

Клеткин Д.В.

 

Принял:

Маскеев С.В.

 

 

 

 

Владимир 2013

Содержание

 

Введение 4

1.Анализ задания 8

2.Запись решения  задачи вычисления функции на  языке высокого уровня С++ 9

3.Блок-схема  записи решения задачи вычисления  функции на языке высокого  уровня С++ 10

4.Запись решения  задачи вычисления функции на  языке высокого уровня С++,  с использованием функций на  Ассемблере 11

5.Запись решения  задачи вычисления функции на  языке Ассемблер 12

Расчет результатов  программы на языке с++ 13

Расчет результатов  программы на с++ c ассемблерными вставками 16

Вывод 17

Использованная  литература 18

 

 

 

Введение

 

Ассемблер - низкоуровневый язык программирования. Для каждого  процессора существует свой ассемблер. Программируя на ассемблере вы непосредственно работаете с аппаратурой компьютера. Исходный текст на языке ассемблера состоит из команд (мнемоник), которые после компиляции преобразуются в коды команд процессора.Разработать программу на ассемблере тяжело. Взамен потраченному времени вы получаете эффективную программу. Программы на ассемблере пишут, когда важен каждый такт процессора. На ассемблере вы даёте конкретные команды процессору. Этим и достигается высокая скорость выполнения вашей программы.Чтобы грамотно использовать ассемблер необходимо знать программную модель микропроцессорной системы. С точки зрения программиста микропроцессорная система состоит из: микропроцессора, памяти, устройств ввода/вывода.

Синтаксис АссемблераОбщий  формат строки программы на ассемблере

                <Метка>: <Оператор><Операнды> ;<Комментарий>

Поле метки. Метка может  состоять из символов и знаков подчёркивания. Метки используются в операциях  условного и безусловного перехода.

Поле оператора. В этом поле содержится мнемоника команды.

Поле операндов. Операнды могут присутствовать только если присутствует Оператор (поле оператора). Операндов может не быть, а может быть несколько. Операндами могут быть данные, над которыми необходимо выполнить какие-то действия (переслать, сложить и т.д.).


Поле комментария. Комментарий  нужен для словесного сопровождения программы. Всё, что стоит за символом «; »считается комментарием.

Давайте рассмотрим плюсы  и минусы программирования на языке  ассемблера.

Плюсы

1) Программы, написанные  на языке ассемблера (если они  написаны грамотно), отличаются высокой  эффективностью, т.е. минимальным  объемом и максимальным быстродействием. 

2) Программы, написанные  на языке ассемблера, могут то, что не под силу программам, созданным на любом другом  языке программирования.

3) Программы на ассемблере  легко отлаживать, так как в  них нет лишнего кода.

4) Язык ассемблера является  основным инструментом исследования  программ, для которых нет исходных  текстов. Это используются для  взлома программ, защищенных паролем,  с ограничением по времени использования.

5) С появлением высокоуровневых  конструкций в языке ассемблера, программировать под Windows стало так же удобно как и на C.

Минусы

1) Программы, написанные  на языке ассемблера, не переносимы. Программы, написанные для IBMPC, не будут работать на компьютере с другой архитектурой.

2) Исходные тексты программ, более объемные.


История создания языка программирования C/C++. Язык С  создан в начале 70х годов ДэнисомРитчи в BellTelephoneLaboratories для ОС UNIX. Предшественником C является язык B ("Би"), созданный Кэном Томпсоном, который в свою очередь имеет корни в языке Мартина Ричардсона BCPL. Язык BCPL был создан в 1967 году как язык для написания компиляторов и программного обеспечения операционных систем. Кен Томпсон предусмотрел много возможностей в своем языке B для создания ранних версий операционной системы Unix в BellLaboratories в 1970 году на компьютере DEC PDP-7. Языки BCPL и B были языками без определения типов данных - каждай элемент данных занимал одно "слово" в памяти, и бремя обработки элемента данных, например, как целого или действительного числа падало на плечи программиста.

    Язык C был первоначально  реализован на компьютере DEC PDP-11 в 1972 году. С использует многие важные концепции BCPL и B, а также добавляет типы данных и другие свойства. Первоначально C приобрел широкую известность как язык разработки операционной системы Unix. Сегодня фактически все новые операционные системы написаны на C или C++.


 В течение двух последних  десятилетий C стал доступным  для большинства компьютеров. C является независимым от аппаратных средств. При тщательной разработке на C можно написать мобильные программы, переносимые на большинство компьютеров.

    В 1978 г. БрайнКерниган и Денис Ритчи написали книгу "Язык программирования "Си" (издательство Prentice-Hall) которую можно рассматривать как некоторый стандарт языка "K & R". Ее называют белой книгой.

Широкое распространение  языка C на различных типах компьютеров (иногда называемых аппаратными платформами) привело, к сожалению, ко многим вариациям  языка. Они были похожи, но несовместимы друг с другом. Это было серьезной  проблемой для разработчиков  программ, нуждавшихся в написании  совместимых программ, которые можно  было бы выполнять на нескольких платформах. Стало ясно, что необходима стандартная  версия C. В 

1983г. ANSI (Американский Национальный  Комитет Стандартов) сформировал  технический комитет X3J11 для создания  стандарта языка C (чтобы "обеспечить  недвусмысленное и машинно-независимое  определение языка"). В 1989 стандарт  был утвержден. ANSI скооперировался  с ISO (Международной Организацией  Стандартов), чтобы стандартизовать  C в международном масштабе; совместный  стандарт был опубликован в  1990 году и назван ANSI/ISO 9899:1990. Этот  стандарт усовершенствуется до  сих пор и поддерживается большинством  фирм разработчиков компиляторов.

С++ был разработан Бьерном Страуструпом. "Я придумал C++, записал его первоначальное определение и выполнил первую реализацию. Я выбрал и сформулировал критерии проектирования C++, разработал его основные возможности и отвечал за судьбу предложений по расширению языка в комитете по стандартизации C++, - пишет автор самого популярного языка программирования. - Язык C++ многим обязан языку C, и язык C остается

 подмножеством языка  C++ (но в C++ устранены несколько  серьезных брешей системы типов  C). Я также сохранил средства C, которые являются достаточно  низкоуровневыми, чтобы справляться  с самыми критическими системными

 

задачами. Язык C, в свою очередь  многим обязан своему предшественнику,

BCPL; кстати, стиль комментариев « // » был взят в C++ из BCPL. Другим основным источником вдохновения был язык Simula67. Концепция классов (с производными классами и виртуальными функциями) была позаимствована из него. Средства перегрузки операторов и возможность помещения объявлений в любом месте, где может быть записана инструкция, напоминает Algol68.[2]

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


  1. Анализ задания

Целью курсового проекта  является закрепление полученных знаний и профессиональных навыков разработки и отладки подпрограмм на языке  высокого  уровня С++. Курсовой проект выполняется в соответствии с этапами разработки программного обеспечения: анализ и постановка задачи для решения на ЭВМ, проектирование, кодирование, отладка и тестирование разработанной программы. Проектирование ведется в соответствии с методологией структурного программирования.

Дана функция  (c*4-d/2+23)/(a*a-1). Необходимо разработать программу, для её вычисления. С клавиатуры вводятся 3 переменные, после выполняется расчет данной функции. Далее выполняется вывод результата на экран монитора. Программа состоит из 3-х функций: функция ввода переменных, функция вычисления результата, функция вывода результата.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Запись решения задачи вычисления функции на языке высокого уровня С++

#include"stdafx.h"

#include<iostream>

#include<windows.h>

 

 

 

voidvvod(int&a, int&d, int&c){ //vvodznacheniy a d c

printf("\nVvedite element a \n");

scanf_s("%i", &a);

printf("\nVvedite element d \n");

scanf_s("%i", &d);

printf("\nVvedite element c \n");

scanf_s("%i", &c);  }

 

intotvet(int a, intd,int c){// podstanovkaznach v formulu

if(a==1)

return 1;

elsereturn((4*c-d/2+23)/(a*a-1));

}

 

voidvivodRes(int o) {//vivodotveta

printf("%i\n", o);

 

}

int main(intargc , _TCHAR* argv[]){

int a, d, c;

vvod(a, d, c);

int o = otvet(a, d, c);

vivodRes(o);

system("pause");


return 0;

}

 

 

 

 

 

 

 

 

 

 

 

  1. Блок-схема записи решения задачи вычисления функции на языке высокого уровня С++


 

 

 

 

 

 

 

 

 

 

 

 


intotvet(inta,intc,int d)


void  vivodRes(int res)

 

 

 

 

 

 

 

  1. Запись решения задачи вычисления функции на языке высокого уровня С++,  с использованием функций на Ассемблере

 

// course_project_asm.cpp : Defines the entry point for the console application.

#include "stdafx.h"

#include <iostream>

Using namespace std;

 

 

 

Void vvod(int & a, int & d, int & c){ //vvod znacheniy a d c

printf("\nVvedite element a \n");

scanf_s("%i", &a);

printf("\nVvedite element d \n");

scanf_s("%i", &d);

printf("\nVvedite element c \n");

scanf_s("%i", &c);  }

 

 

int otvet(inta,intc,int d){

//Переменная  для хранения результата

         Int res;

__asm {

              Mov EAX, c;     //копируем с

              imul   EAX,4;       // перемножаем c*4

              mov    res,EAX;   //в рлссохран 4*с

              mov    EAX,d;      // загружаем д

              cdq;

              idiv    EAX,2;         //делим пополам

              sub    res,eax;     //вычитаем (4*с)-(д/2)

              add    res,23;       // к числителю прибавляем 23

              mov   EAX,a;        //загружаем а

              imul   EAX,EAX;    //возводим в квадрат

              dec     EAX;           //вычитаем еденицу

              mov    EBX,EAX; //знаменатель сохраняем

              mov    EAX,res;

              cdq;

              idiv     EBX;


              mov    res,EAX;

              ret;

}

return res;

}

 

void  vivod Res(int res){

сhar rezultat[] = "otvet: %i \n";

__asm{

Mov  eax, res;

Push  eax;

Lea     eax, rezultat;

Push  eax;

Call   dwordptr [printf];

Add  esp, 6;

       }}

 

 

 

 

 

 

Intmain(){

setlocale(LC_ALL, "RUS");

inta,c,d,res;


 

if (a=1){

cout<<"Oshibka ..  "<<endl;

}

else{

res=otvet(a, c, d);

vivodRes(res);

       }

system("pause");

return 0;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. Запись решения задачи вычисления функции на языке Ассемблер

 

.686             ; Определение архитектуры

.MODEL FLAT, C   ; Объявление  модели памяти

.STACK           ; Выделение стекпамяти, размерром 1 кб

.DATA

                 ; Данные, используемые при вызове функций ввода/вывода

outputFormat BYTE "%i",13,10,0  ; вывод


inputFormat BYTE "%i %i %i",0   ; форматввода

 

.CODE                                 ; объявление функций ввода/вывода iostream

 

printf PROTO format:ptr BYTE, varlist: VARARG

scanf_s PROTO format:ptr BYTE, varlist: VARARG

 

                 ; Назначение: вывод результата

                 ; Входные данные: f - результат

 

result PROC f:SDWORD

invoke printf, ADDR outputFormat, f

ret

result ENDP

 

                 ; Назначение: ввод чисел

                 ; Входные данные: указатели на a, b, c

 

vvod PROC va:ptr SDWORD, vb:ptr SDWORD, vc:ptr SDWORD

invoke scanf_s, ADDR inputFormat, va, vd, vc

                               ; проверка правильности вводимых данных

cmp  eax, 3

jne  ioerr

mov  eax, 1

ret

ioerr:

mov  eax, 0

ret

vvod ENDP

                 ; При возникновении ошибки деления на ноль возвращается 0

 

vvod PROC usesesi eax edxecx, va: SWORD, vb: SWORD, vc: SWORD, result:ptr SDWORD ;SDWORD              

          используется для инициализации и сохранения выделяем 4 байта для

movsx  ebx, vc       ;копируем со знаковым расширением « с »

mov    eax,4         ;копируем 4

imul   ebx,eax       ;перемножаем

movsx  ecx,vd        ; копируем со знаковым расширением « d »

cdq                  ;преобразование из двоисного слова в учетверенное

idiv   ecx,2         ;делим d/2

sub    eax,ebx       ;вычитаем (4*с)-(d/2)

add    eax,23        ;прибавляем (4*с-d/2)+23

push   eax           ;сохроняем в стек

movsx  eax,va        ;копируем со знаковым расширением « а »

imul   eax,eax       ;умножаем а*а

dec    eax           ;декремент уменьшает операнд на 1 (а*а)-1

cmp    eax,eax       ; логическое сравнение

jz     err           ;нуль или равно

pop    ebx           ;извлекаем из стека

xchg   eax,ebx;

cdq

idiv   ebx;

Запись решения задачи вычисления функции на языке Ассемблер.txt

— 2.08 Кб (Скачать файл)

Запись решения задачи вычисления функции на языке высокого уровня С++, с использованием функций на Ассемблере.txt

— 1.61 Кб (Скачать файл)

Запись решения задачи вычисления функции на языке высокого уровня С++.txt

— 627 байт (Скачать файл)

Информация о работе Основы Ассемблирования