gpt4 book ai didi

c - 在 C 的程序集中使用标签

转载 作者:太空狗 更新时间:2023-10-29 16:38:18 25 4
gpt4 key购买 nike

我只需要一种方法来加载标签的地址,例如MyLabel:例如'src.asm' 变成一个变量,例如'src.c'。 (这些文件将链接在一起)我正在使用 gcc 和 nasm 来组装这些文件。如何加载标签地址?

最佳答案

这有两个步骤。首先,您必须使用 global 指令将标签作为全局标签从程序集文件中导出。

global MyLabel

MyLabel: dd 1234 ; data or code, in whatever section. It doesn't matter.

接下来,您必须在 C 中将标签声明为外部标签。您可以在使用它的代码中或在 header 中执行此操作。

// It doesn't matter, and can be plain void,
// but prefer giving it a C type that matches what you put there with asm
extern void MyLabel(void); // The label is code, even if not actually a function
extern const uint32_t MyLabel[]; // The label is data
// *not* extern long *MyLabel, unless the memory at MyLabel *holds* a pointer.

最后,您可以像获取任何变量的地址一样获取 C 中标签的地址。

doSomethingWith( &MyLabel );

请注意,某些编译器会在 C 变量和函数名称的开头添加下划线。例如,GCC 在 Mac OS X 上执行此操作,但在 Linux 上不执行此操作。我不知道其他平台/编译器。为了安全起见,您可以在变量声明中添加一个asm 语句来告诉GCC 该变量的程序集名称是什么。

extern uint8_t MyLabel asm("MyLabel");

关于c - 在 C 的程序集中使用标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8045108/

25 4 0