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文件的格式都是COFFALINK
格式,希望通过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,应该使用较旧的导入记录格式。