我正在尝试使用 Zig 中的内联 asm 获取标签的地址。
const main_ccb_p1 = core.mainCCCBPtr();
comptime var to_return_label = ".to_return" ++ mangle(function);
asm volatile (
\\ # save main context
\\ movq %rbx, 0(%[ctx]) # save rbx
\\ movq %r12, 8(%[ctx]) # save r12
\\ movq %r13, 16(%[ctx]) # save r13
\\ movq %r15, 24(%[ctx]) # save r15
\\ movq %rsp, 32(%[ctx]) # save rsp
\\ movq %rbp, 40(%[ctx]) # save rbp
\\
++ "movq $" ++ to_return_label ++ ", 48(%[ctx])"
:
: [ctx] "{rax}" (&main_ccb_p1.context),
);
// some code
// ...
asm volatile (to_return_label ++ ":" ::: "memory");
在 Linux 上运行良好。但是我在 Windows 上得到了一些奇怪的结果。我期望的地址是
0000 7FFF F661 2D60
,但我得到了FFFF FFFF F661 2D60
。然后我尝试使用lea label, %rcx
。结果还是错了0000 0000 F661 2D60
.
为什么会这样?如何在 Windows 上使用内联汇编获取标签的地址?感谢您的帮助。