Автор работы: Пользователь скрыл имя, 09 Декабря 2013 в 19:09, курсовая работа
Ассемблер - низкоуровневый язык программирования. Для каждого процессора существует свой ассемблер. Программируя на ассемблере вы непосредственно работаете с аппаратурой компьютера. Исходный текст на языке ассемблера состоит из команд (мнемоник), которые после компиляции преобразуются в коды команд процессора.Разработать программу на ассемблере тяжело. Взамен потраченному времени вы получаете эффективную программу. Программы на ассемблере пишут, когда важен каждый такт процессора. На ассемблере вы даёте конкретные команды процессору. Этим и достигается высокая скорость выполнения вашей программы.Чтобы грамотно использовать ассемблер необходимо знать программную модель микропроцессорной системы.
Введение 4
1.Анализ задания 8
2.Запись решения задачи вычисления функции на языке высокого уровня С++ 9
3.Блок-схема записи решения задачи вычисления функции на языке высокого уровня С++ 10
4.Запись решения задачи вычисления функции на языке высокого уровня С++, с использованием функций на Ассемблере 11
5.Запись решения задачи вычисления функции на языке Ассемблер 12
Расчет результатов программы на языке с++ 13
Расчет результатов программы на с++ c ассемблерными вставками 16
Вывод 17
Использованная литература 18
Министерство образования науки Российской Федерации
Государственное образовательное учреждение
Высшего профессионального образования
«Владимирский государственный университет им. А.Г. и Н.Г.Столетовых»
Кафедра «вычислительной техники»
Курсовой проект
по дисциплине
«Программирование»
Выполнил:
Ст. гр. Вт-112
Клеткин Д.В.
Принял:
Маскеев С.В.
Владимир 2013
Содержание
Введение 4
1.Анализ задания 8
2.Запись решения задачи вычисления функции на языке высокого уровня С++ 9
3.Блок-схема
записи решения задачи
4.Запись решения задачи вычисления функции на языке высокого уровня С++, с использованием функций на Ассемблере 11
5.Запись решения задачи вычисления функции на языке Ассемблер 12
Расчет результатов программы на языке с++ 13
Расчет результатов программы на с++ c ассемблерными вставками 16
Вывод 17
Использованная литература 18
Ассемблер - низкоуровневый язык программирования. Для каждого процессора существует свой ассемблер. Программируя на ассемблере вы непосредственно работаете с аппаратурой компьютера. Исходный текст на языке ассемблера состоит из команд (мнемоник), которые после компиляции преобразуются в коды команд процессора.Разработать программу на ассемблере тяжело. Взамен потраченному времени вы получаете эффективную программу. Программы на ассемблере пишут, когда важен каждый такт процессора. На ассемблере вы даёте конкретные команды процессору. Этим и достигается высокая скорость выполнения вашей программы.Чтобы грамотно использовать ассемблер необходимо знать программную модель микропроцессорной системы. С точки зрения программиста микропроцессорная система состоит из: микропроцессора, памяти, устройств ввода/вывода.
Синтаксис АссемблераОбщий формат строки программы на ассемблере
<Метка>: <Оператор><Операнды> ;<Комментарий>
Поле метки. Метка может состоять из символов и знаков подчёркивания. Метки используются в операциях условного и безусловного перехода.
Поле оператора. В этом поле содержится мнемоника команды.
Поле операндов. Операнды могут присутствовать только если присутствует Оператор (поле оператора). Операндов может не быть, а может быть несколько. Операндами могут быть данные, над которыми необходимо выполнить какие-то действия (переслать, сложить и т.д.).
Поле комментария. Комментарий нужен для словесного сопровождения программы. Всё, что стоит за символом «; »считается комментарием.
Давайте рассмотрим плюсы и минусы программирования на языке ассемблера.
Плюсы
1) Программы, написанные
на языке ассемблера (если они
написаны грамотно), отличаются высокой
эффективностью, т.е. минимальным
объемом и максимальным
2) Программы, написанные на языке ассемблера, могут то, что не под силу программам, созданным на любом другом языке программирования.
3) Программы на ассемблере легко отлаживать, так как в них нет лишнего кода.
4) Язык ассемблера является
основным инструментом
5) С появлением высокоуровневых
конструкций в языке
Минусы
1) Программы, написанные
на языке ассемблера, не переносимы.
Программы, написанные для
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 (чтобы "обеспечить
недвусмысленное и машинно-
С++ был разработан Бьерном Страуструпом. "Я придумал C++, записал его первоначальное определение и выполнил первую реализацию. Я выбрал и сформулировал критерии проектирования C++, разработал его основные возможности и отвечал за судьбу предложений по расширению языка в комитете по стандартизации C++, - пишет автор самого популярного языка программирования. - Язык C++ многим обязан языку C, и язык C остается
подмножеством языка
C++ (но в C++ устранены несколько
серьезных брешей системы
задачами. Язык C, в свою очередь многим обязан своему предшественнику,
BCPL; кстати, стиль комментариев « // » был взят в C++ из BCPL. Другим основным источником вдохновения был язык Simula67. Концепция классов (с производными классами и виртуальными функциями) была позаимствована из него. Средства перегрузки операторов и возможность помещения объявлений в любом месте, где может быть записана инструкция, напоминает Algol68.[2]
Целью курсового проекта является закрепление полученных знаний и профессиональных навыков разработки и отладки подпрограмм на языке высокого уровня С++. Курсовой проект выполняется в соответствии с этапами разработки программного обеспечения: анализ и постановка задачи для решения на ЭВМ, проектирование, кодирование, отладка и тестирование разработанной программы. Проектирование ведется в соответствии с методологией структурного программирования.
Дана функция (c*4-d/2+23)/(a*a-1). Необходимо разработать программу, для её вычисления. С клавиатуры вводятся 3 переменные, после выполняется расчет данной функции. Далее выполняется вывод результата на экран монитора. Программа состоит из 3-х функций: функция ввода переменных, функция вычисления результата, функция вывода результата.
#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-
}
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;
}
intotvet(inta,intc,int d)
void vivodRes(int res)
// 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;
}
.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;