Bitte wie komme ich an die Call-Adresse des mit ASM erzeugten Maschinencodes?
ProcAddr liefert derzeit Fehlermeldung ...
XProfan X4 mit Inlineassembler und mehr
-
-
-
Danke,
sind halt noch so ein paar Sachen, die noch fehlen bzw. erst
beim Gebrauch auffallen, wie z.B auch die
Pseudobefehle REPNE STOSD usw. -
Bitte wie komme ich an die Call-Adresse des mit ASM erzeugten Maschinencodes?
ProcAddr liefert derzeit Fehlermeldung ...Zur Zeit überhaupt nicht. ProcAddr funktioniert nur für XProfan-Prozeduren und weist diesen eine feste Adresse zu. Mit ASM-ENDASM werden die Funktionen genau so in die interne Liste externer Funktionen eingetragen, wie mit ImportFunc oder ImportDLL. Da die Funktionen ja über ihren Namen aufgerufen werden (auch in ASM-Funktionen mit FCALL), benötigt man (normalerweise) ihre Adressen nicht.
Ich habe aber geplant, bei ASM-ENDASM zwei Systemvariablen zu füllen, die Startadresse und Länge des erzeugten Codes bereitstellen, auch wenn ich nicht so recht weiß, was man damit Sinnvolles anfangen kann.
Gruß
Roland -
MAT Var[] < n : Initialisierung der Elemente mit Index*n.
Hallo Roland,
hat es einen Grund, warum Element 0 z.B. A[0] mit 0 belegt
ist ? Da wir normalerweise bei Arrays u. sonst. bei 0 zu zählen
anfangen, sollte auch das 1. Element belegt sein.Das fände ich besser, weil man es so gewohnt ist.
PS: Würde ja dann auch bei den Move-Funktionen
(Move("ArrToList", A[]) ) immer für eine Leerzeile
bzw. Zeile mit 0 am Anfang sorgen.2. Jetzt hat z.B. ein Array mit 10 Elementen (mit A[10] declariert)
plötzlich 11 Elemente und natürlich die Listboxliste auch. -
Ja, das hat einen Grund: Das Element des Arrays wird bei "< 1" mit seinem Index belegt. Und das erste Array-Element hat nun mal schon immer den Index 0.
Ich fände es eher verwirrend, wenn bei der Vorbelegung ein Element den Wert Index+1 bekommt.Wenn Du aber z.B. mit 1 anfangen willst, kannst Du ja ein ebenso rasches "MAT A[] + 1" hinterherschicken.
Gruß
Roland -
Wenn Du aber z.B. mit 1 anfangen willst, kannst Du ja ein ebenso rasches "MAT A[] + 1" hinterherschicken.
Stimmt, daran hatte ich gerade nicht gedacht. Bei einer Enumeration mit
1 ist es wohl so richtig.LODSB entspricht MOV AL,[ESI] gefolgt von einem INC ESI bzw. DEC ESI, je nachdem wie das Richtungsflag gesetzt ist.
Wäre das dann das CLD (Direktionsflag) ?
-
Neue Version hochgeladen:
Der Assembler kennt jetzt auch die Befehle LODSB, LODSD, CLD, CLC, STC, STD und LEAVE.Gruß
Roland -
Und wieder eine neue Version:
Nach LODSB und LODSD sind nun auch die weiteren Stringfunktionen MOVSB und MOVSD, sowie STOSB und STOSD hinzugekommen. Und in der Zeile direkt davor darf das Prefix REP stehen, das den nachfolgenden Stringbefehl solange wiederholt und ECX um 1 reduziert, bis der Zähler ECX auf 0 steht.
Hierzu ein kleines Beispiel:Code
Alles anzeigenCLS Set("ASMMODE", 2) ASM "FillString", 2 // 1 = String, 2 = Füllszeichen MOV EBX, Par2 // Zeichen-Adresse nach EBX MOV AL,[EBX] // Zeichen an Adresse nach AL MOV EDI, Par1 // String-Adreese nach EDI (Zielregister) MOV ECX, [EDI-4] // Stringlänge nach ECX (Zählregister) REP // so oft, wie ECX (Stringlänge) STOSB // AL nach Zielstring kopieren ENDASM Var String Test = "Das ist ein Teststring!" Print Test Fillstring(Test, "@") Print Test WaitInput End
Ach ja mit der neuen Setfunktion ASMMODE kann die Debug-Assemblerausgabe gesteuert werden: 0 - keine Ausgabe, 1 - Assemblerlisting als Datei (wie in den bisherigen Alphaversionen), 2 - Assemblerlisting auf das Hauptfenster des Programmes.Und die neue Funktion fAddr(Name) ermittelt die Adresse des Codes einer Funktion, die mit ImportFunk, ImportDLL oder ASM hinzugefügt wurde. Sie kann dann mit CALL aufgerufen werden. Gibt es die Funktion nicht, ist das Ergebnis 0. Ein Beispiel:
Code
Alles anzeigen$H windows.ph ' WindowsHeaderdatei nutzen CLS Declare handle hDLL, Funk, String Text hDLL = UseDLL("USER32.DLL") ' Handle von USER32 ermitteln funk = ~GetProcAddress(hDLL, "MessageBoxA") ' Adresse der Funkton ermitteln ASM "MsgBox", 5 ' Ein Parameter Adresse + 4 Parameter für die Messagebox // Parameter einlesen MOV ECX, Par1 MOV EAX, Par2 MOV EDX, Par3 MOV ESI, Par4 MOV EBX, Par5 // Messagebox-Parameter auf den Stack PUSH EBX PUSH ESI PUSH EDX PUSH EAX // Funktion aufrufen CALL ECX ENDASM var handle aMsgBox = faddr("MsgBox") if aMsgBox Print call(aMsgBox, funk, %hWnd, "Das ist die Botschaft!", "Titel", 51) endif waitinput
... und die 8 Funktionen für die COM-Schnittstelle sind in der Kontainer-Funktion "COM" gelandet.
Gruß
Roland -
Ach ja mit der neuen Setfunktion ASMMODE kann die Debug-Assemblerausgabe gesteuert werden: 0 - keine Ausgabe, 1 - Assemblerlisting als Datei (wie in den bisherigen Alphaversionen), 2 - Assemblerlisting auf das Hauptfenster des Programmes.
Könntest du das auch variabel machen ?
Also, nicht das Hauptfenster, sondern ein Handle
z.B. für ein MultiEdit.Bei Print Ausgaben ist es ja egal. Kann aber genauso störend sein,
wenn das Hauptfenster z.B. für Controls, Bilder usw. gebraucht
wird und man trotzdem die Ausgaben angezeigt haben möchte.Die int. Listboxliste wäre doch auch interessant. Da kann man die
Ausgaben verschieben, wohin man will oder auch in eine Datei schreiben.Man müßte jedoch durch ein Systemvariable z.B. wissen, wann oder ob
das Listing hineingeschrieben wurde. Dann könnte man das verarbeiten
und die Listboxliste zur weiteren Verwendung mit CLEAR löschen.Kommt aber darauf an, ob die Listboxliste zum Zeitpunkt des Parsens
schon initialisiert ist.Ist nur mal so eine Idee von mir.
-
PS :
Was noch hinzu kommt :
Set("ASMMODE", 2) ist nur interessant bei nur einem
kleinem ASM-Code. Bei größerem Code oder mehreren
Codemodulen (ASM...EndAsm) scrollt es ja sowieso nach
oben weg und wird dadurch unsichtbar.Insofern wäre eine andere Lösung vielleicht sinnvoller.
Vielleicht hat Roland ja noch eine Idee.
-
Vergesst den ASMMODE 2! Den habe ich nur für mich selbst eingebaut, um ganz bequem zu kontrollieren, ob mein Inlineassembler den richtigen Code erzeugt. Und dafür benutze ich natürlich kleine bis winzige Assembler-Routinen. In der Praxis wird man die Ausgabe eh' nicht brauchen, ganz egal ob ich sie aufs Hauptfenster, in die Listboxliste oder sonstwohin schreibe. Für alles Andere ist die Ausgabe in eine Datei völlig ausreichend.
Gruß
Roland -
Gerade entdeckt: Art of Assembly Language
-
Toll: MAT x![] < 1.005 klappt ja auch schon!
GrussP.S: Mit Ascii: db 37,36,35,34,33,0 hatte ich allerdings kein Glück. Muss derzeit offenbar noch
Ascii:
db 37:db 36:db 35:db 34:db 33:db 0 ' heissen! -
P.S: Mit Ascii: db 37,36,35,34,33,0 hatte ich allerdings kein Glück. Muss derzeit offenbar noch
Ascii:
db 37:db 36:db 35:db 34:db 33:db 0 ' heissen!Ich denke, daß Roland diese Lücke auch noch schließt.
zu REP :
SCAS und CMPSB
fehlen auch noch. Wie ich sehe, geht das ja ziemlich schnell
mit den Implementierungen. Zum Schluß haben wir doch
noch einen vollwertigen Inline - Assembler
Da fehlt ja nicht mehr allzu viel. -
SCASB, SCASP, CMPSB und CMPSP kann ich noch einbauen. Aber bei DB wird es bei einem Parameter bleiben.
Gruß
Roland -
Neue Version hochgeladen:
SCASB, SCASP, CMPSB und CMPSP hinzugefügt. Außerdem gibt es nu auch REPNZ und REPZ.
Außerdem gibt es noch DH "Hexcode":Es wird der Hexcode in das Programm so eingefügt, wie er da steht. Im Beispiel also vier Bytes. Das ist etwas übersichtlicher als folgender Code, der das Gleiche bewirkt:
-
P.S.: Vielleicht wäre eine separate Rubrik für solche und andere User-Codestücke sinnvoll.
Dann könnte dieser Thread allein für Neuerungen reserviert bleiben...
Gute Idee!
-
Ich habe das mal umgesetzt. Hier verblieben sind die Listungs, die Roland jeweils zum aktuellen Entwicklungsstand beigefügt hat. Ansonsten sind dann Assemblerlistungs hier zu finden.
Gruß Volkmar
-
SCASP und CMPSP:
Ist da statt P das D mit gemeint ??!?
-
SCASP und CMPSP:
Ist da statt P das D mit gemeint ??!?
Ja natürlich! Sorry!
Gruß
Roland -
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!