AstroLang/docs/versioned_docs/version-1.0.0/asx.md

110 lines
No EOL
3.6 KiB
Markdown

---
sidebar_position: 5
description: Az ASX fájl leírása
---
# ASX (Astro Lang Executable) fájl
---
:::info
ASX Verzió: `0.2.0`
:::
:::info
Ezt megtudod nézni a `ASL viewx <fájl>` parancs használatával.
:::
## Fájl felépítése:
|Név|Leírás|Méret|
|---|---|---|
|Doctype: ASX|Elmondja a fájlról, hogy tényleg ASX.|3 bytes|
|Verzió|Elmondja a fájl ASX verzióját. (byte.byte.byte)|3 bytes|
|Funkciók száma|Elmondja, hogy mennyi funkció van a fájlban.|4 bytes|
|Funkciók|Lásd: [Funkciók](#funkciók)||
## Funkciók:
|Név|Leírás|Méret|
|---|---|---|
|Változók száma|Elmondja, hogy a funkcióban mennyi változó van.|4 bytes|
|Változók|Lásd: [Változók](#változók)||
|Szövegek száma|Elmondja, hogy a funkcióban mennyi szöveg van.|4 bytes|
|Szövegek|Lásd: [Szövegek](#szövegek)||
|Funkciók száma|Elmondja, hogy a funkcióban mennyi funkció meghívás van.|4 bytes|
|Funkciók|Lásd: [Funkció meghívások](#funkció-meghívások)||
|Catch pos|Megmutatja a catch funkció helyzetét, csak try-ban. Normál funkciók esetén 0|4 bytes|
|Instrukciók száma|Elmondja, hogy a funkcióban mennyi instrukció van.|4 bytes|
|Instukciók|Lásd: [Instrukciók](#instrukciók)||
## Változók:
|Név|Méret|
|---|---|
|Változó nevének hossza|4 bytes|
|Változó neve||
|Változó ID-je|3 bytes|
|Változó kezdő ponja|4 bytes|
|Változó végpontja|4 bytes|
## Szövegek:
|Név|Méret|
|---|---|
|Szöveg ID-je|3 bytes|
|A szöveg hossza|4 bytes|
|A szöveg||
## Funkció meghívások:
|Név|Méret|
|---|---|
|A meghívás ID-je|3 bytes|
|A meghívott funkció pozíciója|4 bytes|
## Instrukciók:
:::info
Minden instrukció végére hozzáadunk még 3 bit-et, így összesen 10 byte-ba belefér minden instrukció.
:::
|OP Code - 5 bits|Rövid név|Leírás|Arg1 - 4 bits|Arg2 - 64 bits|Arg3 - 4 bits|
|---|---|---|---|---|---|
|0|HLT|Befejezi a program futtatását||||
|1|LDS|Betölt egy szöveget a regiszterbe|R(A)|Szöveg ID||
|2|LDM|Betölti a változót a memóriából|R(A)|Változó ID||
|3|LDI|Betölt egy számot a regiszterbe|R(A)|Szám||
|4|LDB|Betölt egy logikai értéket a regiszterbe|R(A)|Logikai érték||
|5|LDF|Betölt egy funkciót a regiszterbe|R(A)|Funkció ID||
|6|LDN|Betölt egy null-t/táblát a regiszterbe|R(A)|Ez egy tábla?||
|7|ASS|Hozzáad egy változó ID-t a regiszerhez|R(A)|Változó ID||
|8|UNB|Leválaszja a regiszterről a változót|R(A)|||
|9|MOV|Átmásolja R(A) pointerjét R(B)-be|R(A)|R(B)||
|10|ADD|`R(C) = R(A) + R(B)`|R(A)|R(B)|R(C)|
|11|SUB|`R(C) = R(A) - R(B)`|R(A)|R(B)|R(C)|
|12|MUL|`R(C) = R(A) * R(B)`|R(A)|R(B)|R(C)|
|13|DIV|`R(C) = R(A) / R(B)`|R(A)|R(B)|R(C)|
|14|POW|`R(C) = R(A) ^ R(B)`|R(A)|R(B)|R(C)|
|15|MOD|`R(C) = R(A) % R(B)`|R(A)|R(B)|R(C)|
|16|AND|`R(C) = R(A) && R(B)`|R(A)|R(B)|R(C)|
|17|OR|`R(C) = R(A) \|\| R(B)`|R(A)|R(B)|R(C)|
|18|EQ|`R(C) = R(A) == R(B)`|R(A)|R(B)|R(C)|
|19|NEQ|`R(C) = R(A) != R(B)`|R(A)|R(B)|R(C)|
|20|GRE|`R(C) = R(A) > R(B)`|R(A)|R(B)|R(C)|
|21|GRQ|`R(C) = R(A) >= R(B)`|R(A)|R(B)|R(C)|
|22|LES|`R(C) = R(A) < R(B)`|R(A)|R(B)|R(C)|
|23|LEQ|`R(C) = R(A) <= R(B)`|R(A)|R(B)|R(C)|
|24|NOT|`R(B) = !R(A)`|R(A)|R(B)||
|25|JMP|Oda ugrik a kódban||Hely||
|26|CJP|Oda ugrik a kódban, ha a regiszter igaz|R(A)|Hely||
|27|CAL|Meghív egy funkciót, majd a kimenetet elmenti R(B)-be|R(A)|R(B)||
|28|PSH|Egy értéket belerak a következő funkció bemeneteihez|R(A)|||
|29|RET|Visszad egy értéket|R(A)|||
|30|GET|Lekér egy értéket a táblából `R(C) = R(A)[R(B)]`|R(A)|R(B)|R(C)|
|31|SET|Beállít egy értéket a táblának `R(A)[R(B)] = R(C)`|R(A)|R(B)|R(C)|
:::tip
Ha az ENV-ből szeretnénk lekérni valamit akkor a `GET`-et kell használni, úgy, hogy `R(A) = 0`!
:::