首页 > 解决方案 > 在 .code 之外调用汇编函数

问题描述

我尝试运行下面的简单代码:

extrn MessageBoxA: PROC
extrn ExitProcess: PROC

.data
titles db 'Win64', 0
msg db 'Hello World!', 0

.code

main proc
    sub rsp, 28h      ; 32 byte for 4 arguments, 8 byte for 'call' it self
    mov rcx, 0        ; hWnd = HWND_DESKTOP
    lea rdx, msg      ; LPCSTR lpText
    lea r8,  titles   ; LPCSTR lpCaption
    mov r9d, 0        ; uType = MB_OK
    call MessageBoxA
    mov ecx, eax
    add rsp, 28h
main endp
End

当我将它移动到一个函数时,代码不再起作用:

extrn MessageBoxA: PROC
extrn ExitProcess: PROC

.data
titles db 'Win64', 0
msg db 'Hello World!', 0

msgbox_ready:
sub rsp, 28h      ; 32 byte for 4 arguments, 8 byte for 'call' it self
mov rcx, 0        ; hWnd = HWND_DESKTOP
lea rdx, msg      ; LPCSTR lpText
lea r8,  titles   ; LPCSTR lpCaption
mov r9d, 0        ; uType = MB_OK
call MessageBoxA
mov ecx, eax
add rsp, 28h

.code
main proc
  call msgbox_ready
main endp
End

如果我将内容移动msgbox_ready到功能main上,它似乎没问题。问题是什么?可能是因为它在.code部分之外吗?

标签: winapiassemblyx86-64masm

解决方案


我使用jmp msgbox_ready代替解决了问题,call msgbox_ready并且该功能工作正常。阅读汇编'call'与'jmp'


推荐阅读