Windows 如何结合使用'nasm'和'alink'链接kernel32.lib和user32.lib?

Windows 如何结合使用'nasm'和'alink'链接kernel32.lib和user32.lib?,windows,winapi,assembly,windows-10,nasm,Windows,Winapi,Assembly,Windows 10,Nasm,如何结合使用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

如何结合使用
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

我还没有找到一个
kernel.lib
user.lib
可以被
ALINK
使用的。这可能是由于所需的.obj文件的格式,而大多数Windows.obj文件的格式都是COFF
ALINK
格式,希望通过OMF提供

需要一个合适的
WIN32.LIB
。它包括
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
请注意,函数在调用时用括号修饰。此外,最好将变量放在单独的数据部分


如果你计划一个大型项目,从一堆.DLL文件中导入一堆文件,那么看看。

你是从正确的文件夹中获取LIB文件的,但是你真的不应该将它们复制到其他地方。只要给链接器提供路径,它就可以找到它们。否则,我猜您的问题是ALINK不支持生成64位可执行文件。您需要生成32位目标代码,或者使用其他链接器。您是编译/链接32位还是64位代码?以及如何在asm文件中声明MessageBoxA和ExitProcess?我的目的是编译/链接32位代码。我已经在上面添加了完整的示例。据OSDev称,ALINK应该支持PECOFF objs,但我猜ALINK不支持Microsoft最近使用的新的短导入记录格式。来自MinGW的
kernel32.lib
user32.lib
,更具体地说是w32api,应该使用较旧的导入记录格式。