Jak jste si asi mohli vsimnout v zdrojovem kodu programu pro vypocet faktorialu, jsem zadaval hodnoty pro vstupni promenne jako konstanty. Ale nektere z nich se v prubehu vypoctu prepisovali. Takze pri opakovanem spusteni uz to bude pocitat neco jineho.
Kód:
CREATE(_a)
PUSH(100) COMMA
PUSH(256-2) ALLOT
Jak to teda zadat s inicializaci na hodnotu?
Slo by to pres COMMA
Kód:
CREATE(_a)
PUSH(100) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
PUSH(0) COMMA
Ale to neni to co by chtel programator delat...
Takze jak zadavat snadno hodnotu?
Udelal jsem prvne slovo HEXPUSH_COMMA(hex_string)
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Nova_testovaci$ ../check_word.sh 'HEXPUSH_COMMA(0xffeeddccbbaa99887766554433221100)'
push HL ; 1:11 0x1100 , 0x3322 , ... 0xffee , default version
ld HL, 0x1100 ; 3:10 0x1100 ,
ld (VARIABLE_SECTION),HL; 3:16 0x1100 ,
ld HL, 0x3322 ; 3:10 0x3322 ,
ld (VARIABLE_SECTION+2),HL; 3:16 0x3322 ,
ld HL, 0x5544 ; 3:10 0x5544 ,
ld (VARIABLE_SECTION+4),HL; 3:16 0x5544 ,
ld HL, 0x7766 ; 3:10 0x7766 ,
ld (VARIABLE_SECTION+6),HL; 3:16 0x7766 ,
ld HL, 0x9988 ; 3:10 0x9988 ,
ld (VARIABLE_SECTION+8),HL; 3:16 0x9988 ,
ld HL, 0xBBAA ; 3:10 0xbbaa ,
ld (VARIABLE_SECTION+10),HL; 3:16 0xbbaa ,
ld HL, 0xDDCC ; 3:10 0xddcc ,
ld (VARIABLE_SECTION+12),HL; 3:16 0xddcc ,
ld HL, 0xFFEE ; 3:10 0xffee ,
ld (VARIABLE_SECTION+14),HL; 3:16 0xffee ,
pop HL ; 1:10 0x1100 , 0x3322 , ... 0xffee ,
;[50:229] 0x1100 , 0x3322 , ... 0xffee ,
VARIABLE_SECTION:
dw 0x1100
dw 0x3322
dw 0x5544
dw 0x7766
dw 0x9988
dw 0xbbaa
dw 0xddcc
dw 0xffee
;[50:229]
Ktere v podstate jen zjisti zda retezec zacina "0x" a pokud ano tak to odstrani a pak postupne rekurzivne od konce odsekava 2 bajty a vytvari token pro PUSH_COMMA. A tokenove pravidla pak PUSH_COMMA() retezi do PUSHS_COMMA(). Viz jak jsem si hral s tim obrazkem.
Pak jsem mirne upravil slovo HEXPUSH_COMMA(hex_string) na PHEXPUSH_COMMA(bajtu,hex_string), ktery navic doplni pocatecni nuly, aby data zabirala presne pocte bajtu co mu zadame.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Nova_testovaci$ ../check_word.sh 'PHEXPUSH_COMMA(256,0x64)'
push HL ; 1:11 0x0064 , 0x0000 , ... 0x0000 , default version
ld HL, 0x0000 ; 3:10 0x0000 ,
ld (VARIABLE_SECTION+2),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+4),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+6),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+8),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+10),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+12),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+14),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+16),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+18),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+20),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+22),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+24),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+26),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+28),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+30),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+32),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+34),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+36),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+38),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+40),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+42),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+44),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+46),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+48),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+50),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+52),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+54),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+56),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+58),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+60),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+62),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+64),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+66),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+68),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+70),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+72),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+74),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+76),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+78),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+80),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+82),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+84),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+86),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+88),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+90),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+92),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+94),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+96),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+98),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+100),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+102),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+104),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+106),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+108),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+110),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+112),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+114),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+116),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+118),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+120),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+122),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+124),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+126),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+128),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+130),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+132),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+134),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+136),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+138),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+140),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+142),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+144),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+146),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+148),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+150),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+152),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+154),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+156),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+158),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+160),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+162),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+164),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+166),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+168),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+170),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+172),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+174),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+176),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+178),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+180),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+182),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+184),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+186),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+188),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+190),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+192),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+194),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+196),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+198),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+200),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+202),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+204),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+206),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+208),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+210),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+212),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+214),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+216),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+218),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+220),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+222),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+224),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+226),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+228),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+230),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+232),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+234),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+236),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+238),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+240),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+242),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+244),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+246),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+248),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+250),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+252),HL; 3:16 0x0000 ,
ld (VARIABLE_SECTION+254),HL; 3:16 0x0000 ,
ld L, 0x64 ; 2:7 0x0064 ,
ld (VARIABLE_SECTION),HL; 3:16 0x0064 ,
pop HL ; 1:10 0x0064 , 0x0000 , ... 0x0000 ,
;[391:2086] 0x0064 , 0x0000 , ... 0x0000 ,
VARIABLE_SECTION:
dw 0x0064
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
dw 0x0000
;[391:2086]
Problem je trosku s tim ze zrovna tady bych nepreferoval rychlost, ale spis velikost a ty nuly vytvarel spis smyckou...
Navic se mi to generuje nejak dlouho a to jsem jeste u zadani hodnoty v hex formatu...
Nad dekadickym vstupem zatim jen premyslim a vypada to, ze tohle jeste nikdo neresil. Mit vstup jako retezec s dekadickym cislem a mit vystup retezec s hexadecimalnim cislem. Proste to prevedou na cislo. Jenze to u BigNum nejde.
Napada me to jen zdimat po jednom bitu. Dekadicke cislo ma ulozenou informaci zda je sude nebo liche uz v posledni cifre. A pak to delit dvema od nejvyssi cifry a pokud byla licha pricitat 5 k nizsi cifre atd. To by bylo az 2048 iteraci pro 256 bajtu...
Existuje na to nejaky trik? Jak si to cislo rozsekat nejak...
Nastesti mam limit 256 bajtu takze mozna pujde pouzit nejake konstanty...
Ale i tak to vypada jako pekna vyzva, protoze je to retezec a delam to v makru...