Autor |
Beitrag |
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 12.02.10 19:04
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
Delphi-Quelltext 1: 2: 3: 4: 5:
| var a: Byte = 0; asm mov [a], eax 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
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Fr 12.02.10 19:14
Für eax:=0 gibt es in Assembler bestimmt mannigfaltige Wege. Historisch hat sich dort mal das
Delphi-Quelltext 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.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 12.02.10 19:22
würd nicht
Delphi-Quelltext 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 12.02.10 19:31
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:
Delphi-Quelltext 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.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Fr 12.02.10 19:32
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Fr 12.02.10 19:33
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 
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 12.02.10 19:46
Hallo!
Irgendwie habe ich elundril's Post gar nicht mitbekommen.
Martok du hast geschrieben 'Anweisungen zum Register retten nach Geschmack ergänzen.' Was heißt 'Register retten'?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 12.02.10 20:03
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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Fr 12.02.10 20:09
elundril hat folgendes geschrieben : | 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.
Delphi-Quelltext 1: 2: 3: 4: 5:
| asm push ebx; mov ebx, 42; pop ebx; 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 phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Jakob_Ullmann 
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 12.02.10 20:21
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. 
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Sa 13.02.10 13:14
Allesquarks hat folgendes geschrieben : | 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
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: So 14.02.10 01:28
Nagut dann ist es halt das Codesegment. An der Aussage ändert das aber wenig.
|
|