[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3
Автор Сообщение
Михаил Долинский

Темы: 1984
Сообщений: 47236

Мой профиль
UPD 19 сентября 2014 года

С для TCPU - Реализованные возможности

Примеры решений

C доступом к регистрам и памяти TCPU
С-TCPU\Hex-программы для TCPU\1 - "Количество букв" 83564
Найти произведение двух чисел
Нельзя обращаться на прямую к памяти в операциях сравнения. Предварительно значение из памяти нужно записать в переменную +1
Нельзя использовать оператор -= с массивами. С массивами работает только обычное присваивание
Нельзя использовать оператор += с массивами. С массивами работает только обычное присваивание

C входными переменными больше одного байта
1 2

Кажется, что не работает правильная С-программа

Промежуточные переменные по 3 бита корректно в Си для TCPU не поддерживаются


Как переводить код С в HEX-формат
Если генерируемый из С-программы ASM-код не компилируется

Архитектура учебного процессора TCPU
Документация по процессору TCPU
Инструкция по созданию кода в формате IntelHEX для процессора TCPU
Инструкции по решению задач
Инструкции по установке задач
=================================================================


В нынешнем учебном году Саша Моисеенко (ПО-41) в рамках курсовой
работы занимается разработкой С-компилятора для процессора TCPU.

Первая версия этого компилятора вынесена в работу.

Отныне задачи для процессора TCPU можно решать любым из трех способов:

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

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

- писать программы на С-TCPU
и отсылать их на тестирование, превращая там в двоичные коды
с помощью C-компилятора для TCPU, который Саша Моисеенко написал
в сейчас

Для увеличения количества доступных студентам индивидуальных задач
по выбору, а также для интенсификации поиска и устранения ошибок
в разрабатываемом С-компляторе, в зону оценивания сконвертированы
задачи на программирование и в них вставлены ограничения -
реализовывать ТОЛЬКО на С для TCPU (расширение TC).

Отдельные бонусные баллы будут начисляться студентам за найденные
ОШИБКИ в работе компилятора.


// 20 марта 2009 г.
// Си для TCPU
// Пока реализованы только операции присваивания, +, -, &, |, ^, ~

// пример
// задача Обучение\С-TCPU\Логические элементы\1 - "Деление на 4" 80882
// определить делится ли чисто составленное из битов x4, x3, x2, x1 на 4.
// x1 - младший бит.

unsigned __bits(8) x1;
unsigned __bits(8) x2;
unsigned __bits(8) x3;
unsigned __bits(8) x4;
unsigned __bits(8) y;

void main()
{
	y = (x1 | x2) ^ 1;
}

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Установлена новая версия Си компилятора для TCPU.
Реализованы операторы:
=
+
-
&
^
|
~
+=
-=
&=
^=
|=
&&
||
!
++
--
<
>

Операторы сравнения < > пока работают только для беззнаковых типов.
Реализованы инструкции: if else, while, do while.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Добавлены новые операторы и инструкции и исправлены старые:
==
!=
>
<<
for

Михаил Долинский

Темы: 1984
Сообщений: 47236

Мой профиль
Мои поздравления Саше Моисеенко!!!
Вот такие программы уже обрабатываются его С-компилятором (и сдаются на DL):

1.tc
unsigned __bits(16) a;
unsigned __bits(16) b;
unsigned __bits(16) c;
unsigned __bits(16) res;

void main()
{ unsigned s1=0,s2=0;
  if (a>b) {	
	     for (unsigned i=0; i<a; i++) s1+=c;
	     res = s1; 
           }
	else 
           { for (unsigned i=0; i<a; i++) s1+=b;
	     res = s1;}	
 	   }

}

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Добавлены новые возможности:
- параллельно генерируется программа на языке ассемблера
- можно работать с массивами, но пока только в инструкции простого присваивания
- доступ к внутренним регистрам и памяти TCPU через переменные _A, _B, _R1, _R2, _Data[0xff].


Теперь можно сдавать задачи из раздела "Hex-программы для TCPU" на Си.

Пример.
С-TCPU\Hex-программы для TCPU\1 - "Количество букв" 83564
Найти количество букв в слове (слово заканчивается символом *).
Вход: R1 - адрес ячейки, содержащей первую букву слова.
Выход: A - количество букв в слове.

Решение:
void main()
{
	int i, j = _R1;
	for (i = 0;; i++)
	{
		int c = _Data[j++];
		if (c == '*') break;
	}
	_A = i;
}



При использовании внутренних регистров и памяти следует:
- в начале программы сохранить регистры во внутренние переменные, причем первым нужно сохранить R1
int R1 = _R1;
int A = _A;
int B = _B;
int R2 = _R2;

- только в конце программы можно записать результат в соответствующий регистр

- пока нельзя использовать обращение к массивам нигде, кроме оператора простого присаивания. Для работы с элементом массива его значение необходимо сперва записать во внутреннюю переменную.
int c = _Data[i];
c++;
_Data[i] = c;

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Добавлено:
<=
>=
*
>>
>>=
switch

Операторы сравнения теперь корректно поддерживают знаковые операнды.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Добавлена поддержка функций. Но пока без возможности возвращать значения.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Дмитрий Герасимов:

Многие конвертированные задачи на TCPU имеют переменные размерностью больше 8 бит, которые, как я понимаю, не поддерживаются процессором TCPU. Примеры таких задач: 44883,39002 и другие. 

Входные и выходные переменные размерностью больше 8 бит можно объявлять как массив байтов. Например,

На входе даны значения чисел (16 бит) - x,y,z.
На выходе число размерности (32 бит) - Result.

int x[2];
int y[2];
int z[2];
int Result[4];
Вячеслав Кацубо

Темы: 2
Сообщений: 60

Мой профиль
При решении задачи http://dl/task.jsp?nid=909135&cid=813
Командные олимпиады\Архитектура учебного процессора TCPU \C-Программы (tc)\1 - "Количество букв" 102597 Сивенков В., ПОИТ-37, февраль 2007
выдало [1]: WInter: программное исключение.

отправляемое решение
 void main(){
	int i, j = _R1;
	for (i = 0;; i++){
		int c = _Data[j++];
		if (c == '*') break;
	}
	_A = i;
}

Sergey Sementsov

Темы: 1
Сообщений: 154

Мой профиль
Задача:
http://dl.gsu.by/task.jsp?nid=909136&cid=813

Такая же проблема, как и в предыдущем сообщении:
[1]: WInter: программное исключение.

void main()
{
	int	i, j = _R1;
	for (i=0; ; i++) {
		int c = _Data[j++];
		if (c == '*')
			break;
		if (c != 'a')
			i--;
	}
	_A = i;
} 


Семенцов, Коваль, Белоглазов.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Проблема с программным исключением исправлена, решения перетестированы.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Пример решения задачи с входными переменными больше одного байта.


При приеме на работу предлагается заполнить анкету из 10 вопросов, вариантами ответов на которые могут быть только да (единица) или нет (нуль).Вам известны ответы, которые желает получить работодатель на эти вопросы, и ответы потенциального работника. Требуется определить на сколько процентов данный работник соответствует требованиям работодателя. За каждое совпадение ответа работника с желаемым ответом работодателя работнику прибавляется 10 процентов.
x (10 бит) - ответы работника
у (10 бит) - ответы работодателя
res (7 бит) - на сколько процентов работник соответствует требованиям работодателя


Пример 1:
x: 0000000011
y: 0000000000
res: 80

Пример 2:
x: 0000000000
y: 0000000000
res: 100  


// объявляем двухбайтовые переменные
unsigned x[2];
unsigned y[2];

unsigned __out res;

void main()
{
	// каждый байт нужно обработать отдельно

	// младшие байты
	unsigned a = x[0];
	unsigned b = y[0];
	a = ~(a ^ b);
	res = 0;
	while (a)
	{
		if (a & 1) res++;
		a >>= 1;
	}

	// старшие байты
	a = x[1];
	b = y[1];
	// рассматриваем только 2 младших бита
	a = ~(a ^ b) & 3;
	while (a)
	{
		if (a & 1) res++;
		a >>= 1;
	}

	res *= 10;
}

Алексей Белоглазов

Темы: 0
Сообщений: 82

Мой профиль
Можете пояснить или сказать где можно посмотреть как переводить код С в HEX?
Михаил Долинский

Темы: 1984
Сообщений: 47236

Мой профиль
Инструкция по созданию кода в формате IntelHEX для процессора TCPU
Алексей Белоглазов

Темы: 0
Сообщений: 82

Мой профиль
Я пишу программу на С, компилирую, получаю в той же директории файл .asm, переименовываю его в .tcpu, открываю его в Winter TCPU Asm, но он даже не компилируется. Ругается на unknown character. Что я делаю не так?
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3
Time:0,031