我正在用Microsoft的技巧学习x86,并尝试致电ExitProcess。我知道此函数是在kernel32.lib中定义的,因此我在构建步骤中将其链接了,无法正常工作。我尝试在源代码中执行“ includelib kernel32.lib”,同样的错误。这是我用来构建它的代码和命令:
nil
这是我构建此源代码的方式(我正在使用命令行工具ml.exe):
.model flat, C
.stack 4096
includelib kernel32.lib
includelib user32.lib
extrn ExitProcess: proc
.code
main proc
mov eax, 0
ret
main endp
end main
这是汇编程序抛出的错误:
ml -Zi -nologo ..\code\main.asm /link -nologo -subsystem:windows User32.lib Kernel32.lib -entry:main
main.exe:致命错误LNK1120:1个未解决的外部组件 我已经在网上进行了广泛的搜索,但这似乎是汇编我的代码所需要的。我只是不知道如何使它工作。请帮忙。
答案 0 :(得分:0)
如果您不喜欢导出函数的怪异而丑陋的名称处理,那么您并不孤单。我认为函数应使用与记录中相同的名称进行调用,例如在https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-messagebox
中我写了一个工具https://euroassembler.eu/,它比MASM易于使用。您在EUROASM中的程序如下所示:
main program format=PE,entry=main
import MessageBoxA,lib=user32.dll
import ExitProcess,lib=kernel32.dll
main proc
push 0, ="Caption", ="Hello, world!",0 ; Msgbox requires 4 parameters.
call MessageBoxA
push 0 ; ExitProcess requires 1 parameter.
call ExitProcess
endp
endprogram
这是我从此源构建main.exe的方法:
euroasm.exe main.asm