Автор |
Сообщение |
22.03.2009 13:21:28
Тема: С-компилятор для TCPU
|
Михаил Долинский
(Online)
Темы: 2072
Сообщений: 49883
Мой профиль
|
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;
}
|
02.04.2009 12:37:35
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Установлена новая версия Си компилятора для TCPU.
Реализованы операторы:
=
+
-
&
^
|
~
+=
-=
&=
^=
|=
&&
||
!
++
--
<
>
Операторы сравнения < > пока работают только для беззнаковых типов.
Реализованы инструкции: if else, while, do while.
|
09.04.2009 12:52:06
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Добавлены новые операторы и инструкции и исправлены старые:
==
!=
>
<<
for
|
14.04.2009 15:37:58
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
(Online)
Темы: 2072
Сообщений: 49883
Мой профиль
|
Мои поздравления Саше Моисеенко!!!
Вот такие программы уже обрабатываются его С-компилятором (и сдаются на 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;}
}
}
|
08.05.2009 13:23:40
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Добавлены новые возможности:
- параллельно генерируется программа на языке ассемблера
- можно работать с массивами, но пока только в инструкции простого присваивания
- доступ к внутренним регистрам и памяти 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;
|
11.05.2009 16:44:27
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Добавлено:
<=
>=
*
>>
>>=
switch
Операторы сравнения теперь корректно поддерживают знаковые операнды.
|
22.05.2009 13:00:51
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Добавлена поддержка функций. Но пока без возможности возвращать значения.
|
11.10.2010 13:44:58
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Дмитрий Герасимов:
Многие конвертированные задачи на TCPU имеют переменные размерностью больше 8 бит, которые, как я понимаю, не поддерживаются процессором TCPU. Примеры таких задач: 44883,39002 и другие.
Входные и выходные переменные размерностью больше 8 бит можно объявлять как массив байтов. Например,
На входе даны значения чисел (16 бит) - x,y,z.
На выходе число размерности (32 бит) - Result.
int x[2];
int y[2];
int z[2];
int Result[4];
|
21.02.2012 12:52:14
Тема: Re:С-компилятор для TCPU
|
Вячеслав Кацубо
Темы: 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;
}
|
21.02.2012 13:37:50
Тема: Re:С-компилятор для TCPU
|
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;
}
Семенцов, Коваль, Белоглазов.
|
21.02.2012 15:13:33
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Проблема с программным исключением исправлена, решения перетестированы.
|
07.03.2012 08:52:03
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Пример решения задачи с входными переменными больше одного байта.
При приеме на работу предлагается заполнить анкету из 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;
}
|
27.05.2012 23:44:34
Тема: Re:С-компилятор для TCPU
|
Алексей Белоглазов
Темы: 0
Сообщений: 82
Мой профиль
|
Можете пояснить или сказать где можно посмотреть как переводить код С в HEX?
|
28.05.2012 07:21:39
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
(Online)
Темы: 2072
Сообщений: 49883
Мой профиль
|
Инструкция по созданию кода в формате IntelHEX для процессора TCPU
|
28.05.2012 10:28:24
Тема: Re:С-компилятор для TCPU
|
Алексей Белоглазов
Темы: 0
Сообщений: 82
Мой профиль
|
Я пишу программу на С, компилирую, получаю в той же директории файл .asm, переименовываю его в .tcpu, открываю его в Winter TCPU Asm, но он даже не компилируется. Ругается на unknown character. Что я делаю не так?
|
|