Co to za instrukcja - dw $ffff (AVR asm)?

mam taki ciag instrukcji w asmie:

[...] OUT SPMCR, R17 SPM .dw $ffff NOP RET

i nie kumam co to za instrukcja o kodzie $ffff? co to w ogole tu robi?

ps. gdzie na sieci mozna znalezc informacje o tym jaki kod (hex) ma dana instrukcja?

Reply to
Q
Loading thread data ...

Zapewne tutaj:

formatting link
Pozdrawiam

Reply to
Marcin Stanisz

To nie jest instrukcja tylko dyrektywa asemblera. Chyba najlepiej szukać w jakimś helpie do kompilatora bo dyrektywy mogą się różnić od siebie między kompilatorami.

Reply to
r_dziurek

Q snipped-for-privacy@gazeta.gov.pl> napisał(a):

Zdaje mi się ,że "zdisassemblowałeś" jakiś HEX lub BIN :) Jeśli tak , to co masz powyżej i poniżej .dw $ffff to też nie muszą być instrukcje tylko dane.Żeby się o tym przekonać to trzeba troszku poruszać głową bo inaczej nici ze źródełka :-)

Reply to
Piotrek Sz.
Reply to
Rafal Baranowski

a nie jest to definicja DefineWord? czyli umeisc w pameici programu stala? do ktorej sie potem odwolujesz? byc moze to co zdisassemblerowales to byl obszar danych, np jakas tablica..i niektre dane ci rozpoznal jako instrukcje, ktore raczej sensu nei beda maily razem..a czesc jako .DW niestety, tutaj na to madrych dekompilatorow nie ma chyba.trzeba usiasc i zaczac myslec jak procek trawiac slowo rozkaz po rozkazie..:) albo wrzucic na symulator, ale wraz trzeba myslec:)

Reply to
greg
Reply to
invalid unparseable
Reply to
Rafal Baranowski

dzieki :)

Reply to
Q

wiem, ze to nie jest wprost instrukcja; na me oko to po prostu wsadzenie slowa 0xFFFF w kod;

tyle, ze jak, czemu, i dlaczego dziala? :)

Reply to
Q

najpierw myślałem, że to samo co NOP (po ustawieniu bitu SPMEN, program ma 4 cykle na wywołanie instrukcji SPM i możliwe, że w ten sposób Atmel się zabezpiecza przed katastrofą, jeśli program pójdzie w maliny), ale potem znalazłem wzmiankę, że Atmel zaleca to ze względu na pipelining. pewnie łatwiej by było, gdybyś podał skąd wziąłeś ten plik.

w.

Reply to
Wojtek Kaniewski

Pewnie znalazłeś to w swoim kodzie w wyniku doczepienia standardowego (w WinAVR) pliku nagłówkowego boot.h i wykorzystania tamtejszych funkcji. Z punktu widzenia boot.h cytat wygląda następująco (przykładowy kod funkcji kasowania strony pamięci programu):

#define __boot_page_erase_alternate(address) \ ({ \ boot_spm_busy_wait(); \ eeprom_busy_wait(); \ __asm__ __volatile__ \ ( \ "movw r30, %2\n\t" \ "sts %0, %1\n\t" \ "spm\n\t" \ ".word 0xffff\n\t" \ "nop\n\t" \ : "=m" (__SPM_REG) \ : "r" ((uint8_t)__BOOT_PAGE_ERASE), \ "r" ((uint16_t)address) \ : "r30", "r31" \ ); \ })

Tutaj właśnie występuje ten magiczny rozkaz FFFF. Wersje funkcji z "alternate" w nazwie wykorzystywane są przy kompilacji dla procesorów ATmega161/163/323:

"Alternate versions of the macros use 16-bit addresses and require special instruction sequences after SPM."

A dokładną receptę na te zawiłości przytacza sam Atmel, w PDFie do ATmegi 323, strona 180:

"To ensure proper instruction pipelining after programming action (Page Erase, Page Write, or Lock bit write), the SPM instruction must be followed with the sequence (.dw $FFFF - NOP) as shown below: spm .dw $FFFF nop If not, the instruction following SPM might fail. It is not necessary to add this sequence when the SPM instruction only loads the temporary buffer.

Teraz już chyba wszystko jasne.

Reply to
Adam Dybkowski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.