首页 文章

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

提问于
浏览
0

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

.386
.model flat, stdcall
option casemap:none

includelib C:\masm\masm32\lib\kernel32.lib
includelib C:\masm\masm32\lib\user32.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 Incremental Linker链接库User32.lib和kernel32.lib,这个命令行:

nasm -f win32 test.asm -o test.obj
link /SUBSYSTEM:CONSOLE /Entry:main test.obj lib\User32.lib lib\kernel32.lib

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

1 回答

  • 1

    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 .

相关问题