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

Темы: 1982
Сообщений: 47186

Мой профиль


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

Я пишу программу на С, компилирую, получаю в той же директории файл .asm, переименовываю его в .tcpu, открываю его в Winter TCPU Asm, но он даже не компилируется. Ругается на unknown character. Что я делаю не так? 

Я думаю, ты все делаешь правильно. Проблема в некорректной генерации АСМ-программы из С-компилятора.
Надеюсь, Игорь Викторович исправит ее. Но это когда будет.
Ты просто сам исправь (там что-то типа символ "_" нельзя использовать).
Это вполне реально.

Михаил Пасенко

Темы: 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;
}


Выдает ошибку чекера "Кгтешьу уккщк"
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль
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
Игорь Коршунов

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

Мой профиль


Михаил Пасенко:

\Индивидуальные задания\Программирование микроконтроллеров\Битовая обработка\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.
 
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль


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


Сергей Семенцов:

Вот исходник:

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 не поддерживаются. 
Игорь Коршунов

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

Мой профиль
Условие задачи:
Найти произведение двух чисел. Ограничение исходного кода - 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;
}

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

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

Мой профиль
Почему неправильно работает программа:

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.
Павел Окрут

Темы: 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;
}
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль


Павел Окрут:

в задаче (Экзамен\Индивидуальные задания\С-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;
}

Павел Голуб

Темы: 5
Сообщений: 120

Мой профиль
Странная ситуация с winter компиляторами.
На dl tcpu не компилирует вообще ничего даже файл с одной строкой nop. Генерация asm из C компилятора содержит подчеркивание и странную функцию func_0 после неиспольуземой метки virtual_table. И если ее убрать hex файлы слетают по времени.
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль
Игорь Викторович исправил ошибку - уже можно работать.
Владислав Свиридков

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

Мой профиль
Архитектура вычислительных систем (ПО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 и продолжить выполнение программы.
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль
А такое решение прошло

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
Владислав Свиридков

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

Мой профиль
Ответ нашел опытным путём с помощью решение, которое прошло.

while (1) {
    // ...
    if (_Data[j]=='*') {
        break;
    }
    // ...
}

while (_Data[j]!='*')


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

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

Обращение к массивам можно использовать только в операторах простого присваивания.
 

Организация и функционирование ЭВМ\Учебный процессор TCPU (Автор - Кадетов Юрий)\Си для TCPU\
Возможно это и есть ответ на мою проблему, но я думаю что операция взятие значение легче должна реализоваться, чем операция присваивания (как по мне это даже почти одно и тоже).
Игорь Коршунов

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

Мой профиль
Пример из документации:

		int c = _Data[j++];
		if (c == '*') break;

Значит нельзя обращаться на прямую к памяти в операциях сравнения. Предварительно значение из памяти нужно записать в переменную.
Это связано с ограниченными возможностями адресации в TCPU.
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3
Time:0,091