| |
|
|
GDL | Hallöle Community,
là je mich im Moment sur 2 Projekte konzentriere, voudrais je cela RVK Basic par quoi Eigenes ersetzen.
quoi habe je bereits: - den genauen Befehlsumfang de den Microcontrolern - une fonctionnement RVK Compiler (et somit une Présentation quoi aus den individuel Basic-Befehlen dans Assembler volonté soll)
de quoi je überhaupt keinen plan habe - comment löst on am Besten imbriquées Befehle ou bien Schleifenroutinen sur - comment allez on generell am Besten avant, là zeilenweises 1 trop 1 Übersetzen pas allez.
peut-être peux mir quelqu'un Schützenhilfe donner.
cela Ganze ist zwar un äußerst harter Brocken pour mich, mais je werde pas tout autor herumkommen.
Grüßle Georg |
|
|
| |
|
|
|
| Du musst arrêt pour ASM auflösen.
So wird z.B. aus einer Variable une (dans dem le cas plutôt feste) SpeicherAdresse, z.B. une Adresse im Stack.
alors var a=0 il me faut une variable a, alors push 0 et Stackadresse merken im Kompilierer. et si irgendwo a=22 steht, ensuite quelque chose comme comment (maintenant la fois angenommen 32Bit)
push eax //eax sur stack sichern push ebx //ebx sur stack sichern mov eax,AdresseVonAImStack mov ebx,22 mov [eax],22 pop ebx pop eax
cela peux on naturellement kürzer, sollte bloß un Bild volonté.
quelle ASM cette Microkontroller soutenu sais je pas.
je schätze Schleifen et ifs sommes plutôt Votre Frage.
alors un si mets je per xpse pour assembler um sinnbildlich so:
si 10=20 //imprimer d'autre //exit endif
wird trop
push eax push ebx mov eax,10 mov ebx,20 cmp eax,ebx pop eax pop ebx jne marke001d'autre //imprimer jmp marke001end marke001d'autre: //exit marke001end: weiterimtext...
cela wäre ensuite un si.
Schleifen sommes aussi seulement un si.
tandis que 1<10 //imprimer Wend
ist oui aussi seulement
marke002loop: push eax push ebx mov eax,1 mov ebx,10 cmp eax,ebx pop eax pop ebx JGE marke002end //imprimer jmp marke002loop
peut-être hilft es Dir quoi je avec xpse erzeuge, simple la fois den asm anschauen.
après peux Du den ASM pour Opcodes auflösen. Schwieriger wird cela pas comme pour ASM mais là musst Du chez den Jumps plan aussi qui Sprungweiten tenir compte de qui je pour CPU/ OS Grenzen avons. |
|
|
| |
|
|
|
GDL | Hi,
soweit kapier je cela Schonmal. Mir gehts mais trop allererst la fois um cela Erkennen et Auswerten qui Présentation.
Extremfall: Si (((a+7)/2)-5)+(14/c) > irgendwas
gibts là irgendeinen algorythmus ou bien irgendwas um cela richtig trop erkennen et ensuite pour punkt avant strich sous attention qui Klammern aufzulösen.
ou bien stur qui Klammern de dedans pour aussen abarbeiten? |
|
|
| |
|
|
|
| cela allez aussi bien, schreibe pour den Anfang une Funktion parseArg(ument) - so wandelt aussi xpse "Profan"-Argumente pour ASM:
Beispiel:
a=(10+20)+30
wird trop:
tmp1=10+20 //Klammer vorne+hinten peux toujours weggeworfen volonté si einzige Klammern a=tmp+30
wird trop
tmp1=10 add tmp1,20 a=tmp add a,30
ergo finde Klammerauf et prends alle marque jusqu'à zur korrespondierenden Klammerzu. simple Zeichenweise parsen et chez chacun récente geöffneten Klammer simple une Zähler hochzählen et chez einer Klammerzu den Zähler runtersetzen sodass aussi wirklich qui korrespondierende Klammer trouvé wird.
So wird aus ((10+20)*(30+40)) ca: (10+20)*(30+40)
weil qui Außenklammern simple wieder weggeworfen volonté peut weil vous korrespondieren.
So brauchst Du une Klammernauflöser et plusieurs Operatorenauflöser angewandt dans qui Reihenfolge Punkt, Strich
cela ganze nenne je volontiers faux Argumenteauflöser.
Nochmal:
a=((10+20)*(30+40)) wird trop ca: a=(10+20)*(30+40)
weil qui Außenklammern simple wieder weggeworfen volonté peut weil vous korrespondieren.
ensuite findet qui Klammernauflöser wieder une klammer, entier vorne qui.
ensuite liesst il jusqu'à zur korrespondierenden Klammer alles un, findet alors 10+20, merke 10+20 et 10+20 wird ersetzt dans tmpX (X est un Zahlenwert qui simple hochzählt, alors tmp1, tmp2...)
Ergo
a=(10+20)*(30+40)
wird trop
tmp1=10+20 a=tmp1*(30+40)
ensuite: encore une Klammer im Argument? oui, ergo findet qui Klammernauflöser (30+40) et ersetzt es dans (diesmal) tmp2 et merkt 30+40
Ergo:
tmp1=10+20 tmp2=30+40 a=tmp1*tmp2
encore une Klammer im Argument? non, alors ab zum Operatorenauflöser pour Punktrechnung.
un Malzeichen dans a=tmp1*tmp2? oui, ergo linkes Argument parsen = tmp1, rechtes Argument tmp2.
Ergo:
tmp1=10+20 tmp2=30+40 tmp3=tmp1 mul tmp3,tmp2 a=tmp3
encore un Punktrechnungsoperator? non, ergo plus zum Operatorenauflöser pour Strichrechnung (arbeitet oui c'est ca comment qui Punktrechnungsoperatorenauflöser):
un Plus trouvé? oui, z.B. dans tmp1=10+20. Wieder linkes et rechtes Argument trouver, ergibt à gauche 10 et à droite 20.
ergo, aus: tmp1=10+20
wird
tmp4=10 add tmp4,20 tmp1=tmp4
prochain la ligne ist tmp2=30+40, wieder un Strichrechner trouvé, ergo auflösen:
Aus: tmp2=30+40
wird
tmp5=30 add tmp5,40 tmp2=tmp5
ensuite wird nirgends plus un Operator trouvé, ergo venez heraus:
tmp4=10 add tmp4,20 tmp1=tmp4 tmp5=30 add tmp5,40 tmp2=tmp5 tmp3=tmp1 mul tmp3,tmp2 a=tmp3
cela peux léger pour ASM gebracht volonté, beispiels 32bit asm:
mais cela hatten wir oui dessus déjà.
Ist mist trop expliquer, sorry. |
|
|
| |
|
|
|
GDL | Hallöle,
erstmqal vielen Dank pour deine Ausarbeitung. joli lente viens je derrière elle quoi chez RVK Singlepass1 et Singlepass2 jusqu'à ..4 ist.
Ist mist trop expliquer, sorry
je sais, tu mich aussi schwer qui richtigen Fragen trop se mettre. mais je beiß mich là maintenant par.
Grüßle Georg |
|
|
| |
|
|
|
GDL | Hallöle David,
viens vorwärts. Variablen aus Code herausfiltern allez déjà et qui Vektortabellen pour qui verschiedenen Devices sous Berücksichtigung qui Interrupts trop erstellen funzt aussi déjà. suis eh bien à qui "Befehlerkennung" et en Umsetzung dans qui Arbeitsregister. Mühsam ernährt sich cela écureuil.
Grüßle Georg |
|
|
| |
|
|
|
GDL | Hi,
@David: merci pour qui Tips am Tele.
Erste lauffähige Codes gibt es déjà. |
|
|
| |
|
|