Seite 2 von 2

Verfasst: 08.05.2009 01:56
von Toshy
@NicTheQuick:
Könnte ich daß, würde ich wohl nicht hier im Forum sein *grins*
Ich hatte jahrelang "NAchhilfe", vor allem in englisch, aber in Sprachen hab ich wohl sowas wie ne lernschwäche. Bestimmte Dinge hab ich aufgegeben.
Sprachen und Malerei (schon bei Schuldingen) liegen mir einfach nicht.
ge Befehle in Prosa erklärt, was es für dich
natürlich nicht gerade leichter macht.
Deshalb hat mich die Seite wohl zu schnell erschlagen.

@Helle & DarkDragon:
ERst mal danke, das hilft erstmal weiter. ich teste das die TAge mal genauer.
Define tt.l=67890 ;PB-Variable definieren (hier als Long = 4 Bytes). Damit von ASM benutzbar ist
;Global Pflicht. Diese Variable legt PB auch in einer Data-Section an und bekommt
;dort den Namen "v_tt". PB reserviert in der Data-Section aber nur den Speicher-
;Platz (l = 1 DWord] für diese Variable und weist ihr erst im Programm den Wert
;67890 zu.
;In PB heisst sie weiterhin "tt" ! Nur in PB! Für ASM heisst sie "v_tt"!
;Die unten angelegte Variable heisst "tt" und ist zunächst nur für ASM sichtbar!
dann hatte ich das bisher schon mal richtig verstanden. Zugreifen auf eine PBvariable hatte bei mir schon geklappt. das einzige was ich mich noch frage ist, ob "v_" in ASM immer die Namensvorsilbe für eine Variable ist oder nur PB dies davor hängt, damit es sich von pbinternen Variablen abgrenzt (so wie bei Labels "l_"). Ich vermute auf grund deiner ASMvariablen tt, daß pb diese Vorsilbe drann hängt
Bei ASM-Variablen ist zwingend eine Größe
;anzugeben!
Ahhh. Danke. Aber wieso geht es auch ohne diese Angabe? Was passiert dann? Ist das dann standartmäßig ein Byte, Long oder einfach nur falsch?
Beim MOV-Befehl muss mindestens ein Operand ein Register sein!
Danke.
Debug PeekL(?X) ;so kann man ASM-Variablen auslesen
DAnke. Das hatte ich entweder in der Hilfe überlesen oder einfach vergessen.
End ;wichtig, sonst wird alles Nachfolgende auch als ausführbarer Code betrachtet!
Hmm. Wieso das? In ASM beispielcodes habe ich sowas auch nicht gesehen, besser gesagt nicht erkannt. Da stand immer nur "!section '.data'" oder ensprechender Code teil (mal als Code, mal als Text bezeichnet?). Ich dachte daher, daß !section '.data' dies automatisch als Datenteil ausweißt. Oft steht dieser Teil ja auch am Anfang von ASMbeispieln. Müßte es für das "PB-END" dann nicht auch entsprechendes im ASMcode geben?
In FAQ´s und Tut´s hatte ich mal ein ASM-Tut reingestellt, vielleicht nutzt es dir was.
Da ich bisher nur die Suchfunktion mit einigen ASMdingen benutzt habe, hatte ich das wohl übersehen. Werde ich mir bei gelegenheit sicher raussuchen. DAnke.
Und innerhalb einer Prozedur heißt die Variable dann halt p.v_Variablenname statt v_Variablenname.
Hmm. Also das mit dem "p." habe ich schon gesehen, konnte es mir nur nicht erklären. Aber was bedeutet das? ist das p. einfach eine art "lokale Variable"? oder muß ich auf eine Globale variable in einer Procedure mit "p." zugreifen? ich hatte bisher vermutet, daß "p." für "pointer" steht. ne Adressierung die ich nur nich nicht verstehe.

Insgesamt war ich dann bisher auf dem richtigen weg, selbst mit dem eigenen deklarieren von ASMvariablen. In meiner Erinnerung hatte ich es genau so versucht, nur hat es nicht geklappt. Na ja, jetzt kann ich es die Tage mal richtig testen. Schon mal vielen Dank. Es hilft schon wenn man einen funktionierenden Code zum testen hat. Und das mit "END" ist wichtig und wirft für mich auch einige kleine wichtige Fragen auf. Eine davon steht ja oben :-)

Müßte ich dann aber nicht mit

Code: Alles auswählen

!section '.data' Data readable writeable    ;hier werden die ASM-Variablen definiert
X:                 ;Markierung für PB setzen, ist praktisch die Speicher-Adresse von ASM-tt
!v_tt: dd 12345      ;ein DWord (4 Bytes) anlegen mit dem Wert 12345 
qusi eine PBvariable in ASM anlegen? Ok, die Speicheradresse bzw. die Angabe dazu kann dann wohl nicht mit @tt abgefragt werden, aber irgendwie müßte es doch gehen. Würde das gerne verstehen.

@Batze:
Danke, die Seite war eine der ersten die mir weiter geholfen haben :-) Kannte ich schon. Zwar muß ich zugeben, daß ich noch nicht alles verstanden habe und ich trotzdem nichts lauffähiges hinbekommen habe, aber sieht ja langsam besser aus. Ist interessant zu sehen daß so ein Prozessor total anders arbeitet als man das als "Maschinenleihe" so vermutet. Was ESP usw. genau bedeutet(besser wie dieser stackpointer funktioniert), da hatte ich wohl bisher noch keine Gedult / Zeit das "so nebenbei" zu verstehen.

So, ich denke in den nächsten Monaten werde ich sicher hin und wieder mal wieder neu etwas auf ASM schauen. Für die nächsten Tage hab ich sicher erstmal genug zum schauen.
Eine Abschließende Frage noch auf Grund des letzten "Ausleihcodes". "Mov", wird da zuerst das Ziel oder die Quelle angegeben?
Global X.l
Global Y.l

!mov [v_X],esp
sieht für mich so aus als ob erst die quelle angeben wird, esp also das ziel ist. aber in irgend einem Tutorial hatte ich glaube ich gelesen das erst das ziel kommt.

Verfasst: 08.05.2009 20:03
von Batze
Hmm. Also das mit dem "p." habe ich schon gesehen, konnte es mir nur nicht erklären. Aber was bedeutet das? ist das p. einfach eine art "lokale Variable"? oder muß ich auf eine Globale variable in einer Procedure mit "p." zugreifen? ich hatte bisher vermutet, daß "p." für "pointer" steht. ne Adressierung die ich nur nich nicht verstehe.
Wenn du dir mal die ASM-Ausgabe von Purebasic ansiehst wirst du vor deinem Asm-Teil ein par Zeilen der Form ! p.v_Variablenname equ esp+12 oder so ähnlich finden. Lokale Variablen werden von PB einfach auf den Stack gelegt und besitzen eigentlich keine Namen. Netterweise stellt PB uns aber ein Makro zur verfügung, damit wir deren Addressen nicht ausrechnen müssen. Verwendest du aber in deinem Code irgendwo p.Variablenname ist es genau dass selbe wie esp+12 (bzw. welche Zahl auch immer hinter esp steht)
Eine Abschließende Frage noch auf Grund des letzten "Ausleihcodes". "Mov", wird da zuerst das Ziel oder die Quelle angegeben?
Global X.l
Global Y.l

!mov [v_X],esp
sieht für mich so aus als ob erst die quelle angeben wird, esp also das ziel ist. aber in irgend einem Tutorial hatte ich glaube ich gelesen das erst das ziel kommt.
Ziel immer zuerst, dann Quelle. Ist immer so, bei allen Befehlen (die ich kenne).

Verfasst: 09.05.2009 23:28
von Toshy
Wenn du dir mal die ASM-Ausgabe von Purebasic ansiehst wirst
Wo oder wie sieht man sich die ASMausgabe von PB an?

p. --> lokale Variable - stack - pbmacro...... wow. kein wunder das einige ASMprofis so viel Tempo bei einigen Routinen rausholen. Wenn man weiß was man tut und optimal anpasst können Programme ja regelrecht fliegen lernen!

Danke euch allen bis hier her, auch wenn ich noch nicht weiter testen konnte, so ist mir jetzt schon einiges verständlicher geworden. Sehr interessant.

Verfasst: 09.05.2009 23:36
von Batze
http://www.purebasic.fr/german/viewtopi ... m+compiler

muss zugeben dass man es mit der suchfunktion des boards nicht wirklich gut findet.

Verfasst: 29.05.2009 21:45
von Marvin
Beim MOV-Befehl muss mindestens ein Operand ein Register sein!
Nicht ganz korrekt, man kann schließlich konstante Werte direkt in den Speicher verschieben, aber das nur so nebenbei.
Batze hat geschrieben:Ziel immer zuerst, dann Quelle. Ist immer so, bei allen Befehlen (die ich kenne).
Bei der Intel-Syntax, die FASM verwendet ja. Aber wer auf AT&T-Syntax schwören sollte (ich tu's nicht und verstehe die Leute nicht, die das tun :lol:), der wird einwerfen, dass es dort andersherum ist. Manche empfinden das als viel logischer, ich nicht. Schließlich steht beim Hochsprachenbefehl "a = b" das Ziel auch zuerst und dann die Quelle.
Aber da es ja um FASM geht, kann man das so stehen lassen.
Toshy hat geschrieben:
Bei ASM-Variablen ist zwingend eine Größe anzugeben!
Ahhh. Danke. Aber wieso geht es auch ohne diese Angabe? Was passiert dann? Ist das dann standartmäßig ein Byte, Long oder einfach nur falsch?
Wenn der Speicherplatz für eine (globale) Variable reserviert wird, dann geschieht das mit einem "Befehl" wie "dd" (long bzw. DWord) oder "db" (byte), das heißt, der Assembler weiß, wie er die Variable (bzw. den Speicherplatz) vermutlich zu behandeln hat. Es ist aber meistens sicherer, die Größe anzugeben.
Wenn der Assembler nicht weiß, was er machen soll (z. B. bei "mov [ebx],42"), dann gibt es eine hübsche Fehlermeldung à la "operand size not specified."
Toshy hat geschrieben:
End ;wichtig, sonst wird alles Nachfolgende auch als ausführbarer Code betrachtet!
Hmm. Wieso das? In ASM beispielcodes habe ich sowas auch nicht gesehen, besser gesagt nicht erkannt. Da stand immer nur "!section '.data'" oder ensprechender Code teil (mal als Code, mal als Text bezeichnet?). Ich dachte daher, daß !section '.data' dies automatisch als Datenteil ausweißt. Oft steht dieser Teil ja auch am Anfang von ASMbeispieln. Müßte es für das "PB-END" dann nicht auch entsprechendes im ASMcode geben?
Der CPU ist es egal, ob dort Daten oder Code stehen. Für sie sind das alles Bits und Bytes und daher führt sie alles aus, wenn die Daten nicht besonders als solche ausgewiesen und somit als nicht ausführbar gekennzeichnet wurden (das nennt sich Segmentation, ist eine hässliche Sache und wird von Betriebssystemen heutzutage imo kaum noch genutzt und durch Paging ersetzt worden). "code" ist übrigens das gleiche wie "text".
Und das PB-End gibt es auch für Assembler: Es handelt sich um einen Befehl, der den eigenen Prozess beendet. Ich glaube, unter Windows passiert das mit einem "ExitProcess" oder so. Ist man der einzige Prozess auf dem System (z. B. man ist das Betriebssystem, also der Kernel), dann empfiehlt sich auch ein Reboot mittels

Code: Alles auswählen

mov al,0xFE
out 0x64,al
oder ein Aufhänger, entweder stromsparend über

Code: Alles auswählen

cli
hlt
oder ganz einfach durch

Code: Alles auswählen

jmp $