在 Win API 调用中使用字符串值

问题描述 投票:0回答:1

我正在尝试使用 MessageBoxA Windows API,如下所示 https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa

执行以下命令时,

r15
是MessageBoxA,我成功执行了API,但没有任何值。

xor rcx, rcx
xor rdx, rdx
xor r8, r8
xor r9, r9
call r15    

当我尝试在文本字段中分配字符串值时,它无法执行,我不知道为什么。

xor rcx, rcx
mov rdx, 0x0041414141
xor r8, r8
xor r9, r9
call r15    

我可以使用

.data
部分中定义的变量,它工作得很好,但我想知道如何在没有
.data
部分的情况下做到这一点。

例如

section .data
    aaaa db 'AAAA',0
...
mov rdx, aaaa
windows assembly winapi 64-bit
1个回答
0
投票

如果使用 x86,您可以在自代码中使用下一个片段:

    call @@0
    DB 'some demo string',0
@@0:
    pop ecx ; or another register, in which you need get address of string

(或者只是将其留在堆栈中以传递给 api 调用)

或者你可以使用这样的宏

createAstring macro name, string
@CatStr(_,name) proc
  call @@1
  DB string,0
@@1:
  pop eax
  ret
@CatStr(_,name) endp
endm

并创建函数,返回字符串的地址

createAstring some_string, 'some demo string'

并在代码中使用它:

call _some_string
mov edx,eax ; or push eax, etc

这段代码也可以在x64中使用,但这里也可以简单地使用LEA,因为它与基础无关

createAstring macro name, string
name proc
    lea rax,@@1
    ret
@@1:
    DB string,0
name endp
endm

或者直接用代码

    lea r8,@@1
    ...
@@1:
    DB 'aaa bbb ccc...',0
© www.soinside.com 2019 - 2024. All rights reserved.