Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
ASM: Register initialisieren (EAX := 0)
spacer
Autor Nachricht
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star

Beiträge: 1594
Erhaltene Danke: 3
Dabei seit: 07.11.2006


Win 7, Ubuntu GNU/Linux
MonoDevelop, MS Visual C# 2008 Express, Lazarus, Eclipse, NetBeans, Code::Blocks, CodeLite
BeitragVerfasst: Fr 12.02.10 19:04  Antworten mit Zitat Beitrag melden
Hallo!

Ich mache weiter mit meinen ersten Gehversuchen in Assembler. Die Frage ist nun: wie kann ich einem Register einen Wert zuweisen? Also sowas wie EAX := 0? Gut, ich könnte sowas wie

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
var
a: Byte = 0;
asm
mov [a], eax // edit: natürlich anders herum...
end;


machen, aber ich möchte wirklich reinen Assemblercode (beziehe mich auf Inline-Assembler). Wie kann ich das machen?


Zuletzt bearbeitet von Jakob_Ullmann am Fr 12.02.10 19:52, insgesamt 1-mal bearbeitet
Private Nachricht sendenPosting in privater Nachricht zitieren
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 510
Dabei seit: 18.03.2005
Wohnort: Berlin

Win XP Prof
Delphi 7 E
BeitragVerfasst: Fr 12.02.10 19:14  Antworten mit Zitat Beitrag melden
Für eax:=0 gibt es in Assembler bestimmt mannigfaltige Wege. Historisch hat sich dort mal das
ausblenden Delphi-Quelltext markieren
1:
2:
3:
asm
xor eax,eax;
end;
durchgesetzt, da xor nur einen Takt benötigte. Ist natürlich nicht ganz intuitiv. Daher weiß ich nicht, ob das heute immer noch zum guten Ton gehört.
Beliebige Werte, welche nicht besonders sind, musst du in der Tat mit der Definition einer konstanten zuweisen.
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 3301
Erhaltene Danke: 27
Dabei seit: 28.12.2005
Wohnort: Österreich, Wien

Windows Vista
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 12.02.10 19:22  Antworten mit Zitat Beitrag melden
würd nicht

ausblenden Delphi-Quelltext markieren
1:
2:
3:
asm
mov eax, 0;
end;


auch gehen. und benötigt soweit ich das beurteilen kann doch auch nicht gerade mehr takte?

lg elundril

_________________
"Und warum studierst du Informatik?" - "Weil ich gerne Computerspiele spiele, programmieren hass ich eigentlich." *wallbash*
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star

(Threadstarter)

Beiträge: 1594
Erhaltene Danke: 3
Dabei seit: 07.11.2006


Win 7, Ubuntu GNU/Linux
MonoDevelop, MS Visual C# 2008 Express, Lazarus, Eclipse, NetBeans, Code::Blocks, CodeLite
BeitragVerfasst: Fr 12.02.10 19:31  Antworten mit Zitat Beitrag melden
Also danke schonmal. Ich hab ne Weile gebraucht, um den Code zu verstehen, aber eigentlich ist es ja ganz logisch. Nur hatte ich gedacht, könnte ich dann sowas wie das hier machen:

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
asm
xor eax, eax;
add eax, $3;
end;


Oder kann ich die $3 nicht so verwenden? Wenn nicht, müsste ich ja jede Zahl, die ich irgendwo verwenden will, vorher im var- / const-Abschnitt angeben. Geht das denn wirklich nicht anders? Das 'EAX := 0' im Titel war ja eigentlich nur beispielhaft gemeint.
Private Nachricht sendenPosting in privater Nachricht zitieren
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Nussknacker 2009 - 1. Rang

Beiträge: 1952
Erhaltene Danke: 11
Dabei seit: 05.08.2006
Wohnort: MD

Win2000, IksPeh
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Fr 12.02.10 19:32  Antworten mit Zitat Beitrag melden
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
asm
xor eax,eax; // immer noch, ja ;)
mov eax, 0; // das gleiche, aber langsamer
sub eax, eax; // esotherisch und klappt nur wenn der Wert > 0 war

mov ebx, eax;
not ebx;
and eax, ebx; // okay, jetzt wirds wirklich komisch

and eax, 0; // einen hab ich noch :P
end;


Direkte Zuweisung:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
asm
mov ebx, 23; // geht nicht wirklich anders

xor eax, eax; // okay, doch...
add eax, 23;
end;


(Anweisungen zum Register retten nach Geschmack ergänzen)

_________________
"[the ++ operator] is a parable on learning: even if you throw away the result, you still gain something" - mgedmin on Freenode (Außer: c=c++;)
Ich code EdgeMonkey - In dubio pro Setting-~==~- #ee-lounge in Freenode
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 510
Dabei seit: 18.03.2005
Wohnort: Berlin

Win XP Prof
Delphi 7 E
BeitragVerfasst: Fr 12.02.10 19:33  Antworten mit Zitat Beitrag melden
Historisch gesehen brauchte man für Speicherzugriffe glaube ich 3 Takte. Weiß nicht wie das heute ist. Ich glaub da muss man immer noch unterscheiden, ob der Wert schon im Cache ist oder nicht. Das automatische Prefetching ist zwar sehr gut heutzutage, so dass es evt fast immer gleichschnell ist, aber bei xor fällt das alles weg und man belegt damit auch keinen Cache, den man gar nicht braucht. Außerdem ist der opcode von xor eax,eax soweit ich weiß kleiner. Wobei ich nicht weiß, ob es zu Latenzen wegen Opcode nachladen kommt, da der Befehlscode ja wahrscheinlich perfekt linear im Speicher liegt.
Du kannst die Konstante direkt in den Code schreiben und brauchst keine Deklaration. Wobei dir natürlich klar sein muss, dass im Datensegment des fertigen Programmes die Konstanten natürlich speicher belegen.

PS: Bei deinem Code könntest du auch gleich 3 zuweisen :D
Private Nachricht sendenPosting in privater Nachricht zitieren
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star

(Threadstarter)

Beiträge: 1594
Erhaltene Danke: 3
Dabei seit: 07.11.2006


Win 7, Ubuntu GNU/Linux
MonoDevelop, MS Visual C# 2008 Express, Lazarus, Eclipse, NetBeans, Code::Blocks, CodeLite
BeitragVerfasst: Fr 12.02.10 19:46  Antworten mit Zitat Beitrag melden
Hallo!

Irgendwie habe ich elundril's Post gar nicht mitbekommen.

user profile iconMartok du hast geschrieben 'Anweisungen zum Register retten nach Geschmack ergänzen.' Was heißt 'Register retten'?
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 3301
Erhaltene Danke: 27
Dabei seit: 28.12.2005
Wohnort: Österreich, Wien

Windows Vista
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 12.02.10 20:03  Antworten mit Zitat Beitrag melden
push und pop operationen um die werte die vorher im register waren auf den stack zu legen und dann wieder zu holen. afaik.

lg elundril

_________________
"Und warum studierst du Informatik?" - "Weil ich gerne Computerspiele spiele, programmieren hass ich eigentlich." *wallbash*
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Nussknacker 2009 - 1. Rang

Beiträge: 1952
Erhaltene Danke: 11
Dabei seit: 05.08.2006
Wohnort: MD

Win2000, IksPeh
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Fr 12.02.10 20:09  Antworten mit Zitat Beitrag melden
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
push und pop operationen um die werte die vorher im register waren auf den stack zu legen und dann wieder zu holen.

Röschtösch.
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
asm
push ebx; // auf den Stack werfen
mov ebx, 42; // was mit dem Register machen
pop ebx; // und den alten Wert wieder zurück holen
end;


Müsste man in meinem Beispiel vom Post oben nur für ebx machen... falls das eine Funktion ist. Dann ist ja eax der Rückgabewert, und den sollte man schon drin lassen ;)

Wollte mich grad nochmal rückversichern, und da hat mir Google das entgegengeworfen:
de.wikibooks.org/wik...Assembler_und_Delphi

Etwas kurz, stimmt aber immerhin ;)

_________________
"[the ++ operator] is a parable on learning: even if you throw away the result, you still gain something" - mgedmin on Freenode (Außer: c=c++;)
Ich code EdgeMonkey - In dubio pro Setting-~==~- #ee-lounge in Freenode
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star

(Threadstarter)

Beiträge: 1594
Erhaltene Danke: 3
Dabei seit: 07.11.2006


Win 7, Ubuntu GNU/Linux
MonoDevelop, MS Visual C# 2008 Express, Lazarus, Eclipse, NetBeans, Code::Blocks, CodeLite
BeitragVerfasst: Fr 12.02.10 20:21  Antworten mit Zitat Beitrag melden
Das klingt logisch. Vielen Dank für die vielen Antworten!

Übrigens: Den Assembler und Delphi Abschnitt finde ich ja echt praktisch, weil ich habe mich sonst nur auf das Assembler (80x86 Prozessor) Wikibook berufen. Richtige Bücher gibt es da ja fast keine zum Thema, wie es ausschaut. :(
Private Nachricht sendenPosting in privater Nachricht zitieren
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star

Beiträge: 565
Erhaltene Danke: 2
Dabei seit: 16.09.2006



BeitragVerfasst: Sa 13.02.10 13:14  Antworten mit Zitat Beitrag melden
user profile iconAllesquarks hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst die Konstante direkt in den Code schreiben und brauchst keine Deklaration. Wobei dir natürlich klar sein muss, dass im Datensegment des fertigen Programmes die Konstanten natürlich speicher belegen.


Nö: diese Konstanten stehen im Opcode. Es sind auch keine echten Konstanten, sondern gelten eben nur für diesen einen Befehl, deshalb lohnt sich das Nullen per XOR auch: wenn man 100 mal MOV EAX,0 schreibt, steht auch 100 mal ein Byte mit 00 im Codespeicher.

Gruss Reinhard
Private Nachricht sendenPosting in privater Nachricht zitieren
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star

Beiträge: 510
Dabei seit: 18.03.2005
Wohnort: Berlin

Win XP Prof
Delphi 7 E
BeitragVerfasst: So 14.02.10 01:28  Antworten mit Zitat Beitrag melden
Nagut dann ist es halt das Codesegment. An der Aussage ändert das aber wenig.
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home