OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů

OldCompPrty 8

Právě je 10.08.2022, 06:18

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 227 ]  Přejít na stránku Předchozí  1 ... 12, 13, 14, 15, 16
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 05.08.2022, 04:08 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 756
Has thanked: 64 times
Been thanked: 128 times
To ale fakt neni vsechno... Protoze kdyz jsem ten program psal poprve tak muj main vypadal takto
Kód:
int main()
{   
   char str[] = "The five boxing wizards jump quickly.";
      pangram(str);
   return 0;
}

A sdcc me vygenerovalo ten retezec na zasobnik! Dokonce se pokousel o nejakou chabou optimalizaci prvnich znaku, aby pak vygeneroval neco jako
Kód:
ld hl, offset
add hl,de        ; v de si drzi pocatek retezce, ktera je aktualnim stavem zasobniku, protoze si ho posunul o delku retezce.
ld (hl), znak

Viz cast vlevo na obrazku
Příloha:
Snímek obrazovky_2022-08-04_16-52-01_no_stack_string.png
Snímek obrazovky_2022-08-04_16-52-01_no_stack_string.png [ 591.29 KiB | Zobrazeno 73 krát ]

Teprve az jsem zmenil retezec na char * str = "The..." tak me pri kompilaci zacal rvat

Pangram.c(76) : warning 196: pointer target lost const qualifier

Zato strcil retezec spravne mimo zasobnik. Viz ta cast vpravo. Jak jsem dlouho nedelal v cecku, tak se me to za tech 5 let myti nadobi v restauraci pro 400 lidi s Portugalci, nasledne s tvrdsimi Polaky, nasledne s jeste odolnejsimi Rumuny a nakonec s Indama, kdy jsem to uz vzdal ja a sel myt jinam, docela vyparilo. .)
Gcc me nic nerikalo, ale taky jsem se nedival co to generuje...

Kdyz uz to ale rve na zasobnik, pro tak komplikovane? Snizit si SP a pak to strkat nad nej. Proc nepouzit PUSH??? Mohl to udela nejak takto
Kód:
_main::
   push ix
   ld   ix, #0
   add  ix, sp
;Pangram.c:23: char str[] = "The five boxing wizards jump quickly.";
   ld   bc, 256*0x0 + '.'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'y' + 'l'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'k' + 'c'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'i' + 'u'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'q' + ' '    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'p' + 'm'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'u' + 'j'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*' ' + 's'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'d' + 'r'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'a' + 'z'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'i' + 'w'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*' ' + 'g'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'n' + 'i'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'x' + 'o'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'b' + ' '    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'e' + 'v'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'i' + 'f'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*' ' + 'e'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT
   push bc
   ld   bc, 256*'h' + 'T'    ; reverse -0.-yl-kc-iu-q -pm-uj- s-dr-az-iw- g-ni-xo-b -ev-if- e-hT

;Pangram.c:25: printf("%i", pangram(str));
   ld   hl, 0x0000
   add  hl, sp
   call _pangram             ; hl = *str
   ld   bc, #___str_1+0
   push   hl
   push   bc
   call   _printf
   pop   af
   pop   af
;Pangram.c:31: return 0;
   ld   hl, #0x0000
;Pangram.c:32: }
   ld   sp, ix              ; The original stack before allocating the text string to the stack.
   pop  ix
   ret
___str_1:
   .ascii "%i"
   .db 0x00
   .area _CODE
   .area _INITIALIZER
   .area _CABS (ABS)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 05.08.2022, 04:32 
Offline
Profík

Registrován: 23.06.2013, 23:49
Příspěvky: 756
Has thanked: 64 times
Been thanked: 128 times
Posledni spam pro dnesni noc.
Kdyz jsem se metodou pokus omyl naucil psat v sdcc vkladany asembler a napsal si sam funkci pro tisk cisla. Protoze kdyz jsem pouzl printf tak se restartoval ZX Spectrum, jsem se dobral vysledku.
Kód:
System                     Forth / C                         Benchmark                     Time (sec/round)
ZX Spectrum Fuse 1.5.7 Ubuntu   M4_FORTH                     Pangram do loop               52.04s   
ZX Spectrum Fuse 1.5.7 Ubuntu   M4_FORTH                     Pangram begin bitset repeat   32.26s   
ZX Spectrum Fuse 1.5.7 Ubuntu   M4_FORTH _TYP_DOUBLE:fast    Pangram begin bitset repeat   27.58s   
ZX Spectrum Fuse 1.5.7 Ubuntu   sdcc 3.8.0 #10562 (Linux)    Pangram                       2m 51.61s

Pokud se to provede 10000x plus jedenkrat navic s vypsanim vysledku -1 nebo 1 pro C.
Forth je 5x nebo 6x rychlejsi s BITSETem.
Je i kratsi, ale to uz ne o tolik.
Cecko ma 338 bajtu s moji pomocnou rutinou pro tisk cisla, ktera je mozna komplikovanejsi jak ten pangram. 3381 bajtu kdyz napisi printf("%i",...)
bitset inline ma 250 bajtu
bitset ma 256 bajtu, je to delsi nez inline varianta protoze se ta funkce volala jen z jednoho mista, takze se nic neusetrilo.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 227 ]  Přejít na stránku Předchozí  1 ... 12, 13, 14, 15, 16

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz