Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Assembler: Proc oder Macro? (https://www.delphipraxis.net/30819-assembler-proc-oder-macro.html)

moritz 29. Sep 2004 18:34


Assembler: Proc oder Macro?
 
Sers,

ich beschäftige mich seit kurzer Zeit mit Assembler und bin gerade dabei ein Programm zu schreiben, dass PI nach der Monte-Carlo-Methode berechnet. Ich bin gerade dabei, die Anzahl der Tropfen einzulesen und habe dafür das folgende Macro geschrieben:
Code:
get_dropcount Macro buffer
    PUSHA
    MOV DX , OFFSET buffer
    MOV AH , 0Ah
    INT 21h
    CMP buffer.anz , 0
    JE Null
    JNE Ende
  Null:
    echo msg4 ; Null ausgeben
    POPA
  Ende:
    echo msg5 ; Nicht Null ausgeben
    POPA
EndM
Die Struktur von Buffer ist
Code:
  puffer   STRUC
    max      DB       13
    anz      DB       ? 
    txt      DB       16 DUP (?)
  puffer   ENDS    
  buffer   puffer   <>
und echo ist ein Macro, dass das erste Argument als Text ausgibt.

Mein Problem ist, dass wenn "Null" ausgeführt wird danach auch "Ende" ausgeführt wird, was ich nicht will und das RET aus der Proc fehlt mir. (ich würde gerne ein Macrobibilithek aufbauen)
Deswegen hab ich folgende Fragen:
1) Gibt es eine Art "RET" auch in Macros oder muss ich einfach noche in Label "GanzEnde" ans Ende setzten hinter dem nichts mehr passiert?
2) Was ist der Vorteil / Nachteil eines Macros / einer Prozedur?
3) Okay, das ist noch eine andere Frage: Ich habe mal versucht nach jeweils POPA "PUSH 0" für Null: und "PUSH 1" für Ende: zu übergeben, um herauszufinden, ob eine Zahl eingegebn wzurde. Allerdings sind dann recht bizarre Dinge passiert. Wie kann ich sonst eine Art Result zurückgeben?

Gruß, Moritz

Muetze1 30. Sep 2004 11:18

Re: Assembler: Proc oder Macro?
 
Moin!

Ein Makro ist ein Code Schnipsel den du anhand des Makronamens direkt an der jeweiligen Stelle einfügst - über den Namen. Die Parameter etc werden dazu genutzt das Makro so umzubilden, dass er die jeweiligen Register dementsprechend belegt wir im Makro benötigt. Ein Makro hat auch deshalb kein Return, da es kein Aufruf ist sondern direkt in den Code eingefügt wird. Ein Makro-Code kommt also x-mal im Programm vor - so oft wie es benutzt wird. Eine Procedure wird halt nur einmal eingefügt und alle springen zu ihr hin und wieder zurück.

zu 1.) Es gibt irgendwie eine "Makro-Verlassen" Anweisung, aber frage mich nicht wie die heisst, da ich keine Makro's nutze...
zu 2.) Vorteil: kann bis zu einer bestimmten Menge in einem Codeabschnitt für eine bessere Cache Nutzung/Pipeline Ausnutzung führen bzw. einer besseren Optimierbarkeit gegenüber einem Procedureaufruf, da Sprünge meist zu entfernteren Adressen springen. Nachteil: Ein Makro wird immer und immer wieder neu an der Stelle eingefügt, das bläht den Code auf - vor allem wenn so oft das gleiche an den Stellen steht. Da muss man dann den Mittelweg zwischen Geschwindigkeit und Codegrösse finden.
zu 3.) Ich verstehe die Frage nicht, schon alleine weil du dort POPA und einen normalen PUSH Befehl verwendest. Grundlegend kann ich zumindest sagen, das du die Grösse der Konstante die gepusht wird festlegen kannst.

MfG
Muetze1

moritz 30. Sep 2004 14:05

Re: Assembler: Proc oder Macro?
 
Okay, Danke. Das wird in meinem Buch nämlich irgendwie nicht erklärt ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz