2016-07-06 209 views
0

如何使用nasmalink的組合鏈接kernel32.lib和user32.lib?如何使用`nasm`和`alink`的組合連接kernel32.lib和user32.lib?

我下面就彙編編程一些教程和導要我執行以下命令:

nasm -fobj hello.asm          
alink -oPE hello \lib\kernel32.lib \lib\user32.lib 

第一個命令執行不如預期,但第二個命令失敗。

要鏈接的.lib文件,我從

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib 

複製他們到我的當前文件夾。

錯誤消息執行第二命令時,我得到的是:

Loading file hello.obj 
Loading file Kernel32.lib 
2327 symbols 
Loaded first linker member 
Loading file User32.lib 
1385 symbols 
Loaded first linker member 
matched Externs 
matched ComDefs 
Unresolved external MessageBoxA 
Unresolved external ExitProcess 

現在,我有兩個問題:

1)凡KERNEL32.LIB和USER32.LIB在什麼位置?

2)如何正確鏈接這些庫文件?

操作系統是Windows 10(64位)。

更新:

; Coded for NASM           ; 
; nasm -fobj hello.asm         ; 
; alink -oPE hello \lib\kernel32.lib \lib\user32.lib  ; 
                  ; 
extern MessageBoxA    ; APIs used    ; 
extern ExitProcess    ; in this file    ; 
                  ; 
[SECTION CODE USE32 CLASS=CODE] ; code section    ; 
..start:      ; for the linker   ; 
                  ; 
    push byte 0     ; only the buttons 'OK' ; 
    push dword caption   ; caption of the BOX  ; 
    push dword text    ; text in the BOX   ; 
    push byte 0     ; handle of the Box  ; 
     call MessageBoxA   ; print BOX on screen  ; 
                  ; 
    push byte 0     ;       ; 
     call ExitProcess   ; EXIT      ; 
                  ; 
    caption db "Your first WIN32 programm",0    ; 
    text db "HELLO",0          ; 
                  ; 
end        ; for the linker 
+1

您正在從正確的文件夾中獲取LIB文件,但您確實不應該將它們複製到別處。只要給鏈接器路徑,以便它可以找到它們。否則,我猜你的問題在於ALINK不支持生成64位可執行文件。您需要生成32位目標代碼,或使用不同的鏈接器。 –

+0

你編譯/鏈接32位或64位代碼?以及如何在asm文件中聲明MessageBoxA和ExitProcess? – RbMm

+0

我的意圖是編譯/鏈接32位代碼。我已經添加了上面的完整示例。 – Shuzheng

回答

1

我的避風港」發現kernel.libuser.lib可以通過ALINK使用。這可能是由於所需的.obj文件的格式造成的,而大多數Windows .obj的格式化爲COFF ALINK想要使用OMF進行。

合適的WIN32.LIBhere。它包括MessageBoxA但不包括ExitProcess。不建議用簡單的RET終止純Windows程序。

然而,NASM可以做的工作,以及如果沒有更好的:

; Import the needed Win32 API functions.- http://www.nasm.us/doc/nasmdoc7.html#section-7.4.4 
IMPORT ExitProcess kernel32.dll 
IMPORT MessageBoxA user32.dll 

; Still needed to be declared as external 
EXTERN ExitProcess, MessageBoxA 

[SECTION CODE USE32 CLASS=CODE] ; code section 
..start: 
    push 0     ; only the buttons 'OK' 
    push dword caption  ; caption of the BOX 
    push dword text   ; text in the BOX 
    push 0     ; handle of the Box 
    call [MessageBoxA]  ; print BOX on screen 

    push 0 
    call [ExitProcess] 

    caption db "Your first WIN32 programm",0 
    text db "HELLO",0 

請注意,功能與裝飾托架被調用時。此外,最好將變量放在單獨的DATA部分。

如果您計劃一個龐大的項目,並附帶一大堆.DLL的IMPORT,請查看NASMX Project

+0

根據OSDev ALINK應該支持PECOFF objs,但我的猜測是,ALINK不支持這些天使用的新的短導入記錄格式。 'kernel32.lib'和'user32。來自MinGW的lib',更具體地說是w32api,應該使用舊的導入記錄格式。 –