如何使用`nasm`和`alink`的组合链接kernel32.lib和user32.lib?

时间:2016-07-06 10:46:53

标签: windows winapi assembly windows-10 nasm

如何使用nasmalink的组合链接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 个答案:

答案 0 :(得分:1)

我没有'找到了kernel.libuser.lib可供ALINK使用的ALINKWIN32.LIB。这可能是由于所需的.obj文件的格式,而大多数Windows .obj的格式为COFF MessageBoxA希望与OMF一起使用。

合适的ExitProcesshere。它包括RET但不包括; 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 。建议不要使用简单的word_vector = Embedding(input_dim=2000,output_dim=100)(word_one_hot) 终止纯Windows程序。

然而,如果不是更好的话,NASM也可以做到这一点:

path: '/user/page_type

请注意,调用时功能用括号括起来。此外,将变量放在单独的DATA部分中会更好。

如果你计划一个包含来自一堆.DLL的大量IMPORT的大型项目,请查看NASMX Project