|
|
  |
Pascal для AVR |
|
|
|
Dec 14 2008, 10:57
|
Профессионал
    
Группа: Участник
Сообщений: 1 075
Регистрация: 30-09-05
Пользователь №: 9 118

|
' count=' тут: Код $024B $E200 LDI R16, 32 $024C $930D ST X+, R16 $024D $E603 LDI R16, 99 $024E $930D ST X+, R16 $024F $E60F LDI R16, 111 $0250 $930D ST X+, R16 $0251 $E705 LDI R16, 117 $0252 $930D ST X+, R16 $0253 $E60E LDI R16, 110 $0254 $930D ST X+, R16 $0255 $E704 LDI R16, 116 $0256 $930D ST X+, R16 $0257 $E30D LDI R16, 61 $0258 $930D ST X+, R16
|
|
|
|
|
Dec 14 2008, 12:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Огурцов @ Dec 14 2008, 14:54)  Ну так что там на счет шляпы ? А чего это уже второй раз разговор о шляпах заводите? Скомпилили простейший исходник каким-то компилятором в мутный код, допустим, что он рабочий. Ну и? Добавтьте к своей коллекции паскалевских компиляторов еще один и положите на полочку.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 14 2008, 12:29
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Огурцов @ Dec 14 2008, 15:27)  Такжеж вы обвинили меня в подлоге. Ошибался  . Повторяю - получен некий мутный код. Вопрос причем тут шляпа? И где тут про подлог: Цитата Полагаю просто нажали "кнопочку" мышкй и получили "результат". Проблема только в том, что это не результат.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 14 2008, 13:47
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Такое впечатление, что оптимизация отсутсвует: Цитата ^NF.apas,55 :: arow[pos + 1] := arow[pos] or place; $0126 $E340 LDI R20, @_arow $0127 $E051 LDI R21, @@_arow $0128 $9020 012E LDS R2, _pos $012A $9030 012F LDS R3, _pos+1 $012C $E001 LDI R16, 1 $012D $2711 CLR R17 $012E $2C02 MOV R0, R2 $012F $2C13 MOV R1, R3 $0130 $0E00 ADD R0, R16 $0131 $1E11 ADC R1, R17 $0132 $0C00 LSL R0 $0133 $1C11 ROL R1 $0134 $2E44 MOV R4, R20 $0135 $2E55 MOV R5, R21 $0136 $0C40 ADD R4, R0 $0137 $1C51 ADC R5, R1 $0138 $2C02 MOV R0, R2 $0139 $2C13 MOV R1, R3 $013A $0C00 LSL R0 $013B $1C11 ROL R1 $013C $0E04 ADD R0, R20 $013D $1E15 ADC R1, R21 $013E $2DA0 MOV R26, R0 $013F $2DB1 MOV R27, R1 $0140 $902D LD R2, X+ $0141 $903D LD R3, X+ $0142 $9000 0232 LDS R0, _place $0144 $9010 0233 LDS R1, _place+1 $0146 $2802 OR R0, R2 $0147 $2813 OR R1, R3 $0148 $2DA4 MOV R26, R4 $0149 $2DB5 MOV R27, R5 $014A $920D ST X+, R0 $014B $921D ST X+, R1 - видно, что 2 раза делаются сложения и сдвиги для [pos] и [роs + 1], ни одного movw почему-то, хотя вроде собрано для 88 атмеги. Может что-то включить в настройках? На первый взгляд код ужасен.
|
|
|
|
|
Dec 14 2008, 13:47
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Кому не лень, компильните ферзей под IAR Отсюда - http://www.wasm.ru/forum/viewtopic.php?pid=128277#p128277 взял только функцию queens и внес небольшие косметические изменения Код unsigned int count = 0;
void queens(unsigned int N) { unsigned long arow[32], aleft[32], aright[32], aposs[32]; unsigned long poss, place, val = (1<<N)-1; unsigned char pos=1; arow[1]=aleft[1]=aright[1]=0; poss=aposs[1]=val>>(N/2); while(pos) { if(poss) { place = poss & -poss; poss &= ~place; if(pos==1 && !poss && (N & 1))count<<=1; if(pos!=N) { aposs[pos]=poss; poss=arow[pos+1]=arow[pos]|place; poss|=aleft[pos+1]=(aleft[pos]|place)<<1; poss|=aright[pos+1]=(aright[pos]|place)>>1; aposs[++pos]=poss=~(poss) & val; } else { ++count; } } else { poss=aposs[--pos]; } } } - результат в IAR AVR 5.11B Код Maximum stack usage in bytes:
Function CSTACK RSTACK -------- ------ ------ queens 526 4
Segment part sizes:
Function/Label Bytes -------------- ----- count 2 queens 506 Others 6
506 bytes in segment CODE 6 bytes in segment INITTAB 2 bytes in segment NEAR_Z 506 bytes of CODE memory (+ 6 bytes shared) 2 bytes of DATA memory Можем в симуляторе глянуть количество тактов. Выбирайте N
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Dec 14 2008, 13:59
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата можно просто на листинг посмотреть. Да там все в порядке  Ну можно конечно немного более оптимально написать, но это не ко мне  Конечно, если ограничиться 15ю ферзями, то будет заметно короче (вместо long - short), и быстрее Код Maximum stack usage in bytes:
Function CSTACK RSTACK -------- ------ ------ queens 258 4
Segment part sizes:
Function/Label Bytes -------------- ----- count 2 queens 316 Others 6
316 bytes in segment CODE 6 bytes in segment INITTAB 2 bytes in segment NEAR_Z 316 bytes of CODE memory (+ 6 bytes shared) 2 bytes of DATA memory Листинги в аттаче
lst.txt ( 12.74 килобайт )
Кол-во скачиваний: 238
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Dec 14 2008, 14:23
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Ну так уж и быть. Оптимально было бы накодить нечто такое Код typedef unsigned char UREG; typedef unsigned long QV; typedef struct { QV arow; QV aleft; QV aright; QV aposs; }QA;
unsigned int queens(unsigned int N, unsigned int count) { QA a[32]; QV poss, place, val = (1<<N)-1; UREG pos=1; a[1].arow=a[1].aleft=a[1].aright=0; poss=a[1].aposs=val>>(N/2); while(pos) { QA *p=a+pos; if(poss) { place = poss & -poss; poss &= ~place; if(pos==1 && !poss && (N & 1))count<<=1; if(pos!=N) { p[0].aposs=poss; poss=p[1].arow=p[0].arow|place; poss|=p[1].aleft=(p[0].aleft|place)<<1; poss|=p[1].aright=(p[0].aright|place)>>1; p[1].aposs=poss=~(poss) & val; pos++; } else { ++count; } } else { poss=p[-1].aposs; pos--; } } return count; } Код Maximum stack usage in bytes:
Function CSTACK RSTACK -------- ------ ------ queens 524 4
Segment part sizes:
Function/Label Bytes -------------- ----- queens 434
434 bytes in segment CODE 434 bytes of CODE memory
Errors: none Warnings: none Листинг в аттаче
lst2.txt ( 6.76 килобайт )
Кол-во скачиваний: 134
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|