Linux 在c+中读取堆栈框架的底部+;在窗户上
为了便于学习,我正在尝试将虚拟机代码移植到windows 我在Linux上编译并测试了代码。大多数C++代码通过VisualStudio 2019社区版编译良好。 有一个函数我不知道如何将它移植到windows。我的猜测是,这个类允许获取堆栈框架的基础Linux 在c+中读取堆栈框架的底部+;在窗户上,linux,windows,assembly,64-bit,inline,Linux,Windows,Assembly,64 Bit,Inline,为了便于学习,我正在尝试将虚拟机代码移植到windows 我在Linux上编译并测试了代码。大多数C++代码通过VisualStudio 2019社区版编译良好。 有一个函数我不知道如何将它移植到windows。我的猜测是,这个类允许获取堆栈框架的基础 class Stack { uint64_t* rbp(); }; uint64_t* __attribute__ ((noinline)) vaiven::Stack::rbp() { asm("mov (%rbp),
class Stack {
uint64_t* rbp();
};
uint64_t* __attribute__ ((noinline)) vaiven::Stack::rbp() {
asm("mov (%rbp), %rax");
}
在谷歌搜索使用英特尔符号的汇编程序后,我推断等效代码为:
__declspec(noinline) uint64_t* vaiven::Stack::rbp() {
__asm
{
mov rax, DWORD PTR [rbp];
}
}
但我没有汇编程序编码方面的任何背景。所以我有两个问题:
谢谢代码甚至可能不使用
rbp
作为堆栈帧指针。如果使用优化的构建,代码在linux上也无法工作。我还没有查看VM使用该值的目的,但是可以使用局部变量或类似变量的地址来替换它。当然,局部变量的布局也由编译器决定。我在linux上用g++-O3编译,它运行得很好。Mau be“属性((noinline))”告诉编译器不要对其进行优化。这个项目代码是我测试的最快的VM。它比luajit快。我想我也希望你能返回这个地址,但它不起作用。这可能意味着它只用于提供信息的目的。启用-O3
将禁用对帧指针使用rbp
,因此代码无法执行任何有用的操作。或者,您可能还没有测试实际需要此rbp
值的功能。您是对的。这应该由垃圾收集器调用,但在运行一些基准脚本时从未调用过。这里只是猜测,但垃圾收集器可能只是想将其用作内存搜索的边界。因此,声明一个局部变量并返回其地址应该是可行的。代码甚至可能不使用rbp
作为堆栈帧指针。如果使用优化的构建,代码在linux上也无法工作。我还没有查看VM使用该值的目的,但是可以使用局部变量或类似变量的地址来替换它。当然,局部变量的布局也由编译器决定。我在linux上用g++-O3编译,它运行得很好。Mau be“属性((noinline))”告诉编译器不要对其进行优化。这个项目代码是我测试的最快的VM。它比luajit快。我想我也希望你能返回这个地址,但它不起作用。这可能意味着它只用于提供信息的目的。启用-O3
将禁用对帧指针使用rbp
,因此代码无法执行任何有用的操作。或者,您可能还没有测试实际需要此rbp
值的功能。您是对的。这应该由垃圾收集器调用,但在运行一些基准脚本时从未调用过。这里只是猜测,但垃圾收集器可能只是想将其用作内存搜索的边界。因此,声明局部变量并返回其地址应该是可行的。