gpt4 book ai didi

c++ - 我如何知道将映射到哪些寄存器函数参数?

转载 作者:行者123 更新时间:2023-11-28 06:24:42 25 4
gpt4 key购买 nike

我已经为 Brainfuck 编写了一个 JITting 虚拟机。它需要创建一个可写+可执行的内存区域(它是一个 char*,但不是使用 mallocnew 创建的),即填充机器操作码(在我的例子中是 x64),然后在将 char* 转换为函数指针后调用。新创建的函数有参数。即内存指针和其他一些内部的东西。

它可以工作,但它假设有一个特定的寄存器映射。该映射已经更改,曾经有一段时间,因为我将调用周围的代码更改为 char* 并且编译器认为它可以更好地与其他寄存器一起工作。所以我不得不改变代码生成方案。

恐怕我可以做一些会让编译器再次更改它的事情,或者更糟的是,使用堆栈,我还不知道如何从中提取参数。

所以我需要:

  • 一种告诉编译器在哪些寄存器中放置参数的方法(`register ... asm("r0"),如 here 所述,不适用于参数)
  • 还有一种了解参数映射到哪些寄存器的方法。这会使事情复杂化,但它仍然可行。
  • 还有一种方法可以知道参数是否以及以何种顺序传递到堆栈

我正在使用 gcc 4.8.2。

最佳答案

当您调用一个函数时,编译器通常*无法选择将调用的参数放在哪里。这是由 ABI 决定的.如果您的主机程序是用 C++ 编写并在 Linux/x86-64 机器上运行,它通常会发出符合 SysV ABI 中描述的调用约定的代码。 ,其中包含以下参数传递规则:

If the class is INTEGER, the next available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8 and %r9 is used.

值得注意的是,INTEGER 类也包含指针参数。

这里的底线是你的 jitted 代码应该能够从上面列出的寄存器中挑选它的参数。如果这仍然无法正常工作,我怀疑您可能对指令进行了错误的编码。尝试从 GDB 查看反汇编。

(*) 好吧,如果不能从翻译单元外部调用该函数,编译器可能会提供更多的灵 active 。

关于c++ - 我如何知道将映射到哪些寄存器函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28728742/

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