.. vim: noexpandtab fileencoding=utf-8 nomodified wrap textwidth=0 foldmethod=marker foldmarker={{{,}}} foldcolumn=4 ruler showcmd lcs=tab\:|- list tabstop=8 noexpandtab nosmarttab softtabstop=0 shiftwidth=0 linebreak showbreak=»\ ft=rst :date: 2025.04.29 13:20:23 :_modified: 1970.01.01 00:00:00 :tags: SW,FORTH :authors: Gilhad :summary: FORTH_doc_02 :title: FORTH_doc_02 :nice_title: |logo| %title% |logo| %HEADER% FORTH_doc_02 -------------------------------------------------------------------------------- Velikost typů ================================================================================ * **CELL** 16bit * **DOUBLE** 32bit * Pointer je :strike:`16bit, nebo` DOUBLE, pak nižší 2 byte někam ukazují, 3. byte říká kam (0x80 = RAM) a 4. je nula * ukládání v paměti - nižší řády níž => byte b[]= 0x12345678 => b[0]=0x78; b[1]=0x56; b[2]=0x23; b[3]=0x12; => b: .byte 0x78 0x56 0x34 0x12 * na zásobníku taky 0x12345678 => push(0x12); push(0x34); push(0x56); push(0x78) => forth> 0x12345678 ~ forth> 0x12 0x34 0x56 0x78 * prostě je to normálně jako na 8086 **little endian** * oba zásobníky rostou zhora dolů, ukazují **na** poslední hodnotu v zásobníku. Počáteční adresa je tedy 0x0100. push(x): \*(--SP)=x; pop: return \*(SP++) * Adresa funkce a __memx u AVR: * pokud mam navesti ve strojaku `w_test_data` a v *.c ho mam jako `extern const __memx char w_test_data;` a nactu ho do `const __memx InstrPoint_t *IP;` `IP=(const __memx void*)&w_test_data;` tak se nacte jako hodnota (např.) `0x0001A3`. * Zatimco funkce `void f_docol(void)` se nacte `IP=(const __memx void*)&f_docol` jako hodnota `0x8002CE` * Hlavni rozdil je, ze data smeruji spravne do FLASH, zatimco f_docol smeruje nespravne do RAM - proc je tomu tak a jak to udelat lip? .. code:: ; normalni funkce ldi r24,lo8(gs(f_docol)) ldi r25,hi8(gs(f_docol)) ldi r26,lo8(-128) ; z asm.S ldi r24,lo8(w_test_data) ldi r25,hi8(w_test_data) ldi r26,hlo8(w_test_data)