Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 21 odgovor
  • 6.995 pregleda

Najnovija ↓

SectorC: A C Compiler in 512 bytes 25.05.2023. u 13:09 · pre 41 mesec #1
https://xorvoid.com/sectorc.html

Citat:

SectorC: A C Compiler in 512 bytes

SectorC (github) is a C compiler written in x86-16 assembly that fits within the 512 byte boot sector of an x86 machine. It supports a subset of C that is large enough to write real and interesting programs. It is quite likely the smallest C compiler ever written.

In a base64 encoding, it looks like this:
Code:

6gUAwAdoADAfaAAgBzH/6DABPfQYdQXoJQHr8+gjAVOJP+gSALDDqluB+9lQdeAG/zdoAEAfy+gI
AegFAYnYg/hNdFuE9nQNsOiqiwcp+IPoAqvr4j3/FXUG6OUAquvXPVgYdQXoJgDrGj0C2nUGV+gb
AOsF6CgA68Ow6apYKfiD6AKrifgp8CaJRP7rrOg4ALiFwKu4D4Srq1fonP9ewz2N/HUV6JoA6BkA
ieu4iQRQuIs26IAAWKvD6AcAieu4iQbrc4nd6HkA6HYA6DgAHg4fvq8Bra052HQGhcB19h/DrVCw
UKroWQDoGwC4WZGrW4D/wHUMuDnIq7i4AKu4AA+ridirH8M9jfx1COgzALiLBOucg/j4dQXorf/r
JIP49nUI6BwAuI0G6wyE0nQFsLiq6wa4iwarAduJ2KvrA+gAAOhLADwgfvkx2zHJPDkPnsI8IH4S
weEIiMFr2wqD6DABw+gqAOvqicg9Ly90Dj0qL3QSPSkoD5TGidjD6BAAPAp1+eu86Ln/g/jDdfjr
slIx9osEMQQ8O3QUuAACMdLNFIDkgHX0PDt1BIkEMcBaw/v/A8H9/yvB+v/34fb/I8FMAAvBLgAz
wYQA0+CaANP4jwCUwHf/lcAMAJzADgCfwIUAnsCZAJ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAVao=



Kod: https://github.com/xorvoid/sectorc

Kompajliran, staje u old-school 512-bajtni boot sektor. Ili - manji je od 4 SMS ili 2 Twitter poruke :-)
Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 27.05.2023. u 04:45 · pre 41 mesec #3
Na šta se odnosi 512 bajtova?
Taj string ima 684 znaka što je više od 512.

Šta se dobije kad se dekodira?
Mašinski kod?

Ako je mašinski kod za koju je mašinu?

Ako je za Commodore 64, paaa tamo u 512 bajtova može stati što-šta samo će kompajliranje potrajati...

Ako je za 8086 i tamo može da se svede na 8-bitne registre i short jump/grananje/near call.

[1 / 115]
Re: SectorC: A C Compiler in 512 bytes 27.05.2023. u 10:46 · pre 41 mesec #4
base64 - pise u poruci.

Pise u poruci i instrukcijski set.
Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 02.06.2023. u 09:54 · pre 41 mesec #7
Najjači je ovaj deo

$ ./build.sh
sectorc.s:157: error: invalid combination of opcode and operands

Tako sve može da stane u koliko hoćeš bajtova.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: SectorC: A C Compiler in 512 bytes 02.06.2023. u 10:57 · pre 41 mesec #8
Sta si tacno uradio?



Vazno:

Code:

The following grammar is accepted and compiled by sectorc:

program     = (var_decl | func_decl)+
var_decl    = "int" identifier ";"
func_decl   = "void" func_name "{" statement* "}"
func_name   = <identifier that ends in "()" with no space>
statement   = "if(" expr "){" statement* "}"
            | "while(" expr "){" statement* "}"
            | "asm" integer ";"
            | func_name ";"
            | assign_expr ";"
assign_expr = deref? identifier "=" expr
deref       = "*(int*)"
expr        = unary (op unary)?
unary       = deref identifier
            | "&" identifier
            | "(" expr ")"
            | indentifier
            | integer
op          = "+" | "-" | "&" | "|" | "^" | "<<" | ">>"
            | "==" | "!=" | "<" | ">" | "<=" | ">="

Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 03.06.2023. u 10:50 · pre 41 mesec #9
Uradio sam isto što i ti, ali mi na jednoj instalaciji ne prolazi, a na druge dve prolazi.

Možda starija verzija nasm-a.
Potpis
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Re: SectorC: A C Compiler in 512 bytes 04.06.2023. u 08:42 · pre 41 mesec #10
Koga zanima taj base64 treba dekodirati u hex pa dobiješ to isto.
Ne znam koja fora je da se to uopšte kodira?

Bez rada sa datotekama nije daleko odmakao od digitrona.

Citat:
EA05 00C0 0768 0030 1F68 0020 0731 FFE8
3001 3DF4 1875 05E8 2501 EBF3 E823 0153
893F E812 00B0 C3AA 5B81 FBD9 5075 E006
FF37 6800 401F CBE8 0801 E805 0189 D883
F84D 745B 84F6 740D B0E8 AA8B 0729 F883
E802 ABEB E23D FF15 7506 E8E5 00AA EBD7
3D58 1875 05E8 2600 EB1A 3D02 DA75 0657
E81B 00EB 05E8 2800 EBC3 B0E9 AA58 29F8
83E8 02AB 89F8 29F0 2689 44FE EBAC E838
00B8 85C0 ABB8 0F84 ABAB 57E8 9CFF 5EC3
3D8D FC75 15E8 9A00 E819 0089 EBB8 8904
50B8 8B36 E880 0058 ABC3 E807 0089 EBB8
8906 EB73 89DD E879 00E8 7600 E838 001E
0E1F BEAF 01AD AD39 D874 0685 C075 F61F
C3AD 50B0 50AA E859 00E8 1B00 B859 91AB
5B80 FFC0 750C B839 C8AB B8B8 00AB B800
0FAB 89D8 AB1F C33D 8DFC 7508 E833 00B8
8B04 EB9C 83F8 F875 05E8 ADFF EB24 83F8
F675 08E8 1C00 B88D 06EB 0C84 D274 05B0
B8AA EB06 B88B 06AB 01DB 89D8 ABEB 03E8
0000 E84B 003C 207E F931 DB31 C93C 390F
9EC2 3C20 7E12 C1E1 0888 C16B DB0A 83E8
3001 C3E8 2A00 EBEA 89C8 3D2F 2F74 0E3D
2A2F 7412 3D29 280F 94C6 89D8 C3E8 1000
3C0A 75F9 EBBC E8B9 FF83 F8C3 75F8 EBB2
5231 F68B 0431 043C 3B74 14B8 0002 31D2
CD14 80E4 8075 F43C 3B75 0489 0431 C05A
C3FB FF03 C1FD FF2B C1FA FFF7 E1F6 FF23
C14C 000B C12E 0033 C184 00D3 E09A 00D3
F88F 0094 C077 FF95 C00C 009C C00E 009F
C085 009E C099 009D C000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 55AA


[8 / 433]
Re: SectorC: A C Compiler in 512 bytes 04.06.2023. u 16:47 · pre 41 mesec #11
Mozda covek voli base64, nebitno - to je irelevantan kozmeticki detalj. Sustina je C(-like) procesiranje koje staje u 512 bajta x86 masinskog koda.
Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 08.06.2023. u 10:13 · pre 41 mesec #12
Jel neko ispeo da kompajlira neki C-program sa tih 512 bajta?
Ako jeste može li da priloži listing tog C-programa?

Kako radi taj kompajler i šta daje?
Na kojoj mašini i koji operativni sistem?

Šta je potrebno da imate instalirano da bi taj 512 bajta kompajler funkcionisao?

Kako prepoznaje "grammar", kako prepoznaje "statement"?

Ima čak i "asm" naredbu, ako to radi koje asemblerske instruklcije prihvata? Gde je to u tih 512 bajta?

Re: SectorC: A C Compiler in 512 bytes 08.06.2023. u 12:44 · pre 41 mesec #13
@BrutalCoin,

- U pitanju je "C-like" 'kompajler' koji staje u 512 bajta, sto je bila velicina nekadasnjeg (MBR) boot sektora.
- Izvorni kod samog kompajlera ti je u /sectorc.s fajlu, format je: x86 asembler, tu ces moci da vidis kako prepoznaje 'gramatiku'
- Generisani kod je, takodje, x86, ne treba mu nikakav operativni sistem - koristi BIOS (pogledaj /rt/lib.c ako te zanima koje servise BIOS-a koristi).
- Podskup C jezika koji je podrzan imas na github strani i README.md fajlu
- Runtime "biblioteka" je u /rt direktorijumu - nije mnogo bogata, ali omogucava najosnovnije stvari
- Primeri su ti u /examples direktorijumu

/run.sh skripta ce ti pomoci za testiranje - za demonstraciju koristi QEMU virtuelnu masinu (pogedaj /run_raw.sh)

Na primer:

Code:

./run.sh ./examples/sinwave.c


QEMU ti je potreban ako hoces da koristis run skripte - ako ne, umesto QEMU-a poteraj to na masini sa BIOS-em (ako je UEFI masina, bice ti potreban CSM modul i boot mora biti preko CSM-a). .bin fajl ces, naravno, iskopirati direkt u boot sektor fizickog drajva (koji, naravno, mora biti MBR formatiran, ne GPT).
Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 08.06.2023. u 12:52 · pre 41 mesec #14
Imaju sada emulatori hardwera starih PC-a . Od prvog do negde P3 . Pa kome sta treba od te starezi .

Komplet sve sa BIOS-ima i grafickim karticama .


http://pcem-emulator.co.uk/

Ima jos jedan koji je Fork ovog , al sad ne mogu da nadjem link .

Evo i drugog : http://86box.net/

Evo i 3. : https://pcbox-emu.xyz/

Ovaj prvi link je najlosiji . Malo zastero . Najbolji je link 2. pa 3.
Re: SectorC: A C Compiler in 512 bytes 08.06.2023. u 13:06 · pre 41 mesec #15
Pa da.

run_raw.sh skripta koristi QEMU bas u tu svrhu. Mada ko hoce i ko ima neku matoru masinu, moze i na njoj da potera sve to.

A evo i celog OS-a u 512 bajta, u duhu ove teme: https://github.com/nanochess/bootOS :-)
Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 08.06.2023. u 18:19 · pre 41 mesec #17
To sto je Nedeljko rekao je u sasvim drugom kontekstu, zato sto mu u pocetku nije uspelo da napravi doticni.

NASM se koristi samo za sklapanje samog kompajlera, nigde nije pisano da sam sebe bootstrapuje. Sam kod kompajlera (napisanog u asembleru) je u .S fajlu, naravno da ti treba asembler da ga napravis. Rezultat staje u 512 bajtova, sto je i receno i sto se tvrdi.

Sa tim kompajlerom koji staje u boot sektor moze da se kompajlira prilicno bogat C kod, kao sto se vidi, sto je zapravo poenta celog projekta i sto je samo po sebi prilicno impresivno.

Mozes slobodno ignorisati .S kod i uzeti izlazni masinski kod kompajlera kao pocetak. Asemblerski kod je samo tu radi jasnoce, recimo kad pitas kako sta radi. Onda ti nece trebati nikakav NASM.
Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 08.06.2023. u 21:47 · pre 41 mesec #18
Ti pišeš o "build".
Ja pišem o
Citat:
Running

Dependencies:

nasm for assembling (I used v2.16.01)

Da li to znači da kompajler SectorC u run-time zavisi od nasm?

Ako SectorC u run-time ne zavisi od nasm kako kompajlira asm direktivu?

[16 / 669]
Re: SectorC: A C Compiler in 512 bytes 08.06.2023. u 23:14 · pre 41 mesec #19
Ne.

Skini lepo, poteraj, pogledaj. Mislim da je vec sve receno sto moze da se kaze.

Pogledaj runtime biblioteku:

https://github.com/xorvoid/sectorc/blob/main/rt/lib.c

Code:

 // Enable power management for all devices
  // | mov ah,0x53; mov al,0x08; mov bx,0x0001; mov cx,0x0001
  // | int 0x15; jc error
  asm 180; asm  83; asm 176; asm   8;
  asm 187; asm   1; asm   0; asm 185; asm   1; asm   0;
  asm 205; asm  21; asm 114; asm  14;


asm direktiva samo emituje instrukcije, za to ti ne treba nikakav asembler eksterni.

Pritom, ni jedan od primera nema asm direktive u sebi, vec cisti C.
Potpis
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
Re: SectorC: A C Compiler in 512 bytes 09.06.2023. u 08:05 · pre 41 mesec #20
Što bih "skinuo i poterao"? Čemu služi forum nego da neko uradi nešto umesto tebe?


Dakle, ta asm direktiva je u stvari nešto kao poke na spektrumu.

A kako dolaziš do vrednosti koje treba "poke-tovati"?

Pa tako što asembliraš neki program a zatim disasembliraš i vidiš šta ti treba.
Što znači da ipak za kompajliranje sa SectorC koristiš nasm/ndisasm što na onih 512 bajtova dodaje još 2.5 megabajta.

[18 / 725]
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme