Mix
Random mix of pages and files
FORTH_doc_02
2025.04.29 13:20:23 end SW FORTH Gilhad

FORTH_doc_02

Velikost typů

  • CELL 16bit
  • DOUBLE 32bit
  • Pointer je 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?
; 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)