Announcement

Collapse
No announcement yet.

TASM's conditional jumps

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TASM's conditional jumps

    Hi

    Ich assembliere mit TASM in .IDEAL,.386,USE32 Mode. Bei bedingten Sprüngen vorwärts fügt mir TASM vier NOP's rein. Warum und wie kann ich das verhindern ??

    <pre>

    so sieht der *.ASM aus:<br>

    XYZ PROC<br>

    JNZ @@1
    ...
    @@1:
    ENDP<br>

    das wird in der *.lst Datei angezeigt, bzw. beim debuggen:<br>

    XYZ PROC <br>

    JNZ @@1
    NOP // die sollen weg !
    NOP
    NOP
    NOP
    @@1:

    ENDP<br>

    </pre>

    Gruß Hagen

  • #2
    Hi

    Hat sich erledigt, Parameter /mx, x= Anzahl der Durchläufe muß angegeben werden. Dank an NicoDE

    Gruß, IC

    Comment


    • #3
      Nachtrag für die Nachwelt... ;o)<p>
      Bedingte Sprünge haben nur eine begrenzte Reichweite.<br>
      Wird diese überschritten, muß der Compiler anderen Code generieren.<br>
      (einen Long-Jump, über den bei nicht erfüllter Bedingung gesprungen wird)<br>
      Bei einem einzigen Durchlauf weiß der Compiler noch nicht, ob die<br> Distanz überschritten wird und reserviert erstmal soviel Platz,<br>
      wie für oben erwähnte Long-Jump-Variante nötig wäre,<br>
      und füllt den bleibenden Platz mit NOP (NO OPeration) auf.<br>
      Bei einem zweiten/dritten Durchlauf "weiß" er es dann, ...<p>
      Natürlich könnte man einige Sachen schon vorher "wissen",<br>
      einen Compiler zu bauen ist schon schwer genug--wozu also unnötige Fehlerquellen ;o)<p>
      Der Standard-Wert für die Anzahl der Durchläufe ist übrigens 3.<br>
      (siehe auch im MAKEFILE der Delphi-RTL, für die Enterprise-Besitzer)<p>

      Gruß Nic

      Comment


      • #4
        Hi Nico

        Wenn der Standardwert 3 -> /m3 ist, warum macht TASM ohne diesen Param nur einen Durchlauf ?? Irgendwo hab ich was von'er KonfigFile gelesen.

        Gruß Hagen

        PS: Übrigens hier mal ein großes Lob an die Borland-Programmer für deren gutes Toolmenu der IDE. Es war mir ein leichtes mein Delphi in eine TASM taugliche Oberfläche zu verwandeln

        Comment


        • #5
          mit "Standard" meinte ich nicht den Standard-Wert, den der Compiler verwendet, wenn der Parameter nicht angegeben wird,<br>
          sondern, den Wert der meist (fast überall) verwendet wird--und, ja, es gibt eine cfg.

          Gruß Nic

          Comment


          • #6
            Hi Nico

            Vielleicht haste ja für folgendes eine Lösung:

            Ich hatte es abgesehen auf das ALIGN Feature vom TASM, da der integrierte Delphi Assembler das ja nicht kennt. Tests mit TASM Obj zeigten aber das der fucking Delphi-Linker dieses Alignment wieder zerstört. Alles was Delphi zustandebringt ist eine Alignment an DWord-Grenze. Für meine Bedürfnisse ist es aber extrem wichtig auf TWord Grenze auszurichten. D.h. ein TASM obj. mit Align(32) kann durch den Delphi Linker wieder falsch ausgerichtet werden, mit einem Versatz vom 4^x.

            Ich könnte nun den Code zur Laufzeit "verschieben", aber das kann ja nicht das Ziel sein.

            Gruß Hage

            Comment


            • #7
              Nein, ich kenne keinen Weg Delphi etwas anderes beizubringen als 1, 2 oder 4 Bytes.<br>
              (das ist insofern ärgerlich weil es der Compiler eigentlich könnte, und sowohl das *.OBJ als auch das *.DCU-Dateiformat es jetzt schon hergeben :/ )

              Gruß Nic

              Comment


              • #8
                Hi

                Nur gut das die neueren multipiplined CPU's wie der Pentium II-IV relativ unkritisch reagieren, hauptsache ein DWord Align.

                Ärgerlich sind halt die Cyrix und AMD Prozessoren.

                Andere Frage: Kennste Links die sich mit hochoptimierten Algo's befassen, bzw. Tricks wie man bestimmte ASM-Aufgaben schneller hinbekommt. Ich habe einiges gefunden über Optimierungen, scheint aber so ziemlich aus einer Basisquelle zu stammen und eigentlich alles schon bekannt. Was ich suche sind möglichst Sourcen, wie z.b. einen schnelleren SHLD / SHRD / DIV Ersatz.

                Ich bräuchte auch einen sehr guten Profiler, sowas wie Intels-VTune. Dieser ist aber zu teuer. Empfehle mir bitte NICHT sowas wie Prodel o.ä. Schrott, das kann ich selber. Ne, was mich am VTune so fasziniert ist die Berechnung der Cycles, Execution-Line, Pipes und die Branches/Misses Statistiken.

                Gruß Hagen

                PS: Achso, kann ich irgendwie das L1/L2 Cache Verhalten per Program beeinflussen, z.B. Preloading von Daten/Code.
                By the Way: wie kann ich unter NT/2000 in einer Ring3 App auf Ring0 wechseln ? Für Win9x ist mir das bekannt, unter NT/2000 sind SLDT/SGDT aber privelegierte Instructions :

                Comment


                • #9
                  Bei Deiner ersten Frage muß ich leider passen--ich kenne leider keine derartigen Seiten. Nur durch Zufall habe ich bisher vereinzelte Seiten gefunden. http://www.embedded.com ist zwar nicht schlecht, obwohl aber meist allgemeinerer Natur und nicht sonderlich x86-orientiert.<p>
                  Zum postum scriptum fällt mir nur ein, daß Du mittels NtOpenSection oder <b>ZwOpenSection</b> (beide in ntdll.dll) das Kernel-Objekt <b>\Device\PhysicalMemory</b> (nomen est omen Zugriff auf den physikalischen Speicher bekommen kannst und so ein eigenes Call-Gate in die Tabelle schreiben kannst.<br>
                  Es gibt bei http://EliCZ.com ein Beispiel (DumpXDT), bei dem sowohl unter Windows 9x als auch WinNT die CR-Register ausgelesen werden.<br>
                  Da man aber für diese Methode lokale Adminrechte benötigt (für den phys. Speicher), ist es eher Spielerei und ein Treiber schneller und sicherer geschrieben...<br>
                  Es handelt sich übrigens um keinen Exploit oder Bug, obwohl die Methode vor 'kurzem' in diversen Linux-Bugtraq's kursierte; sondern eher um eine vergessene Möglichkeit (siehe Admin-recht).

                  Gruß Nic

                  Comment

                  Working...
                  X