Assembler in x64



  • Hallo,

    Inline-Assembler wurde bei x64 ja entfernt. Wie ist nun möglich
    das mit einer externen Datei zu lösen und die Funktionen in C
    verwenden zu können? Ich verwende WDK 7600.16385.1 als Compiler.

    Freundliche Grüsse,

    NxBeam



  • NxBeam schrieb:

    Ich verwende WDK 7600.16385.1 als Compiler.

    Wäre mir neu, dass das Windows Driver Kit ein Compiler ist ;-D

    NxBeam schrieb:

    Wie ist nun möglich
    das mit einer externen Datei zu lösen und die Funktionen in C
    verwenden zu können?

    Indem man die Funktion(en) mit MASMs x64 Variante (ml64.exe) implementiert und anschließend die erzeugte Objektdatei beim linken des C/Cpp Programms angibt.
    Das ist nichts für Anfänger und man sollte überlegen, ob das Vorhaben nicht mittels compiler intrinsics gelöst werden kann.



  • Warum wurde Inline Assembler bei x64 ausgerichteten Projekten entfernt? o_O



  • quasimodule schrieb:

    NxBeam schrieb:

    Ich verwende WDK 7600.16385.1 als Compiler.

    Wäre mir neu, dass das Windows Driver Kit ein Compiler ist ;-D

    NxBeam schrieb:

    Wie ist nun möglich
    das mit einer externen Datei zu lösen und die Funktionen in C
    verwenden zu können?

    Indem man die Funktion(en) mit MASMs x64 Variante (ml64.exe) implementiert und anschließend die erzeugte Objektdatei beim linken des C/Cpp Programms angibt.
    Das ist nichts für Anfänger und man sollte überlegen, ob das Vorhaben nicht mittels compiler intrinsics gelöst werden kann.

    Vielen Dank für die Antwort. Mit Intrinsics habe ich es auch schon versucht.
    Nur habe ich das Gefühl ich habe etwas falsch gemacht, weil ich garnicht recht
    weiss wie man die bei WDK verwendet ohne einen Fehler zu bekommen. Woher
    bekommt man eigentlich diese "ml64.exe" her?

    Freundliche Grüsse,

    NxBeam



  • NxBeam schrieb:

    Woher bekommt man eigentlich diese "ml64.exe" her?

    Die hast Du schon. Durchsuche mal den WDK-Ordner. Dein WDK enthält nämlich nicht nur einen vollständigen MSVC-Compiler (Version 15.00.30729.207), sondern ist ein Bausatz für die Treiberherstellung, in dem auch andere nützliche Dinge zu finden sind.

    Du kannst übrigens jeden 64-Bit-Windows-Assembler nehmen, z.B. NASM oder GAS. Er muss nur 64-Bit-OBJ-Dateien herstellen können.

    @warumistdiebananekrumm: Der 64-Bit-Inline-Assembler wurde nicht entfernt, sondern niemals eingebaut. Das war den Entwicklern wohl zu umständlich. Auch der 32-Bit-Inline-Assembler wurde schon eine ziemliche Weile nicht mehr upgedatet.

    viele grüße
    ralph



  • rkhb schrieb:

    NxBeam schrieb:

    Woher bekommt man eigentlich diese "ml64.exe" her?

    Die hast Du schon. Durchsuche mal den WDK-Ordner. Dein WDK enthält nämlich nicht nur einen vollständigen MSVC-Compiler (Version 15.00.30729.207), sondern ist ein Bausatz für die Treiberherstellung, in dem auch andere nützliche Dinge zu finden sind.

    Du kannst übrigens jeden 64-Bit-Windows-Assembler nehmen, z.B. NASM oder GAS. Er muss nur 64-Bit-OBJ-Dateien herstellen können.

    @warumistdiebananekrumm: Der 64-Bit-Inline-Assembler wurde nicht entfernt, sondern niemals eingebaut. Das war den Entwicklern wohl zu umständlich. Auch der 32-Bit-Inline-Assembler wurde schon eine ziemliche Weile nicht mehr upgedatet.

    viele grüße
    ralph

    Habe die ml64.exe gefunden. Vielen Dank für den Hinweis. Nun bin ich mir nicht ganz sicher über die Parameter. Kännte mir jemand ein paar wichtige Parameter nennen?

    Freundliche Grüsse,

    NxBean



  • > ml64.exe X.asm
    -> X.obj



  • NxBeam schrieb:

    Nun bin ich mir nicht ganz sicher über die Parameter. Kännte mir jemand ein paar wichtige Parameter nennen?

    http://msdn.microsoft.com/en-us/library/s0ksfwcf.aspx

    Mir scheint aber, Du solltest ein bisschen mit 32-Bit üben:

    http://www.codingcrew.de/masm32/index.php

    In dem Paket findet man alles, was das Herz begehrt, auch Beispiele, Dokumentationen und Tutorials. Allerdings alles auf Englisch...

    Dein WDK-Compiler kann auch 32-Bit. Bei 64-Bit sind nicht nur die 64-Bit-Zusätze des Prozessors, sondern auch die ganz andere Calling Convention von 64-Bit-Windows zu beachten.

    viele grüße
    ralph



  • rkhb schrieb:

    Dein WDK-Compiler kann auch 32-Bit. Bei 64-Bit sind nicht nur die 64-Bit-Zusätze des Prozessors, sondern auch die ganz andere Calling Convention von 64-Bit-Windows zu beachten.

    Ist das nicht eher ein Vorteil? Die x86-64-Calling-Conventions sind deutlich weniger verrückt und entsprechen eher dem, was auch auf anderen Architekturen gemacht wird.

    IMHO ist x86-64 deutlich angenehmer auf Assemblerebene zu programmieren als i386. Wenn man also eh gerade erst mit dem Lernen beginnen will, warum dann nicht gleich im Long Mode anfangen? Mit dem Legacy-Krempel kann man sich immer noch beschäftigen, wenn man es denn wirklich mal benötigen sollte.



  • kotnascher schrieb:

    Die x86-64-Calling-Conventions sind deutlich weniger verrückt

    Erläuter doch bitte mal, was du dir in diesem Zusammenhang unter "verrückt" vorstellst und warum dies alle Konventionen betrifft.

    kotnascher schrieb:

    und entsprechen eher dem, was auch auf anderen Architekturen gemacht wird.

    Das ist belanglos.



  • kotnascher schrieb:

    Wenn man also eh gerade erst mit dem Lernen beginnen will, warum dann nicht gleich im Long Mode anfangen?

    Wenn es für 64-Bit-Assembler gute Lehrmaterialien und eine gute Hilfe in Foren gibt... aber gibt es das?

    Ich selbst kann z. B. in 64-Bit nur rudimentäre Hilfe geben. Solange es OllyDbg nicht in 64-Bit gibt, beschäftige ich mich nicht gezielt mit dem Kram.

    viele grüße
    ralph



  • Es reicht mit 16 Bit Assembler anzufangen. Aber man muß nicht mehr allzutief in das Interruptlernen einsteigen, sondern geht über, Assemblerdirektiven, Funktionen, Bibliotheken zu lernen (von Microsoft Masm, Borland Tasm, Hutchs Masm32Bibs, von Linux, C-Bibliotheken usw. Bei Linux muss man nicht allzuviel Betriebsinterna lernen, bei Windows schon, u.a. auch wegen der Vielzahl an Funktionen.)
    Diese sagen allerdings auch wieder nix über RealMode oder Protected Mode oder Long Mode, wozu das gut sein soll usw. aus. oder über die Feinheiten von zugrundeliegende Algorithmen oder technischen Finessen. Vieles überdeckt sich, z.B. mit gutem C-Compiler und Disassembler lernt man auch so einige Sachen.

    Nicht ganz unwichtig sind auch Überlegungen, wie man Rechnereien mit großen Zahlen und kleinen (8 Bit) Registern hinbekommt oder mehrdimensionale Arrays/Tabellen, wie sich die Register im Einzelnen unterscheiden, wie man diverse Sonderbefehle (wie MMX usw. oder rep Varianten nutzt, den Stack performant anlegt, welche Befehle das gleiche Ergebnis bewirken, Binärgeschichten usw. oder einfach wie while/for-Schleifen umgeschrieben werden. Dazu brauchts keine 64 oder 128 oder 256 Bit oder noch größere Bitbreiten. Die drehen sich hauptsächlich um Performance, eventueller Parallelverarbeitung, Marketing/Verkaufsförderung o.ä.

    Eine ganz andere Geschichte zusätzlich wäre eine allgemeinere Assemblerprogrammierung mit generellen bzw. abstrakten Registern (inlining etc. z.B. mit dem gcc/as)

    Je nach Einstiegsvariante ist vor allem die Dokumentation des eingesetzten Assemblers sehr wichtig für Anfänger, weil die erfahrungsgemäß bei Compilieraufrufen/-grammatiken hängen bleiben (neben unverstandenen Algorithmen).


Log in to reply