2016-07-19 15 views
0

Verknüpfung habe ich ein einfaches Programm in Assemblersprache, die einfach in Windows 7 32-Bit-Fehler beim asm-Code

.386 
.model flat, stdcall 
option casemap :none 

extrn [email protected] : PROC 
extrn [email protected] : PROC 

.data 
    HelloWorld db "Welcome to SecurityTube.net!", 0 
    MsgTitle db "First MessageBox", 0 

.code 
start: 
    mov eax, 0 
    push eax 
    lea ebx, MsgTitle 
    push ebx 
    lea ebx, HelloWorld 
    push ebx 
    push eax 
    call [email protected] 
    push eax 
    call [email protected] 
end start 

ich Befehl zum Zusammenbauen und die Verknüpfung

ml /c /coff helloworld.asm 
link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib helloworld.obj 

verwende nach einem Meldungsfeld anzeigen Programm perfekt zusammengebaut. Jedoch, während der Verknüpfung, habe ich diesen Fehler:

Microsoft (R) Incremental Linker Version 5.12.8078 
Copyright (C) Microsoft Corp 1992-1998. All rights reserved. 

LINK : fatal error LNK1104: cannot open file "kernel32.lib" 

Warum bekomme ich diesen Fehler und wie man es mindert?

+0

Sie müssen den Bibliothekspfad angeben. – IInspectable

+0

Wie kann ich es einstellen? – Rob

+2

Die [Microsoft Macro Assembler-Referenz] (https://msdn.microsoft.com/en-us/library/afzk3475.aspx) ist ein guter Anfang. – IInspectable

Antwort

3

Der Befehl Sie suchen ist:

ml.exe helloworld.asm 
    /coff 
    /link 
     /subsystem:windows 
     /defaultlib:kernel32.lib 
     /defaultlib:user32.lib 
     /libpath:C:\...somewhere... 
     helloworld.obj 

Beachten Sie, dass anstelle von ml zuerst mit dem /c Schalter ausgeführt (die nur ohne Verknüpfung montiert) und dann link läuft, Ich habe alles nur in einer einzigen Befehlszeile zusammengefasst. Dadurch wird MASM ausgeführt, um den Code zu assemblieren und dann sofort zu verknüpfen.

Die magische Soße ist der /link Schalter, der jedes Argument, das nach es kommt, an den Linker übergibt.

Beachten Sie den anderen neuen Schalter, den Sie nicht hatten: /libpath. Dies ist derjenige, der dem Linker mitteilt, wo die LIB-Dateien gefunden werden können. Sie sind Teil des Windows SDK, daher müssen Sie dieses Verzeichnis auf Ihrer Festplatte suchen und diesen Pfad für C:\...somewhere... ersetzen. Der genaue Speicherort hängt davon ab, welche Version des SDK Sie installiert haben und wie Sie es installiert haben (separat oder als Teil von Visual Studio). Wenn Sie das SDK nicht haben, laden Sie es unter here for Windows 10 oder for earlier versions herunter. (Beachten Sie, dass die neueste Version ausreicht; Sie müssen nicht jede Version herunterladen. Sie unterstützt Multi-Targeting.)

Die Dokumentation für MASM ist available online, einschließlich einer umfassenden Liste von command line options. Das gleiche gilt für den Linker; sein options are here.

Eine noch einfachere Lösung wäre, die Visual Studio-Eingabeaufforderung zu öffnen und alle Ihre Montage und Verknüpfung von dort aus durchzuführen. Dadurch wird tatsächlich eine Stapeldatei ausgeführt, die die Umgebung für Sie einrichtet, sodass Sie sich keine Gedanken über den Pfad zu allen erforderlichen SDK-Dateien (Header, Bibliotheken usw.) machen müssen. Sie finden dies in Ihrem Startmenü oder führen es manuell aus:

C:\Program Files (x86)\Microsoft Visual Studio x.x\VC\bin\vcvars32.bat 

, um eine 32-Bit-Build-Umgebung einzurichten.

1

Haben Sie die Verzeichnisstruktur von Visual Studio überprüft und suchen Sie nach $(WindowsSdkDir)\lib, um festzustellen, ob sie existieren?
Wenn nicht http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx installieren

+0

Ich installiere es gerade jetzt, aber was ist Windows SDK und warum es verwenden? (Nur für Wissen) – Rob

+0

Ich habe es in Windows 7 von diesem Link installiert (https://www.microsoft.com/en-in-download/details.aspx?id=8279). Es hat nicht funktioniert. Muss ich einen Umweltpfad festlegen? oder irgendetwas anderes? – Rob

+0

Kernel.Lib und User32.Lib sind in C: \ Programme \ Microsoft SDKs \ Windows \ v7.1 \ Lib enthalten – Rob