在 NASM 上组装时,程序集应用程序不起作用



我目前正在研究x86汇编,并为MASM开发了一个简单的汇编应用程序,该应用程序调用函数MessageBoxA和ExitProcess,这是源代码:

.386
.model flat, stdcall
option casemap:none
includelib C:masmmasm32libkernel32.lib
includelib C:masmmasm32libuser32.lib
ExitProcess PROTO :DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
msg db "Hello There!!", 0
cpt db "My First Programm!!", 0
.code
start:
    push 0   ; MB_OK
    push OFFSET cpt  ; title
    push OFFSET msg  ; msg
    push 0    ; HWND
    call MessageBoxA
    push 0
    call ExitProcess
end start 

上面的代码在MASM上运行良好,但现在我正试图为NASM制作一个等效的代码,这就是我所写的:

; test.asm
SECTION .DATA
MsgTitle: db "Message", 10, 0
Message: db "Hello There!", 10, 0
SECTION .TEXT
EXTERN __imp__MessageBoxA@16
EXTERN __imp__ExitProcess@4
GLOBAL _main
_main: ; int main()
    push ebp
    mov ebp, esp
    ;;; Function Main Content
    ; MessageBoxA(NULL, "Hello There!", "Message", MB_OK);
    push 0 ; MB_OK
    push DWORD [MsgTitle]
    push DWORD [Message]
    push 0
    call __imp__MessageBoxA@16
    ; ExitProcess(0)
    push DWORD 0
    call __imp__ExitProcess@4
    ;;;
    mov esp, ebp
    pop ebp
    ;;
    mov eax, 0
    ret

我正在使用Microsoft增量链接器来链接库User32.lib和kernel32.lib,这是命令行:

nasm -f win32 test.asm -o test.obj
link /SUBSYSTEM:CONSOLE /Entry:main test.obj libUser32.lib libkernel32.lib 

问题是在汇编代码并链接obj后,生成的.exe文件不起作用,它显示错误消息"test.exe已停止工作",怎么了?

push DWORD [MsgTitle]推送位于MsgTitle的前4个字节。您想要的是推送MsgTitle的地址,在NASM语法中,它将是push DWORD MsgTtitle。因此,争论将变成:

push DWORD 0 ; MB_OK
push DWORD MsgTitle
push DWORD Message
push DWORD 0

此外,您的呼叫不正确。__imp__MessageBoxA@16本身并不是MessageBoxA函数的地址,因此您需要一个间接级别:

call [__imp__MessageBoxA@16]

ExitProcess的调用也是如此。

或者,如果我将__imp__MessageBoxA@16更改为_MessageBoxA@16,似乎我可以使用call _MessageBoxA@16

相关内容

最新更新