0

这是 ASM 代码:

__declspec(naked) void foo(something* t)
{
__asm {
push    ebp
mov ebp, esp
mov eax, dword ptr [t]
mov dword ptr [eax], 0
mov dword ptr [eax+4], 0
mov esp, ebp
pop ebp
}

这将是代码的 C 版本:

struct something {
_int64 a;
_int64 b;
_int64 c;
};

void foo(struct* something) {
something->a = 0;
}

现在,我想知道是否可以在不将 t 存储在 eax 中的情况下做同样的事情。而只是使用 ebp 代替。但我不确定“a”在哪里(ebp+28 或 ebp),甚至可能。这似乎不起作用。如果这是可能的,有谁,以及如何?

mov     dword ptr [ebp+28], 0
mov     dword ptr [ebp+24], 0
4

1 回答 1

2

表达式的任意嵌套在汇编中是不可能的。这就是发明高级语言的目的。换句话说,是的,t如果你想取消引用它,你必须将它的值加载到一个寄存器中。装配不支持像这样的结构

mov     dword ptr [[ebp+28]], 0

这就是你的目标。ebp+28不是t->a;的地址 它是 的地址t,这是 的地址t->a

此外,程序集片段将两者归零t->at->b而 C 片段仅归零a。它们不是等价的。

于 2013-02-18T21:25:07.117 回答