Ynicky 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба Надеюсь, кое-какая польза все-таки была извлечена из этого проекта. Для меня - да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 20 июня, 2010 Опубликовано 20 июня, 2010 (изменено) · Жалоба Посмотрел "a2h.c" и "aaa.txt". Тк в системе команд rf32 нет "sti", то либо предварительно загружать константы в определенный регистр(например R0), либо все константы загружать в регистры в начале программы. Например, по второму способу надо изменить "INT(a,b )" (объявление константы) в "a2h.c": #define INT(a,b) i[a]=1; v[a]=b; AL2(mov,movi,a,a) STR("") и "ST(a,b )": #define ST(a,b) AL2R(st,a,b) в этом случае определять код sti не нужно. Аналогично можно менять/добавлять другие команды. "INT(a,b )" - объявление константы (int n=1; ), м/б код записи в регистр. "ARR(a,b )" - объявление массива (int arow[20]; ) - д/б выделение памяти, пока игноируется. Д/б код типа "heap+=b; v[a]=heap;" "CHR(a,b )" - объявление строковой константы (int s="hello,world!"; ) - д/б выделение и инициализация памяти, пока игноируется. Изменено 20 июня, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба Пример "a2h.c" с печатью секции ".REG" - начальные значения регистров, в тч адреса массивов. Там-же вариант разворачивания "sti" в 2 команды: "movi" и "st". a2h.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба Для примера переопределил "bz", "bnz", "neg", "com", и исправил "ALxx" - чтобы проще было определять инструкции с константами. a2h.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 21 июня, 2010 Опубликовано 21 июня, 2010 (изменено) · Жалоба To Leka: А что делать с секцией ".REG"? Надо прописывать в регистровый файл? Николай. P.S. Понял, надо. Изменено 21 июня, 2010 пользователем Ynicky Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 23 июня, 2010 Опубликовано 23 июня, 2010 (изменено) · Жалоба Попробовал отмоделировать программу "queens". Работает не правильно. Тогда стал писать тесты. Сразу обнаружил следующее: tst_rr() { int iA = 1; int iB = 2; iB = iA; } => .REG 000:00000000 001:00000001 002:00000002 .CODE 000001:45002001 ;iB=iA; //формат RI вместо RR!!! 000002:12000000 ;} Но если переменную iA не инициализировать, то все нормально: tst_rr() { int iA; int iB = 2; iB = iA; } => .REG 000:00000000 001:00000000 002:00000002 .CODE 000001:25002001;iB=iA; //!!! 000002:12000000;} Николай. Изменено 18 июля, 2010 пользователем Omen_13 Оформление кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 23 июня, 2010 Опубликовано 23 июня, 2010 (изменено) · Жалоба Поправил "a2" и "a2h.c" (помимо "#define REG" поменял также "#define STR" - это потом может пригодиться, для работы со строками, после определения "#define CHR"). Не ту версию прикрепил, поправил. A2.2.zip Изменено 23 июня, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 27 июня, 2010 Опубликовано 27 июня, 2010 (изменено) · Жалоба tst_ptr() { int *ptr1; int *ptr2; int iA,iB; *ptr1 = 0xA; *ptr2 = 0xB; iA = *ptr1; iB = *ptr2; } => .REG 000:00000000 001:00000000 002:00000000 003:00000000 004:00000000 005:0000000A 006:0000000B .CODE 000001:4500000A ; 000002:66001000 ;*ptr1=0xA; 000003:4500000B ; 000004:66002000 ;*ptr2=0xB; 000005:62003001 ;iA=*ptr1; 000006:62004002 ;iB=*ptr2; 000007:12000000 ;} Помоему, в командах "STORE" (опкод 66) перепутаны местами RD и (RS). У меня в системе команд RD и (RS) находятся в одном и том же месте для формата "LOAD/STORE". Николай. Изменено 18 июля, 2010 пользователем Omen_13 Оформление кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 28 июня, 2010 Опубликовано 28 июня, 2010 (изменено) · Жалоба В "a2h.c" "#define ST(a,b )..." надо исправить на "#define ST(b,a)...". Изменено 28 июня, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 29 июня, 2010 Опубликовано 29 июня, 2010 · Жалоба В "a2h.c" "#define ST(a,b )..." надо исправить на "#define ST(b,a)...". Исправил, заработало, проверяю дальше. Николай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 3 июля, 2010 Опубликовано 3 июля, 2010 · Жалоба Промоделировал "queens". Результаты совпадают с "q.c". Указатели в "q2.c" изменяются на 1, в то время как у меня в процессоре байтовая адресация, т.е. указатели должны меняться на 4. Временно сдвинул адрес в процессоре на 2 разряда вправо и все заработало. 2 Leka: Что нужно (или можно) посмотреть по результатам моделирования? И еще, для чего в программе "q2.c" мы обращаемся к памяти через указатели? Почему нельзя обойтись только регистрами? Ошибок в процессоре больше пока не обнаружил. Николай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 5 июля, 2010 Опубликовано 5 июля, 2010 · Жалоба Указатели в "q2.c" изменяются на 1, в то время как у меня в процессоре байтовая адресация, т.е. указатели должны меняться на 4. Это общая проблема арифметики указателей. По стандарту на Си, в "q2.c" все правильно, тк это компилятор должен делать поправку на тип данных (у меня не делает). Варианты выхода из этого положения: 1) добавить в компилятор полную поддержку типов, как в Си, 2) использовать в SoC раздельную память для байтов/слов, 3) ... Сам использовал 2-ой вариант, тк SoC под конкретную задачу, и память разбивается на отдельные блоки нужного размера, и с нужной разрядностью(и не обязательно кратной 8). А 1-ый вариант в одиночку делать не буду, тк предпочитаю бестиповые языки/архитектуры, и индексную адресацию. Что нужно (или можно) посмотреть по результатам моделирования? Не понял. И еще, для чего в программе "q2.c" мы обращаемся к памяти через указатели? Почему нельзя обойтись только регистрами? В программе используются массивы, обращаться к элементам массива можно либо при помощи индексной адресации, либо через указатели. Как еще? Если процессор поддерживает косвенную адресацию регистрового файла, все-равно на Си это будет либо индексная адресация, либо указатели. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 6 июля, 2010 Опубликовано 6 июля, 2010 (изменено) · Жалоба Например, код на Си: int *a, i; ... a+=i; *a=i; ... и эквивалентный код на "ассемблерном" Си для 2х-операндной 32х-разрядной архитектуры: int a, i, tmp; ... tmp=i; tmp<<=2; a+=tmp; *(int*)a=i; ... --> имхо, громоздко, неэффективно, и непереносимо на другую разрядность/архитектуру. Поэтому и нравятся бестиповые языки/архитектуры. И с индексной адресацией. Пример N-ферзей с явной арифметикой указателей: int n,count; queens(){ int arow[20], aleft[20], aright[20], aposs[20], poss, place, val, pos, pos1, n1, temp, temp1, prow, pleft, pright, pposs, prow1, pleft1, pright1, pposs1; count = 0; n1 = n; n1 &= 1; val = 1; val <<= n; val -= 1; temp = n; temp >>= 1; poss = val; poss >>= temp; pos = 1; prow = arow; prow += 4; pleft = aleft; pleft += 4; pright = aright; pright += 4; pposs = aposs; pposs += 4; prow1 = prow; prow1 += 4; pleft1 = pleft; pleft1 += 4; pright1 = pright; pright1 += 4; pposs1 = pposs; pposs1 += 4; *(int*)prow = 0; *(int*)pleft = 0; *(int*)pright = 0; *(int*)pposs = poss; do if( poss ){ temp = poss; temp = - temp; //0-temp; place = poss; place &= temp; temp = place; temp = ~temp; //^=-1; poss &= temp; if( pos == n1 ) if( ! poss ) count <<= 1; if( pos != n ){ *(int*)pposs = poss; temp = *(int*)prow; temp |= place; *(int*)prow1 = temp; temp = *(int*)pleft; temp |= place; temp <<= 1; *(int*)pleft1 = temp; temp = *(int*)pright; temp |= place; temp >>= 1; *(int*)pright1 = temp; temp = *(int*)prow1; temp1 = *(int*)pleft1; temp |= temp1; temp1 = *(int*)pright1; temp |= temp1; temp ^= -1; temp &= val; poss = temp; pos += 1; prow += 4; pleft += 4; pright += 4; pposs += 4; prow1 += 4; pleft1 += 4; pright1 += 4; pposs1 += 4; }else count += 1; }else{ pos -= 1; prow -= 4; pleft -= 4; pright -= 4; pposs -= 4; prow1 -= 4; pleft1 -= 4; pright1 -= 4; pposs1 -= 4; poss = *(int*)pposs; } while( pos ); if( ! n1 ) count <<= 1; } main(){ do{ queens(); printf("queens(%d)=%d\n",n,count); n = n + 1; }while( n < 15 ); } Чтобы такое можно было компилировать в hex-файл, надо слегка поправить компилятор: 1) убрать возможность объявления указателей "int*", 2) заменить в выражениях "*" на "*(int*)". Стоит овчинка выделки? Изменено 18 июля, 2010 пользователем Omen_13 Оформление кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 1 октября, 2010 Опубликовано 1 октября, 2010 · Жалоба :bb-offtopic: Между первым э/м реле: http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BB%D0%B5 и первой вычислительной машиной на них: http://ru.wikipedia.org/wiki/Z3 >100 лет... Что мешало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DevL 0 25 октября, 2010 Опубликовано 25 октября, 2010 · Жалоба очень интересный пример! для уточнения - при симуляции надо использовать rf32sim_TB_runtest.do , правильно ? и несколько для ленивых - есть ли описание signal names, что бы проследить исполнение src\prg.txt ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться