Dieser Text gilt für alle Seiten aus dieser Rubrik (Runtime).
Dies hier ist die harte Basis für eine Runtime die in möglichst hochoptimiertem Assembler geschrieben sein muß.
Alle Hochsprachen-Routinen basieren letztendlich auf einer solchen Laufzeit-Basis.
Durch Vollständige Umsetzung in ASM werden diese Funktionen schneller sein als solche, die in Hochsprachen geschrieben werden.
Die Basis Operationen wie + - * / usw. können nur in ASM realisiert werden, da dies die niedrigste Hierarchiestufe ist und jede Hochsprache diese Funktionen in ASM umsetzen muß.
Andere wie z.B. komplexe Zahlen können in einer Hochsprache geschrieben sein (hier VisualBasic), da sie auf den Grundfunktionen aufbauen. Sie können zum Teil über ASM optimiert werden, sollten aber dennoch auch zur späteren Funktionsprüfung auch in der Hochsprache geschrieben werden.
Jede Zeile in ASM sollte kommentiert werden, damit sofort ersichtlich ist, was in der Zeile geschieht. Einerseits dient dies sehr der Lesbarkeit, andererseits hilft das Anfängern gleichzeitig auch beim Erlernen von ASM.
Die Codes sind so einfach wir nur möglich organisiert und konzentrieren sich auf das Wesentlichste, damit mit möglichst wenig Zeitaufwand die Codes und die Strukturen verstanden werden können.
Alle ASM Codes werden für 32Bit Prozessoren im Flat-Memory Model realisiert.
Einige Bereiche richten sich auch an Profis mit tieferen Kenntnissen in Mathematik und dessen optimaler Umsetzung in ASM. Andere können Anfängern helfen ASM zu erlernen.
Alle Codes sollen im gleichen Format geschrieben werden.
Die ASM-Codes sind alle absichtlich sehr kompakt. Sie enthalten nur die Variablen-Übergabe und den Berechnungsteil, wobei die Variabeln mit Namen bezeichnet werden. Zusätzlich können Markierungen eingefügt werden, die z.B. die Position einer Overflow-Prüfung markieren. Die ASM-Codes besitzen so ein Format, das direkt in MASM kompilierbar ist.
Alle Codes werden nur für CPU-32Bit oder FPU-80Bit Register geschrieben.
Wenn möglich sollten die Variabeln-Übergaben ganz oben stehen.
| Standard Rückgabe-Register sind |
|---|
| EAX | bei CPU | (und EDX) alle anderen Register gelten als flüchtig |
| ST(0) | bei FPU | (und ST(1)) der Stack darüber muß leer sein |
| EDX, ST(1) | | Bei bestimmten Operationen manchmal auch EDX oder ST(1) |
Mehr Informationen im Schnell-Kurs
Alle Assembler Codes werden in einem entsprechenden Codeblock eingegeben, der immer dem gleichen Format entsprechen sollte.
Test_NAME PROC Public Val1:DWORD, Val2:DWORD
;=== Beschreibung
;=== Formel
MOV EAX, Val1
FUNKTION PARAMETER ; Kommentar
;@CheckOverflow
RET
Test_NAME ENDP
Beispiel
Test_Add PROC Public Val1:DWORD, Val2:DWORD
;=== +, Addition
;=== EAX = Val1 + Val2
MOV EAX, Val1
ADD EAX, Val2
;@CheckOverflow
RET
Test_Add ENDPTest_Fpu_NAME PROC Public Val1:TBYTE, Val2:TBYTE
;=== Beschreibung
;=== Formel
FLD Val2 ; -> ST0 = Val2
FLD Val1 ; -> ST0 = Val1 , ST1=Val2
FUNKTION PARAMETER ; Stack-Zustand [Kommentar]
;@CheckOverflow
FWAIT
RET
Test_Fpu_NAME ENDP
Beispiel
Test_Fpu_Add PROC Public Val1:TBYTE, Val2:TBYTE
;=== +, Addition
;=== ST0 = Val1 + Val2
FLD Val2 ; -> ST0 = Val2
FLD Val1 ; -> ST0 = Val1 , ST1=Val2
FADDP ST(1), ST ; <- ST0 = ST0 + ST1
;@CheckOverflow
FWAIT
RET
Test_Fpu_Add ENDPStack-Register/Parameter sollten immer angegeben werden auch wenn nicht zwingend notwendig, um die Register eindeutig zu bezeichnen und den Code lesbarer zu machen. Und auch um Funktionen erkennen zu können, die keine Parameter besitzen und dadurch nur auf ST0 anwendbar sind.
? --> 0-7 Platzhalter für 8 FPU-Register
| Parameter |
|---|
| ST(?) | Ist die korrekte Schreibweise für die Parameter. Ist nichts angegeben ist ST(0) meistens der Standard. |
| ST | Bedeutet, dass es ST0 sein muß, da nur dieses erlaubt ist. |
| ST? | Wird für die Stack-Beschreibung der Einfachheit halber verwendet (also zB. ST(0) statt ST0). |
| ASM FPU Kommentar-Format |
|---|
| -- | Keine FPU-Stack Bewegung |
| -> | PUSH auf FPU-Stack |
| <- | POP vom FPU-Stack |
|
| ST? = Val1 | Es wurde eine Berechnung durchgeführt und gespeichert |
| ST?=Val1 | Es wurde ein Resultat unverändert beibehalten und vielleicht auf ein anderes Register verschoben |
| Spezielle Operationen im Kommentar |
|---|
| <?> | Vergleichen |
| <=> | Vertauschen |
Mehr Informationen im Schnell-Kurs
Um bestimmte Operationen zu automatisieren werden Schlüsselwörter verwendet.
| Text | Kurz | Beschreibung |
|---|
| ;@CheckOverflow | Überlauf Prüfung | Je nach VarTyp wird Overflow oder Cary Flag geprüft, ist es gesetzt wird zu Fehler gesprungen |
| Jump_End: | Ende | Markiert die Standard-Sprungmarke für das Ende des Codes (wenn notwendig) |