Главная страница
Навигация по странице:

  • «МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» ( МОСКОВСКИЙ ПОЛИТЕХ)

  • З А Д А Н И Е на КУРСОВУЮ РАБОТУ

  • 1.2. Программирование на языке ассемблер

  • 1.3. Достоинства и недостатки

  • 2.Теоретическая часть

  • 3. Проектная часть

  • Перечень выполнимых проектных решений

  • Список использованной литературы

  • Курсовая работа мосполитех по Программное обеспечение средств вычислительной техники и автоматизированных систем _. Курсовая работа. Лапшин. 05.12.21. Курсовой проект по дисциплине Программирование на тему Разработка программного обеспечения для суммы нечетных элементов массива под микропроцессоры Intel на архитектуре x86


    Скачать 93.18 Kb.
    НазваниеКурсовой проект по дисциплине Программирование на тему Разработка программного обеспечения для суммы нечетных элементов массива под микропроцессоры Intel на архитектуре x86
    АнкорКурсовая работа мосполитех по Программное обеспечение средств вычислительной техники и автоматизированных систем
    Дата08.12.2021
    Размер93.18 Kb.
    Формат файлаdocx
    Имя файлаКурсовая работа. Лапшин. 05.12.21.docx
    ТипКурсовой проект
    #295936

    МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

    ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

    «МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

    (МОСКОВСКИЙ ПОЛИТЕХ)


    Факультет информационных технологий



    Кафедра «Прикладная информатика»

    Направление: 09.03.01 Информатика и вычислительная техника _

    Профиль: Программное обеспечение средств вычислительной техники и автоматизированных систем _

    Форма обучения: заочная

    КУРСОВОЙ ПРОЕКТ

    по дисциплине Программирование _

    на тему «Разработка программного обеспечения для суммы нечетных элементов массива под микропроцессоры Intel на архитектуре x86 »

    Выполнил студент группы 183-321 /Е.Д.Лапшин /

    (подпись) И.О. Фамилия
    Руководитель

    курсового проекта

    ст. преп./доцент/профессор / А.В. Осипов /

    (подпись) И.О. Фамилия

    Оценка ______________

    Дата 29.11.2021





    МОСКВА 2021


    МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

    ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

    «МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

    (МОСКОВСКИЙ ПОЛИТЕХ)


    Факультет информационных технологий



    Кафедра «Прикладная информатика»

    Направление: 09.03.01 Информатика и вычислительная техника _

    Профиль: Программное обеспечение средств вычислительной техники и автоматизированных систем__

    Форма обучения: заочная
    З А Д А Н И Е на КУРСОВУЮ РАБОТУ


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

    « Микропроцессорные устройства систем управления »

    на тему

    «Разработка программного обеспечения для нахождения

    суммы нечетных элементов массива под микропроцессоры Intel на архитектуре х86»

    выдано студенту группы .183-321 Лапшину Егору Дмитриевичу

    (фамилия, имя, отчество)


    Исходные данные

    Задан массив int a {1,-2,3,-40,5}. Нужно найти сумму элементов

    элементов массива, которые являются нечетными

    Содержание пояснительной записки (перечень подлежащих разработке вопросов)

    Методы сортировки и их реализации




    Перечень графического материала

    Рисунки 1-3.2, блок-схема










    Дата сдачи курсового проекта на проверку руководителю

    5 декабря 2021 года




    Дата выдачи задания

    15 ноября 2021 года



    Руководитель КП

    Уч. степень, уч. звание _______________ / Осипов А.В. /

    ( подпись) И.О. Фамилия
    Задание принял к исполнению __________ /Лапшин Е.Д. /

    (подпись) И.О. Фамилия

    Оглавление





    Введение 4

    1. Язык программирования ассемблер 7

    1.1 История языка ассемблера 7

    1.2. Программирование на языке ассемблер 9

    1.3. Достоинства и недостатки 11

    2.Теоретическая часть 14

    2.1. Ассемблер 14

    3. Проектная часть 15

    3.1. Алгоритм Евклида 15

    Перечень выполнимых проектных решений: 17

    Заключение 18

    Список использованной литературы 19

    Приложения 20


    Введение


    Язык Ассемблер — это низкоуровневый язык программирования для компьютеров или других программируемых устройств, он специфичен для конкретной компьютерной архитектуры центрального процессора, что отличает его от большинства высокоуровневых языков программирования, которые обычно портативны среди разных систем. Язык Ассемблер преобразуется в исполняемый машинный код с помощью служебной программы, называемой ассемблером, такой как NASM, MASM и т. д.

    Каждый персональный компьютер имеет микропроцессор, который управляет арифметической, логической и контрольной активностью.
    Каждая семья процессоров имеет свой собственный набор инструкций для обработки различных операций, таких как получения ввода с клавиатуры, отображение информации на экране и выполнения различных других работ. Этот набор инструкций называется «инструкции машинного языка» ('machine language instructions').
    Процессор понимает только инструкции машинного языка, которые являются строками из единиц и нулей. При этом машинный язык слишком непонятный и сложный для использования его в разработки программного обеспечения. И низкоуровневый язык Ассемблер предназначен для определённый групп процессоров, он представляет различные инструкции в символическом коде и более понятной форме.
    Преимущества языка Ассемблер

    Знание языка ассемблера позволяет понять:

    • Как программы взаимодействуют с ОС, процессором и BIOS;

    • Как данные представлены в памяти и других внешних устройствах;

    • Как процессор обращается к инструкции и выполняет её;

    • Как инструкции получают доступ и обрабатывают данные;

    • Как программа обращается к внешним устройствам.


    Другие преимущества использования ассемблера:

    • Программы на нём требует меньше памяти и времени выполнения;

    • Это упрощает сложные аппаратные задачи;

    • Подходит для работ, в которых время выполнения является критичным;

    • Он наиболее подходит для написания подпрограмм обработки прерываний и других программ, полностью находящихся в оперативной памяти.

    Целью курсовой работы является разработка программного обеспечения для нахождения наибольшего общего делителя двух чисел под микропроцессоры Intel на архитектуре x86.

    Задачи курсовой работы:

    1. Разработать ПО для нахождения наибольшего общего делителя двух чисел;

    2. Найти сумму нечетных элементов массива int a[]={1,-2,3,-40,5};

    3. Вывести результат



    1. Язык программирования ассемблер

    1.1 История языка ассемблера


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

    Первые программисты почти всегда имели блокноты с записью наиболее употребляемых подпрограмм, чтобы в случае необходимости не составлять их заново. Проблема состояла в том, что адреса расположения команд и переменных подпрограммы в памяти менялись в зависимости от ее размещения в последней. Настройка подпрограмм на определенное место в памяти, очевидно, нуждалась в автоматизации, и впервые это было сделано на «Эдсаке». Программисты Кембриджа начали с написания набора унифицированных подпрограмм, которые и образовали библиотеку. После этого достаточно было ввести лишь короткую команду – и компьютер проделывал всю работу по настройке и размещению подпрограммы внутри программы.

    Морис Уилкс назвал мнемоническую схему для «Эдсака» и библиотеку подпрограмм собирающей системой (по-английски assembly system – отсюда слово «ассемблер»), поскольку она собирала последовательности подпрограмм.

    Первая программа на компьютере, написанная в машинных кодах, была запущена в 1948 году в Англии. До 1950 года все программы для компьютеров составлялись исключительно в машинных кодах. Такой способ составления программ был очень трудоемким, так как алгоритм необходимо было детализировать до элементарных действий, которым отвечали команды компьютера. Как следствие, программы были громоздкими, содержали большое количество ошибок, для выявления и удаления которых, в свою очередь, требовалась кропотливая и продолжительная работа.

    Довольно скоро стало понятно, что процесс формирования машинного кода можно автоматизировать. Уже в 1950 году для записи программ начали применять мнемонический язык – язык assembly. Язык ассемблера позволил представить машинный код в более удобной для человека форме: для обозначения команд и объектов, над которыми эти команды выполняются, вместо двоичных кодов использовались буквы или сокращенные слова, которые отражали суть команды. Например, на языке ассемблера команда сложения двух чисел обозначается словом add, тогда как ее машинный код может быть таким: 000010. Запись программы на языке ассемблера фактически является тем же машинным кодом, только представленным с помощью специальных обозначений.

    Ассемблер можно отнести к языкам второго поколения, если за первый принять машинный код. Появление этого языка на свет, очень облегчало жизнь программистов. Теперь вместо рябящих в глазах нулей и единиц, они могли писать программу командами, состоящими из символов приближенных к обычному языку. Для того времени этот язык был новшеством и пользовался популярностью т.к. позволял писать программы небольшого размера, что при тех машинах критерий значительный. Но сложность разработки в нём больших программных комплексов привела к появлению языков третьего поколения – языков высокого уровня. Но на этом жизнь ассемблера не закончилась, он жив и посей день и не только жив, но и пользуется популярностью в узких кругах. Сейчас его используют в написании отдельных фрагментов программ или иногда в написании самих программ. Примеров может быть много, но самые яркие это использование ассемблера в написании драйверов, игр и загрузчиков ОС.

    1.2. Программирование на языке ассемблер



    Ассемблер - язык программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком.

    Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи команд и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции: связывание частей программы и данных через метки с символьными именами и директивы.

    Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла) ; повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др.

    Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера.

    Ассемблерные программы могут быть очень эффективными. Из программистов, с равными навыками и способностями, работающих на языке Ассемблера создать программу более компактную и быстродействующую, чем такую же программу, написанную на языке высокого уровня. Это так практически для всех небольших или средних программ. К сожалению, по мере возрастания размеров, программы на языке Ассемблера теряют часть своих преимуществ. Это происходит из-за необходимого в ассемблерной программе внимания к деталям. Как вы видите, язык Ассемблера требует от вас планирования каждого действия компьютера. В небольших программах это позволяет оптимизировать работу программы с аппаратными средствами. В больших же программах огромное количество деталей может помешать вам эффективно работать над самой программой, даже если отдельные компоненты программы окажутся очень неплохими. Безусловно, программирование на языке Ассемблера отвечает потребностям не каждой программы.

    Программы на языке Ассемблера очень точны. Поскольку этот язык позволяет программисту непосредственно работать со всем аппаратным обеспечением, ассемблерная программа может делать то, что недоступно никакой другой программе.

    Язык Ассемблера необходим также и в тех случаях, когда главными являются рабочие характеристики программы. Это может быть время исполнения или конечный размер программы. Библиотека математических процедур Фортрана - пример программы, требующей хороших характеристик, как в отношении времени, так и размера. Математические процедуры являются частью любой программы на Фортране, поэтому они должны занимать как можно меньше места. Кроме того, эти процедуры управляют всеми математическими функциями в фортрановской программе и часто используются. Следовательно, они должны исполняться быстро.

    Команды языка ассемблера один к одному соответствуют командам процессора, фактически, они представляют собой более удобную для человека символьную форму записи (мнемокод) команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора.
    Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на автоматически рассчитываемые абсолютные или относительные адреса, а также так называемые директивы (команды, не переводящиеся в процессорные инструкции, а выполняемые самим ассемблером).
    Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макроопределения с параметрами.
    Каждая модель (или семейство) процессоров имеет свой набор команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы — Intel-синтаксис и AT&T-синтаксис.
    Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Forth, Lisp, Эль-76); фактически, в них он является языком ассемблера.


    1.3. Достоинства и недостатки



    Достоинства:

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

    • Если код программы достаточно большой, данные, которыми он оперирует, не помещаются целиком в регистрах процессора, то есть частично или полностью находятся в оперативной памяти, то искусный программист, как правило, способен значительно оптимизировать программу по сравнению с высокоуровневыми трансляторами по одному или нескольким параметрам: скорость работы (за счёт оптимизации вычислений и/или более рационального обращения к ОП, перераспределения данных), объём кода (в том числе за счёт эффективного использования промежуточных результатов).

    • Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы с меньшими затратами ресурсов.

    • При программировании на языке ассемблера возможен непосредственный доступ к аппаратуре, в том числе портам ввода-вывода, регистрам процессора и др.

    • Язык ассемблера применяется для создания драйверов оборудования и ядра операционной системы.

    • Язык ассемблера используется для создания «прошивок» BIOS.

    • С помощью языка ассемблера создаются компиляторы и интерпретаторы языков высокого уровня, а также реализуется совместимость платформ.

    • Существует возможность исследования других программ с отсутствующим исходным кодом с помощью дизассемблера.

    Недостатки:

    • В силу машинной ориентации («низкого» уровня) языка ассемблера человеку сложнее читать и понимать программу на нём по сравнению с языками программирования высокого уровня; программа состоит из слишком «мелких» элементов — машинных команд, соответственно, усложняются программирование и отладка, растёт трудоёмкость, велика вероятность внесения ошибок.

    • Требуется высокая квалификация программиста. Код на ассемблере выполняется быстрее, но написанный неопытным программистом, обычно оказывается хуже сгенерированного компилятором.

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

    • Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд.

    Язык ассемблера обеспечивает доступ к регистрам, указание методов адресации и описание операций в терминах команд процессора. Язык ассемблера может содержать средства более высокого уровня абстракции: встроенные и определяемые макрокоманды, соответствующие нескольким машинным командам, автоматический выбор команды в зависимости от типов операндов, средства описания структур данных. Главное достоинство языка ассемблера — «приближенность» к процессору, который является основой используемого программистом компьютера, а главным неудобством — слишком мелкое деление типовых операций, которое большинством пользователей воспринимается с трудом. Однако язык ассемблера в значительно большей степени отражает само функционирование компьютера, чем все остальные языки.

    И хотя драйвера и операционные системы сейчас пишут на Си, но Си при всех его достоинствах — язык высокого уровня абстракции, скрывающий от программиста различные тонкости и нюансы железа, а ассемблер — язык низкого уровня абстракции, прямо отражающий все эти тонкости и нюансы.

    2.Теоретическая часть




    2.1. Ассемблер



    Ассемблер (assembler) — компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.

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

    Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные и непривязанные друг к другу части машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью программы-компоновщика («линкера») может быть скомпонован исполнимый файл.

    3. Проектная часть

    3.1. Алгоритм Евклида



    Классический алгоритм Евклида применяется к паре неотрицательных целых чисел. Пока ни одно из чисел в паре не равно нулю, из большего числа вычитается меньшее; вычитаемое и полученная разность формируют новую пару. Действие повторяется, пока один из элементов пары не обратится в 0, тогда значение другого будет равно искомому НОД.
    Рекурсивная формулировка классического алгоритма:
    НОД(a, 0) = a

    НОД(a, b) = НОД(a, a − b) при a ≥ b

    НОД(a, b) = НОД(b, b − a) при a < b
    Несложно заметить, что последовательное вычитание из большего числа меньшего, пока разность не станет меньше вычитаемого, соответствует нахождению остатка от деления большего числа на меньшее. На этом основан так называемый быстрый алгоритм Евклида: в паре чисел одно число делится с остатком на второе; делитель и полученный остаток формируют новую пару. Действие повторяется, пока один из элементов пары не обратится в 0, тогда значение другого будет равно искомому НОД.
    Рекурсивная формулировка быстрого алгоритма:
    НОД(a, 0) = a

    НОД(a, b) = НОД(b, ОСТАТОК(a / b))

    Оба алгоритма обобщаются на ноль и отрицательные значения. При этом следует иметь ввиду:
    Помимо положительных общих делителей у чисел имеются и отрицательные. Однако наибольший общий делитель по определению не может быть отрицательным (очевидно, что любое положительное число больше любого отрицательного). Таким образом НОД двух чисел равен НОДу их модулей.

    Если одно из чисел в паре равно нулю, а другое — нет, то их НОД равен модулю ненулевого числа.

    НОД пары нулей может рассматриваться, как неопределённое значение или бесконечность, а может приниматься равным нулю. Приведённые реализации в основном придерживаются последнего подхода (технически он реализуется проще).

    Подавляющее большинство языков программирования представляют отрицательные целые числа в так называемом дополнительном коде, при этом у наименьшего отрицательного значения типа отсутствует парное положительное значение (например наименьшее значение 16-битного знакового целого — −32768, а наибольшее — 32767). Следовательно вычисление НОД с применением наименьшего значения знакового типа может вызывать переполнение и давать неверные результаты.

    Как правило, языки программирования включают функцию или оператор нахождения остатка от деления двух чисел, поэтому соответствующие реализации используют именно быстрый алгоритм Евклида. Алгоритм, построенный на вычитании, имеет смысл использовать на тех системах, где встроенная операция нахождения остатка отсутствует и её невыгодно эмулировать, например, через деление и взятие целой части.
    В Приложении №1 представлен листинг программы. В Приложении №2 представлены результаты работы программы.

    Перечень выполнимых проектных решений:





    1. Разработали ПО для нахождения суммы нечетных элементов массива;



    2. Найти сумму нечетных элементов массива int a[]={1,-2,3,-40,5};

    3. Вывод результата


    Заключение



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

    Ассемблер является символическим аналогом машинного языка. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т. д. Из-за необходимости учета подобных особенностей ассемблер уникален для каждого типа микропроцессоров.

    В данной курсовой работе изучен теоретический материал о языке низкого уровня - ассемблер, его преимущества и недостатки, основные этапы программирования на ассемблере.


    Список использованной литературы





    1. Касвандс Э. Г. Введение в программирование на языке Ассемблер. ч. 1 - М. : ЮНИТИ - ДАНА, 2006.

    2. Юров В. Assembler. Специальный справочник. - СПб. : Питер, 2007.

    3. Что такое ассемблер. [Электронный ресурс]. - Режим доступа: http://www.assembler.webservis.ru

    4. Ваулин А. С. Языки программирования. кн. 5 - М. : Школа-Пресс, 2008.

    5. Малютин Э. А. Языки программирования. - М. : Просвещение, 2008.

    6. Абель П. Язык Ассемблера для IBM PC и программирования /Пер. с англ. Ю. В. Сальникова - М. ; Высшая школа 2007 - 447 с. : ил.

    7. Программируем на ассемблере. [Электронный ресурс]. - Режим доступа: http://www.kalashnikoff.ru

    8. Зубков С. В. Assembler для DOS, Windows и Unix. - М. : ИНФРА-М, 2009.

    Приложения



    Приложение №1

    Листинг

    section .text

    global _start ; должно быть объявлено для линкера (ld)

    _start:

    mov eax,5 ; кол-во значений типа byte для выполнения операции сложения

    mov ebx,0 ; EBX будет хранить сумму

    mov ecx, x ; ECX будет указывать на текущий элемент для выполнения операции сложения

    top: add ebx, [ecx]

    add ecx,1 ; перемещаем указатель на следующий элемент

    dec eax ; выполняем декремент счетчика

    jnz top ; если счетчик не равен 0, то тогда выполняем цикл еще раз

    done:

    add ebx, '0'

    mov [sum], ebx ; готово, сохраняем результат в переменной sum

    display:

    mov edx,1 ; длина сообщения

    mov ecx, sum ; сообщение для вывода на экран

    mov ebx, 1 ; файловый дескриптор (stdout)

    mov eax, 4 ; номер системного вызова (sys_write)

    int 0x80 ; вызвать ядро

    mov eax, 1 ; номер системного вызова (sys_exit)

    int 0x80 ; вызвать ядро

    section .data

    global x

    x:

    db 1

    db 3

    db 5

    sum:

    db 0

    Приложение №2

    Результаты программы

    Рис 3.1





    написать администратору сайта