gpt4 book ai didi

c++ - 如何在 __asm 中使用变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:58 25 4
gpt4 key购买 nike

我正在使用 VC 编译器编译此 C++ 代码。我正在尝试使用 __asm 语句调用一个采用两个 WORD(又名 unsigned short)参数的函数,如下所示:

__declspec(naked) void __stdcall CallFunction(WORD a, WORD b)
{
__asm {
PUSH EBP
MOV EBP, ESP
PUSH a
PUSH b
CALL functionAddress
LEAVE
RETN
}
}

functionAddress 处的函数只是输出 a + b 的结果。然后调用 CallFuncion(5, 5); 打印“64351”或类似的东西。问题是在 __asm 语句中使用 ab 变量时,因为这有效:

PUSH EBP
MOV EBP, ESP
PUSH 5
PUSH 5
CALL functionAddress
LEAVE

这是 functionAddress 中的函数:

void __stdcall Add(WORD a, WORD b)
{
WORD c;
c = a + b;
printf("The result is %d\n", c);
}

我怎样才能以正确的方式做到这一点?所以 __asm 语句解释了 ab 值?

最佳答案

由于您正在使用 __declspec(naked) 并设置您自己的堆栈框架,我不相信编译器会让您引用 ab 按名称。使用 __declspec(naked) 基本上意味着您自己负责处理堆栈帧、参数等。

您可能需要有关此一般顺序的更多代码:

__asm {
PUSH EBP
MOV EBP, ESP
mov eax, [ebp+8]
mov ebx, [ebp+12]
push eax
push ebx
CALL functionAddress
LEAVE
RETN
}

我已经有一段时间没有手动处理这样的事情了,所以你可能想重新检查这些偏移量,但如果我没记错的话,返回地址应该在 [ebp+4 ]。参数(通常)从右向左推送,因此最左边的参数应该在 [ebp+8] 的下一个,下一个参数在 [ebp+12](记住堆栈向下增长)。

编辑:[我应该更仔细地查看函数标题。]

您已将 CallFunction 标记为使用 __stdcall 调用约定。这意味着需要清理传递给它的参数。因此,由于它接收到 8 个字节的参数,因此它需要在返回时从堆栈中删除 8 个字节:

    PUSH EBP
MOV EBP, ESP
mov eax, [ebp+8]
mov ebx, [ebp+12]
push eax
push ebx
CALL Add_f
LEAVE
RET 8

关于c++ - 如何在 __asm 中使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com