Автор |
Сообщение |
28.05.2012 10:50:02
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Алексей Белоглазов:
Я пишу программу на С, компилирую, получаю в той же директории файл .asm, переименовываю его в .tcpu, открываю его в Winter TCPU Asm, но он даже не компилируется. Ругается на unknown character. Что я делаю не так?
Я думаю, ты все делаешь правильно. Проблема в некорректной генерации АСМ-программы из С-компилятора.
Надеюсь, Игорь Викторович исправит ее. Но это когда будет.
Ты просто сам исправь (там что-то типа символ "_" нельзя использовать).
Это вполне реально.
|
29.05.2012 19:22:58
Тема: Re:С-компилятор для TCPU
|
Михаил Пасенко
Темы: 0
Сообщений: 45
Мой профиль
|
\Индивидуальные задания\Программирование микроконтроллеров\Битовая обработка\3 - "Циклический сдвиг влево" 54168
unsigned __in __bits(8) a;
unsigned __out __bits(8) res;
void main() {
unsigned __bits(8) t1;
unsigned __bits(8) t2;
unsigned __bits(8) tmp1;
unsigned __bits(8) tmp2;
tmp2=a;
t1=a<<1;
t2=a>>7;
tmp1=t1^t2;
while (tmp1>tmp2){
t1=a>>1;
t2=a<<7;
tmp2=tmp1;
tmp1=t1^t2;
}
res=tmp2;
}
Выдает ошибку чекера "Кгтешьу уккщк"
|
30.05.2012 07:37:19
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
29.05.2012 19:20:37 29.05.2012 19:20:40 Пасенко Михаил Архитектура вычислительных систем (М3/ПМ4) - 2012 3. Циклический сдвиг влево 0 Ошибка чекера причина выхода:Runtime Error 128 src.tc DelTA3 at Nit_server
|
30.05.2012 10:31:57
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Михаил Пасенко:
\Индивидуальные задания\Программирование микроконтроллеров\Битовая обработка\3 - "Циклический сдвиг влево" 54168
unsigned __in __bits(8) a;
unsigned __out __bits(8) res;
void main() {
unsigned __bits(8) t1;
unsigned __bits(8) t2;
unsigned __bits(8) tmp1;
unsigned __bits(8) tmp2;
tmp2=a;
t1=a<<1;
t2=a>>7;
tmp1=t1^t2;
while (tmp1>tmp2){
t1=a>>1;
t2=a<<7;
tmp2=tmp1;
tmp1=t1^t2;
}
res=tmp2;
}
Выдает ошибку чекера "Кгтешьу уккщк"
Перетестировано:
[TEST1]: Тест не прошел: RES dec[1]: 196.
|
29.06.2012 12:30:20
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Игорь Коршунов:
Сергей Семенцов:
Вот исходник:
unsigned __in __bits(6) X;
unsigned __in __bits(6) Y;
unsigned __out __bits(1) OUT;
void main(){
unsigned __bits(6) XX = X;
unsigned __bits(6) YY = Y;
YY>>=3;
XX>>=3;
unsigned __bits(3) Y1 = YY;
unsigned __bits(3) X1 = XX;
unsigned __bits(3) Y2 = Y;
unsigned __bits(3) X2 = X;
if ( (X1==Y1) || (X1==Y2) || (X2==Y1) || (X2==Y2) )
OUT = 1;
else
OUT = 0;
}
Промежуточные переменные по 3 бита корректно в Си для TCPU не поддерживаются.
|
04.10.2013 16:41:14
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Условие задачи:
Найти произведение двух чисел. Ограничение исходного кода - 64 байта.
Формат ввода
R1 - первое число.
R2 - второе число.
Формат вывода
A - результат.
Почему не проходит тесты такое решение:
unsigned __in __bits(8) R1;
unsigned __in __bits(8) R2;
unsigned __out __bits(8) A;
void main(){
A=R1*R2;
}
Обращаться к внутренним регистрам и памяти TCPU можно через зарезервированные имена: _A, _B, _R1, _R2, _Data[0xff].
При использовании внутренних регистров и памяти обязательно следует: в начале программы сохранить регистры во внутренние переменные, причем первым нужно сохранить R1; только в конце программы можно записать результат в соответствующий регистр.
Правильное решение для этой задачи.
void main()
{
int r1 = _R1;
int r2 = _R2;
_A = r1 * r2;
}
|
19.09.2014 09:11:42
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Почему неправильно работает программа:
void main()
{
int i, k = 0, j = _R1;
for (i=0, k = 0; ; i++) {
int c = _Data[j++];
if (c == '*')
break;
if (c == 'a')
k++;
}
_A = k;
}
Из теории:
При использовании внутренних регистров и памяти обязательно следует:
в начале программы сохранить регистры во внутренние переменные, причем первым нужно сохранить R1
только в конце программы можно записать результат в соответствующий регистр
В начале программе происходит инициализация переменной к. При этом затирается значение регистра R1.
|
28.10.2014 23:06:54
Тема: Re:С-компилятор для TCPU
|
Павел Окрут
Темы: 1
Сообщений: 22
Мой профиль
|
в задаче (Экзамен\Индивидуальные задания\С-TCPU\Программы по схемам\Логические элементы\10 - "Домино" 83393 Задача Чаетской Ольги) при моём решении пишет ошибку "недостаточно памяти для размещения программы"
unsigned __in __bits (6)X;
unsigned __in __bits (6)Y;
unsigned __out __bits(1)OUT;
void main()
{
unsigned a = X;
unsigned b = Y;
int res=0;
int sc=0;
int res1=0;
a = ~(a ^ b);
while (a && sc<3)
{
if (a & 1) res++;
a >>= 1;
sc++;
}
while(a)
{
if (a & 1) res1++;
a >>= 1;
}
if((res==3) || (res1==3)) OUT=1;
else OUT=0;
}
|
29.10.2014 02:40:23
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Павел Окрут:
в задаче (Экзамен\Индивидуальные задания\С-TCPU\Программы по схемам\Логические элементы\10 - "Домино" 83393 Задача Чаетской Ольги) при моём решении пишет ошибку "недостаточно памяти для размещения программы"
Кодовая память программы процессора TCPU всего 256 байт. Это сообщение как раз и говорит о том, что в результате компиляции исходного текста втоей программы получилась программа в машинных кодах длиной больше чем 256 байт, и поэтому её невозможно загрузить в кодовую память процессора TCPU.
Есть варианты
1) Попытаться написать более оптимальный код
2) Перейти к решению другой задачи.
Используй тег code=cpp для более красивого представления программы на форуме
unsigned __in __bits (6)X;
unsigned __in __bits (6)Y;
unsigned __out __bits(1)OUT;
void main()
{
unsigned a = X;
unsigned b = Y;
int res=0;
int sc=0;
int res1=0;
a = ~(a ^ b);
while (a && sc<3)
{
if (a & 1) res++;
a >>= 1;
sc++;
}
while(a)
{
if (a & 1) res1++;
a >>= 1;
}
if((res==3) || (res1==3)) OUT=1;
else OUT=0;
}
|
09.02.2015 15:44:25
Тема: Re:С-компилятор для TCPU
|
Павел Голуб
Темы: 5
Сообщений: 120
Мой профиль
|
Странная ситуация с winter компиляторами.
На dl tcpu не компилирует вообще ничего даже файл с одной строкой nop. Генерация asm из C компилятора содержит подчеркивание и странную функцию func_0 после неиспольуземой метки virtual_table. И если ее убрать hex файлы слетают по времени.
|
16.02.2015 06:19:34
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Игорь Викторович исправил ошибку - уже можно работать.
|
30.09.2021 15:11:01
Тема: Re:С-компилятор для TCPU
|
Владислав Свиридков
Темы: 2
Сообщений: 36
Мой профиль
|
Архитектура вычислительных систем (ПО4/ИТ3/ПИ2) - 2021
Экзамен\Контроль практики\Проектирование\3\Hex-программы для TCPU\2 - "Количество букв 'a'" (53124)
http://dl.gsu.by/task.jsp?nid=2032477&cid=1230
void main()
{
int i = _R1;
int ans = 0;
while(_Data[i]!='*') {
if(_Data[i]=='a') {
ans++;
}
i++;
}
_A = ans;
}
Я перепроверял через дамп памяти (вводил вручную, возможно мог ошибиться) тесты, они выполняются правильно (правильный ответ). При подключении тестов и их проверке автоматически выдается сообщение в report.txt:
[1]: Тест не прошел: $TCPU.Register.A hex: 02.
[2]: Тест не прошел: $TCPU.Register.A hex: 03.
[3]: Тест не прошел: $TCPU.Register.A hex: 04.
[4]: Тест прошел.
[5]: Тест прошел.
И в конце (когда по идеи должно было завершится выполнение тестов) у меня остается на экране синяя стрелка дебагера с возможностью нажать F7 и продолжить выполнение программы.
|
30.09.2021 15:20:25
Тема: Re:С-компилятор для TCPU
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
А такое решение прошло
void main(){
int i, j = _R1;
int h = 0;
for (i = 0;; i++)
{
int c = _Data[j++];
if (c == 'a') h++;
if (c == '*') break;
}
_A = h;
}
+ Ермоленко Вячеслав (1 / 1) Архитектура вычислительных систем (ПО4/ИТ3) - 2020 2020-12-17 16:02:06 1 / 1 Все тесты пройдены (нет секретного) КоличествоБуквА.tc DelTA3 at NIT0
|
30.09.2021 15:51:39
Тема: Re:С-компилятор для TCPU
|
Владислав Свиридков
Темы: 2
Сообщений: 36
Мой профиль
|
Ответ нашел опытным путём с помощью решение, которое прошло.
while (1) {
// ...
if (_Data[j]=='*') {
break;
}
// ...
}
while (_Data[j]!='*')
Такие варианты на первый взгляд подходят для решения задачи, но нет, с ними не проходит. Оказывается что они зацикливаются, хотя и в первом и во втором случае есть операторы выхода и условия на выход и по условию гарантируется, что они выполняться.
У меня другое понимание того что такое зацикливание.
Так же, если я правильно понял на примерах нескольких программ, у TCPU очень плохое обращение с массивом _Data. Если нам потребуется несколько раз обратится к какой-то ячейке памяти (получить ее содержимое), то нельзя просто так сделать это (по крайней мере у меня на примерах не работало), надо обязательно объявлять новую переменную, в неё присваивать значение из интересующей нас ячейки и с ней уже работать (возможно ошибаюсь, но пока в теории я этого момента не нашел).
По идет я здесь про эту проблему должен был узнать, но там про это ничего не написано.
Единственное что я пока что нашел, это:
Обращение к массивам можно использовать только в операторах простого присваивания.
Организация и функционирование ЭВМ\Учебный процессор TCPU (Автор - Кадетов Юрий)\Си для TCPU\
Возможно это и есть ответ на мою проблему, но я думаю что операция взятие значение легче должна реализоваться, чем операция присваивания (как по мне это даже почти одно и тоже).
|
01.10.2021 10:58:49
Тема: Re:С-компилятор для TCPU
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Пример из документации:
int c = _Data[j++];
if (c == '*') break;
Значит нельзя обращаться на прямую к памяти в операциях сравнения. Предварительно значение из памяти нужно записать в переменную.
Это связано с ограниченными возможностями адресации в TCPU.
|
|