ASM kleine Anfangsfragen

Fragen zu allen anderen Programmiersprachen.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

ASM kleine Anfangsfragen

Beitrag von Toshy »

Hallo.

Ich habe von ASM leider gar keine Ahung, schaue mir gerade ein paar kleine Seiten an um ein bissl die Grundlagen zu verstehen. Ich will nicht wirklich ASM lernen, nur versuchen den Rechner etwas besser zu verstehen. Durch das Thema "threadsicherheit auf multicore" bin ich nun doch dazu gekommen das mal etwas genauer anzuschaeun.
Bisher hab ich wenn ich sowas gesehen habe nur buchstabenwirrwar erkannt. Liegt wohl auch daran, daß ich die hexzahlen nicht lesen kann.

Nun habe ich gelesen das es halt auch anweisungen gibt und register, stacks, aber wohla uch variablen. ich bin zwar schon daran gescheitert selbst variablen in ASM zu erstellen, aber ist auch nicht so wichtig.

Ich will es also erstmal mit vorhandenen PBvariablen versuchen.

Code: Alles auswählen

! inc [v_tt]
klappt, genauso mit dec. es wird um eines erhöht oder vermindert.
aber in diesem bord fand ich normal nur

Code: Alles auswählen

! inc dword[v_tt]
stehen.
Warum? was ist da drann nun anders?

ich wollte nun MOV dest,src
nutzen um einen geänderten wert auch in ASM in eine andere PBvariable zu kopieren

Code: Alles auswählen

! mov [vt_tt2],[v_tt] 
geht nicht. muß ich erst den umweg über ein register (eax) gehen?

es geht darum später etwas threadsicheres zu basteln, also lock zu verwenden. aber wenn ich über ein register gehe und dann im nächsten Schritt dann wieder in eine Variable schreibe, dann kann dazwischen ja was passieren (anderer thread). ein "lock" nutzt dann auch nicht.

Vielleicht kann mir hier ja mal jemand einen kleinen Beispiecode erstellen der Folgendes beinhaltet:
erstellen einer Variablen (integer .i) in pbcode (Variable1.i)
erstellen einer Variablen (integer) in ASM
eine der Variablen in ASM um eines erhöhen
die erhöhte variable in die andere Variable "reinkopieren".
erhöhen und kopieren bitte nicht in einem schritt (nicht mit dem XCHG falls das gehen würde)

Toshy
[/code]
Zuletzt geändert von Toshy am 06.05.2009 01:44, insgesamt 1-mal geändert.
1. Win10
PB6.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Das folgende wird dir sicherlich weiterhelfen. Damit habe ich mich auch eingearbeitet:
Flatassembler manual

Da siehst du auch, dass 'MOV' nur funktioniert, wenn einer der Parameter ein Register ist.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Gehört auch zu den Seiten in die ich reinschauen wollte, aber ohne Englischkenntnisse hilft es nicht wirklich. Und bei sowas hilft googletranslate auch nicht.

ich habe mir auch einige deutsche Anleitungen versucht anzuschauen, aber da hab ich halt schon am Anfang einiges nicht verstanden, anderes schon, wenigstens etwas. Aber wie gesagt, alleine das erstellen einer Variable klappt bisher nicht.
da gab es wenn ich mich recht erinnere ne "data"section in der man dann einem "namen" etwas zuweisen muß.
aber bisher hat das hier nicht geklappt.

wenn ich keine deutsche erklärung zum code habe, kann man sich meißt über den Code einiges erklären, aber da ASM leider ganz anders ist wird`s schwer. Daher auch die Frage zu den beiden "increments" (mit und ohne dword). auch den unterschied zwischen bx und eax hab ich nicht wirklich kapiert. controlregister, generalregister, ohne Textverständis nicht wirklich erklärlich. Das es bei den Registern l,h,x gibt (lowbyte,h..,) hab ich glaube ich kapiert was aber nun genau e bzw. ea ist, da wird es aktuell auch noch schwierig ;-)
Ich versuche erstmal den Grund zu verstehen, dann komme ich vielleicht auch mit einigen englischen Dingen klar. Und was ist einfacher als 'ne variable zu erstellen und mit ihr zu rechnen? Tja, anscheind ist für mich alles einfacher als das *grins*
1. Win10
PB6.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich würde dir empfehlen dir ein bisschen Englisch anzueignen. Um schnell mal ein Wort
nachzuschlagen, dass du nicht weißt, gibt es auch Plugins für FireFox, die dir die
Übersetzung auf Mausklick zeigen oder du nutzt einfach http://dict.leo.org.

Ich weiß jetzt gerade nicht, wie alt du bist. Aber du brauchst noch nicht mal Schul-
Englischkenntnisse um etwas ansatzweise zu verstehen. Das geht wirklich sehr schnell
und einfach. Erfahrungen sammeln und auf geht's.

Deutsche ASM-Tutorials sind tatsächlich sehr rar und das meiste davon auch noch
veraltet. Dewegen ist Englisch dafür leider ein Muss.

Auf der von mir verlinkten Seite sind viele wichtige Befehle in Prosa erklärt, was es für dich
natürlich nicht gerade leichter macht. Im Grunde brauchst du sicherlich nur eine Art
tabellarische Übersicht über die Befehle und die möglichen Parameter.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Hier ein kurzer Beispiel-Code:

Code: Alles auswählen

Global 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!

! inc dword[tt]     ;erhöht die ASM-Variable um 1. Bei ASM-Variablen ist zwingend eine Größe 
                    ;anzugeben! Es geht auch z.B. "inc byte[tt]"; erhöht nur das Byte an der 
                    ;Speicherstelle tt um 1
! mov eax,[tt]      ;Beim MOV-Befehl muss mindestens ein Operand ein Register sein!
! mov [v_tt],eax    ;die ASM-Variable (ihr Wert) wurde über ein Register in die PB-Variable kopiert
Debug tt           ;zeigt die PB-Variable an 
Debug PeekL(?X)    ;so kann man ASM-Variablen auslesen

End                ;wichtig, sonst wird alles Nachfolgende auch als ausführbarer Code betrachtet!

!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 
!tt: dd 12345      ;ein DWord (4 Bytes) anlegen mit dem Wert 12345
In FAQ´s und Tut´s hatte ich mal ein ASM-Tut reingestellt, vielleicht nutzt es dir was.

Gruß
Helle
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

@Helle: Wieso ist Global Pflicht? Es geht doch auch ohne Global:

Code: Alles auswählen

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!

! inc dword[tt]     ;erhöht die ASM-Variable um 1. Bei ASM-Variablen ist zwingend eine Größe
                    ;anzugeben! Es geht auch z.B. "inc byte[tt]"; erhöht nur das Byte an der
                    ;Speicherstelle tt um 1
! mov eax,[tt]      ;Beim MOV-Befehl muss mindestens ein Operand ein Register sein!
! mov [v_tt],eax    ;die ASM-Variable (ihr Wert) wurde über ein Register in die PB-Variable kopiert
Debug tt           ;zeigt die PB-Variable an
Debug PeekL(?X)    ;so kann man ASM-Variablen auslesen

End                ;wichtig, sonst wird alles Nachfolgende auch als ausführbarer Code betrachtet!

!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
!tt: dd 12345      ;ein DWord (4 Bytes) anlegen mit dem Wert 12345
Und innerhalb einer Prozedur heißt die Variable dann halt p.v_Variablenname statt v_Variablenname.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Programm-technisch ist hier Define genau wie Global: Es wird in einer Data-Section Platz für eine Variable reserviert. Ich persönlich bevorzuge den Ausdruck Global, weil er zum Ausdruck bringt, dass diese Variable "global", also für Alle zur Verfügung steht. Im Gegensatz dazu ist Protected, was die Variable auf den Stack legt; also nichts in der Data-Section reserviert. Der Name dieser Variablen (p.v_XYZ) ist dann "nur" ein Platzhalter für "ESP+Adress-Offset", also Adressierung auf dem Stack.

Gruß
Helle
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

http://ivs.cs.uni-magdeburg.de/bs/lehre ... l#register ist leider auch nicht so wirklich aktuell, aber um z.B zu sehen was so die Register sind ist es nicht so schlecht.

Helle hat geschrieben:(p.v_XYZ) ist dann "nur" ein Platzhalter für "ESP+Adress-Offset", also Adressierung auf dem Stack.
Wenn ich mal fragen darf: Kann man demnach den Stackpointer ESP in einer Variablen speichern, dann das esp z.B zum rechnen nutzen und anschließend den alten Wert wieder zurückschreiben? Oder würde das zu Problemen führen?
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Natürlich kann man ESP auch so verwenden:

Code: Alles auswählen

Global X.l
Global Y.l

!mov [v_X],esp
Debug Hex(X)
!mov esp,12345
!add esp,67890
!mov [v_Y],esp
!mov esp,[v_X]
Debug Y
Debug Hex(X)
ABER: Während dieser "Ausleihzeit" dürfen natürlich keine Stackzugriffe erfolgen! Kein push, pop, call usw. Also keine Funktions-Aufrufe, kein Debug usw. Ich selbst nutze fleissig das EBP-Register, aber von ESP lasse ich lieber die Finger :mrgreen: !

Gruß
Helle
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Helle hat geschrieben:Natürlich kann man ESP auch so verwenden:
[...]
Ich selbst nutze fleissig das EBP-Register, aber von ESP lasse ich lieber die Finger :mrgreen: !
Gut, danke, habe jetzt auch esp in nutzung. Funktioniert super (aber solange ich noch andere Register frei habe werde ich wohl die eher nutzen, denn die muss ich ja nicht sichern) :allright:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Antworten