Перейти к содержанию
    

Посмотрел "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!"; ) - д/б выделение и инициализация памяти, пока игноируется.

Изменено пользователем Leka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример "a2h.c" с печатью секции ".REG" - начальные значения регистров, в тч адреса массивов. Там-же вариант разворачивания "sti" в 2 команды: "movi" и "st".

a2h.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для примера переопределил "bz", "bnz", "neg", "com",

и исправил "ALxx" - чтобы проще было определять инструкции с константами.

a2h.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

To Leka: А что делать с секцией ".REG"?

Надо прописывать в регистровый файл?

 

Николай.

 

P.S.

Понял, надо.

 

Изменено пользователем Ynicky

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал отмоделировать программу "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;}

 

Николай.

Изменено пользователем Omen_13
Оформление кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поправил "a2" и "a2h.c" (помимо "#define REG" поменял также "#define STR" - это потом может пригодиться, для работы со строками, после определения "#define CHR").

 

Не ту версию прикрепил, поправил.

A2.2.zip

Изменено пользователем Leka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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".

 

Николай.

Изменено пользователем Omen_13
Оформление кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В "a2h.c" "#define ST(a,b )..." надо исправить на "#define ST(b,a)...".

Изменено пользователем Leka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В "a2h.c" "#define ST(a,b )..." надо исправить на "#define ST(b,a)...".

Исправил, заработало, проверяю дальше.

 

Николай.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Промоделировал "queens".

Результаты совпадают с "q.c".

Указатели в "q2.c" изменяются на 1, в то время как у меня в процессоре байтовая адресация,

т.е. указатели должны меняться на 4. Временно сдвинул адрес в процессоре на 2 разряда вправо

и все заработало.

2 Leka: Что нужно (или можно) посмотреть по результатам моделирования?

И еще, для чего в программе "q2.c" мы обращаемся к памяти через указатели?

Почему нельзя обойтись только регистрами?

 

Ошибок в процессоре больше пока не обнаружил.

 

Николай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Указатели в "q2.c" изменяются на 1, в то время как у меня в процессоре байтовая адресация, т.е. указатели должны меняться на 4.

Это общая проблема арифметики указателей.

По стандарту на Си, в "q2.c" все правильно, тк это компилятор должен делать поправку на тип данных (у меня не делает). Варианты выхода из этого положения:

1) добавить в компилятор полную поддержку типов, как в Си,

2) использовать в SoC раздельную память для байтов/слов,

3) ...

Сам использовал 2-ой вариант, тк SoC под конкретную задачу, и память разбивается на отдельные блоки нужного размера, и с нужной разрядностью(и не обязательно кратной 8).

А 1-ый вариант в одиночку делать не буду, тк предпочитаю бестиповые языки/архитектуры, и индексную адресацию.

 

Что нужно (или можно) посмотреть по результатам моделирования?

Не понял.

 

И еще, для чего в программе "q2.c" мы обращаемся к памяти через указатели? Почему нельзя обойтись только регистрами?

В программе используются массивы, обращаться к элементам массива можно либо при помощи индексной адресации, либо через указатели. Как еще? Если процессор поддерживает косвенную адресацию регистрового файла, все-равно на Си это будет либо индексная адресация, либо указатели.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например, код на Си:

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*)".

Стоит овчинка выделки?

Изменено пользователем Omen_13
Оформление кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:bb-offtopic:

Между первым э/м реле: http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BB%D0%B5

и первой вычислительной машиной на них: http://ru.wikipedia.org/wiki/Z3

>100 лет... Что мешало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

очень интересный пример!

 

для уточнения - при симуляции надо использовать rf32sim_TB_runtest.do , правильно ?

 

и несколько для ленивых - есть ли описание signal names, что бы проследить исполнение src\prg.txt ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...