Работа с целочисленными данными в Metrowerks CodeWarrior

  • Вид работы:
    Практическое задание
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    270,91 Кб
  • Опубликовано:
    2013-10-23
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Работа с целочисленными данными в Metrowerks CodeWarrior

Национальный технический университет Украины

«Киевский политехнический институт»

Кафедра информационно-измерительной техники










Лабораторная работа

по курсу: «Проектирование систем с микрокомпьютерами»

«Работа с целочисленными данными в Metrowerks CodeWarrior»

Выполнил: Зыкий О.О.

Проверил: Карпа В.М.





Киев 2012

1. Объявление переменной в Metrowerks CodeWarrior

Этот раздел представляет информацию о принципах работы с целочисленными данными в Metrowerks CodeWarrior (в частности, об арифметических операциях, а также о пересылке, перемещении, сохранении данных).

Переменные в Metrowerks CodeWarrior объявляются следующим образом

тип идентификатор [= значение];

Квадратные скобки в данном выражении обозначают, что присутствие части выражения, заключенной в них, необязательно. Переменная в Metrowerks CodeWarrior может быть инициализирована непосредственно при ее объявлении. При разработке программы в среде Metrowerks CodeWarrior для эффективной работы приложения необходимо определить все переменные до начала процедуры main(). Только в этом случае в ОЗУ М68НС12 под объявленные переменные будет выделена область памяти.

. Основные типы переменных

Основные типы данных в C++ подразделяются на две группы:

данные целочисленного типа

данные типа float (с плавающей точкой)

К данным целочисленного типа относятся данные типов, названия и характеристики которых приведены в таблице 1.


Модификаторы типов unsigned и signed предназначены для определения формата представления данных (знаковое и беззнаковое представление). Как видно из таблицы 1, они не влияют на размеры выделяемых областей памяти.

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

Модификатор типа unsigned указывает, что переменная принимает неотрицательные значения. При этом самый левый бит области памяти, выделяемой для хранения значения, используется для представления значения.

Приведем несколько примеров объявления переменных:

char a1 = ‘c’; //инициализированная переменная типа unsigned char

signed long d1,d2,d3; //три переменных типа signed long

int i; //переменная типа int

Целочисленные данные могут представляться в трех видах:

десятичный вид

16-ричный вид,

8-ричный вид

Приведем примеры такого представления данных:= 16; // десятичный= 0х0032; // 16-ричный

а = 032; // 8-ричный

. Директивы препроцессора

Директивы препроцессора - это инструкции, записанные в тексте программы наряду с кодом С++ и выполняемые до трансляции программы. Назначение директив препроцессора:

включение в исходный код программы кода другого модуля;

замена лексем текста программы некоторыми идентификаторами;

управление процессом трансляции программы и т.д.

Директивы препроцессора начинаются со знака #. После директив препроцессора точка с запятой не ставятся. Упрощенно синтаксис директивы препроцессора выглядит следующим образом:

#директива_препроцессора идентификатор_1 … идентификатор_N

Директива #include. Назначение директивы #include - включение в текст программы кода указанного модуля (файла). Синтаксис этой директивы имеет две формы:

#include "имя_модуля"

#include <имя_модуля>

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

Директива #define

Предназначение директивы #define - замена часто использующихся выражений некоторыми идентификаторами (именованными константами или макроопределениями).

Синтаксис директивы #define две формы:

#define идентификатор текст

#define идентификатор (список_параметров) текст

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

Пример первой синтаксической формы:

#define Big 80 //замена слова Big на 10

#define Very_Big (20*Big) //замена слова Very_Big на

//выражение (10*20)

Во второй синтаксической форме директивы #define присутствует список формальных параметров. Он может содержать один или несколько идентификаторов, разделенных запятыми. Пример такой формы #define:

#define Sum(a,b) (a+b) //замена выражения Sum(a,b) выражением (a+b)

Директива #undef

Назначение директивы #undef - аннулирование определения констант и макросов с помощью директивы #define. Синтаксис этой директивы следующий:

#undef идентификатор

Директива отменяет определение директивой #define для указанного идентификатора. Пример:

#undef Big

#undef Very_Big

. Ассемблерные вставки в код С++

В процессе разработки программы с использованием языка С++ применительно к микроконтроллеру иногда возникает необходимость выполнения некоторых операций на уровне языка Ассемблер. Для этих целей в среде программирования Metrowerks Code Warrior используются т.н. ассемблерные вставки, которые представляют собой фрагмент кода Ассемблера, использующийся наряду с кодом С++.

Синтаксис такой вставки можно представить следующим образом:

…..

__asm

{

фрагмент кода Ассемблера

}

Одним из отличий компилятора Metrowerks CodeWarrior от других компиляторов С++ является необязательность наличия двух символов подчеркивания перед ключевым словом asm. При использовании такой вставки в среде Metrowerks Code Warrior можно непосредственно использовать Ассемблер для микроконтроллера НС12, т.е. принципы и команды работы с регистрами, портами, памятью НС12 остаются неизменными. Однако существуют также существенное отличие между синтаксисами Ассемблеров, используемых в симуляторе НС12 и среде программирования Metrowerks Code Warrior при использовании метки. Отличие синтаксисов в следующем:

симулятор НС12: <метка> <код программы>

Metrowerks Code Warrior: <метка>: <код программы>

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

a,b,c; //объявление переменных - слагаемых и суммыmain (void)

{=0x03; //инициализация 1-го слагаемого

__asm

{$0809 //сохранение данных по адресу

}=0x0E; //инициализация 2-го слагаемого=a+b; //получение суммы

}

целочисленный препроцессор арифметический присваивание

Как видно из вышеуказанного фрагмента, ассемблерные вставки в программах С++ при программировании контроллеров эффективно использовать для реализации операций, которые выглядят весьма громоздко при попытке их реализации на языке высокого уровня (в нашем примере такой операцией является дублирование данных по некоторому адресу).

. Арифметические операции

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

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

Унарные операции

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

Синтаксис операций преобразования знака следующий:

операнд

+ операнд

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

Операции инкремента/декремента соответственно увеличивают/уменьшают значение операнда на 1. В С++ различают префиксную и постфиксную форму использования данных операций. Синтаксис этих двух операций в префиксной форме выглядит следующим образом:

+ + операнд

- операнд

А вот так выглядит синтаксис этих операций в постфиксной форме:

операнд + +

операнд - -

Разница между этими формами использования операций заключается в том, что при использовании префиксной формы увеличение/уменьшение значения операнда происходит до определения значения выражения, в котором операция используется; а при постфиксной - после определения значения этого выражения.

Бинарные операции

К бинарным операциям относят операции сложения, вычитания, умножения, деления и операция получения остатка от деления, а также операция присваивания.

Арифметические бинарные операции

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

операнд1 + операнд2; // сложение

операнд1 - операнд2; // вычитание

операнд1 * операнд2; // умножение

операнд1 / операнд2; // деление

операнд1 % операнд2; // остаток от деления

При работе с целочисленными операндами типа int следует уделить внимание проблеме возможного переполнения при выполнении арифметических операций и сохранении результата. Если сохранять результат какой-либо из вышеуказанных операций в переменной типа unsigned int, и этот результат превосходит 65535, то при записи в переменную будет отброшен старший байт результата, и таким образом данные будут утеряны. В этом случае для сохранения результата необходимо использовать переменную типа long.

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

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

Операция присваивания

Синтаксис операции присваивания следующий:

операнд1 = операнд2

Это простая форма операции присваивания. В качестве операнда 2 операции присваивания может выступать любое выражение. Значение операнда 2 присваивается операнду 1. Не существует никаких ограничений на структуру операнда 2. Операнд 2 может состоять из множества выражений, соединенных операциями присвоения:

операнд1 = операнд2 = … операндN-1 = операндN

где операнды операнд1, операнд2 … операндN-1 не могут быть составными выражениями. Этим операндам будет присвоено значение выражения <операндN.

Специальные формы операций присваивания. В процессе трансляции выражений на этапе генерации кода транслятор строит последовательности машинных кодов, реализующие закодированные в выражениях действия. Например, при трансляции выражения= A + 125

транслятор, прежде всего, генерирует код для вычисления значения выражения A + 125 и присвоения результата переменной A. При этом фрагмент кода, вычисляющий адрес переменной A дважды войдёт во множество команд процессора, реализующих это выражение.

В целях упрощения структуры подобных операторов в C++ применяются комбинированные (или сокращённые) формы операторов присваивания. Эти формы существуют для всех операторов присваивания. Синтаксис комбинированных форм операции присваивания следующий:

операнд1 + = операнд2

операнд1 - = операнд2

операнд1 * = операнд2

операнд1 / = операнд2

операнд1 % = операнд2

Такая форма записи эквивалентна соответственно следующим выражениям:

операнд1 = операнд1 + операнд2

операнд1 = операнд1 - операнд2

операнд1 = операнд1 * операнд2

операнд1 = операнд1 / операнд2

операнд1 = операнд1 % операнд2

При этом операнд2 может быть составным выражением, т.е. включать в себя другие операции и операнды. Специальные формы операций присвоения позволяют не только изменять структуру выражений, но и оптимизировать создаваемый транслятором программный код. Фрагмент кода, определяющий адрес левого операнда выражения встречается в соответствующем множестве команд процессора лишь один раз.

Условная операция

Условная операция - единственная в C++ операция с тремя операндами. Синтаксис этой операции следующий:

(операнд 1) ? операнд2 : операнд3

Первое выражение-операнд располагается слева от знака «?» и является условием. Второе выражение-операнд располагается между знаками «?» и «:». Оно выполняется в том случае, если условие операнд1 истинно, т.е. возвращает ненулевое значение. Третье выражение-операнд находится справа от знака «:» и выполняется в том случае, если условие операнд1 ложно, т.е. возвращает нулевое значение.

. Операции отношения

К операциям отношения причисляют следующие операции:

«больше» (оператор - “>”)

«меньше» (оператор - “<”)

«больше или равно» (оператор - “> =”)

«равно» (оператор - “= =”)

«не равно» (оператор - “! =”)

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

Данные операции относят к бинарным операциям и их общий синтаксис можно описать так:

Операнд 1 О операнд 2

где О - оператор конкретной операции отношения.

. Логические операции

К логическим операциям относятся следующие операции

операция логического И (оператор - “&&”)

операция логического ИЛИ (оператор - “||”).

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

операнд1 О операнд2 О операнд3 О …О операндN

Логические операции не вызывают стандартных арифметических преобразований. Они оценивают каждый операнд с точки зрения его эквивалентности нулю. Результатом логической операции является 0 или 1, тип результата int.

Операция логического И (&&) вырабатывает значение 1, если оба операнда имеют нулевые значения. Если один из операндов равен 0, то результат также равен 0. Если значение первого операнда равно 0, то второй операнд не вычисляется. Операция логического ИЛИ (||) выполняет над операндами операцию включающего ИЛИ. Она вырабатывает значение 0, если оба операнда имеют значение 0, если какой-либо из операндов имеет ненулевое значение, то результат операции равен 1. Если первый операнд имеет ненулевое значение, то второй операнд не вычисляется.

. Индивидуальное задание

Написать программу, заполняющую первые 5 переменных соответственным количеством чисел Фибоначчи F0 … F4 (т.е. последовательность, в которой каждый последующий член является суммой двух предыдущих: 0,1,1,2,3,...), а следующие 5 переменных - F4 … F4 + 5

Код программы:

int a,b,c,d,e,f,g,h,k,l;main(void)

{=0;=1;=a+b;=b+c;=c+d;=e+1;

g=e+2;=e+3;=e+4;=e+5;

}

Результат выполнения программы:


Выводы

В данной лабораторной работе на языке С++ была написана программа, которая заполняет первые 5 переменных числами Фибоначчи (каждая следующая переменная ровняется сумме двух предыдущих), а следующие 5 переменных числами, f5…f4+5. Программа работает правильно, результат ее выполнения был представлен в виде скриншота с Metrowerks CodeWarrior.

Похожие работы на - Работа с целочисленными данными в Metrowerks CodeWarrior

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!