Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在c+中读取堆栈框架的底部+;在窗户上_Linux_Windows_Assembly_64 Bit_Inline - Fatal编程技术网

Linux 在c+中读取堆栈框架的底部+;在窗户上

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),

为了便于学习,我正在尝试将虚拟机代码移植到windows

我在Linux上编译并测试了代码。大多数C++代码通过VisualStudio 2019社区版编译良好。 有一个函数我不知道如何将它移植到windows。我的猜测是,这个类允许获取堆栈框架的基础

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];
    }
} 
但我没有汇编程序编码方面的任何背景。所以我有两个问题:

  • “英特尔汇编程序”的翻译正确吗

  • Visual Studio社区版不支持内联 x64目标的汇编程序。但它支持。我们可以在C/C++代码中获得堆栈框架的基础,而不用在外部文件中编写汇编代码吗 ?


  • 谢谢

    代码甚至可能不使用
    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
    值的功能。您是对的。这应该由垃圾收集器调用,但在运行一些基准脚本时从未调用过。这里只是猜测,但垃圾收集器可能只是想将其用作内存搜索的边界。因此,声明局部变量并返回其地址应该是可行的。