当我想在汇编中访问 C 结构中的某些值时,我通常只是向结构的地址添加一些内容。然而,当这个结构体很大时,它就有点累了……有什么技巧或正常的选项可以在里面声明全局标签吗?
如何在汇编中访问 C 结构值?
最佳答案
要获取各个成员的地址,就像您正确指出的那样,您必须向结构的地址添加一个常量偏移量。问题本质上归结为自动计算给定结构和成员的这些偏移量。
即使对于小型结构,我也建议不要手动计算偏移量,因为编译器会在成员之间添加不同的填充,并且像 __attribute__(packed)
这样的提示不适用于所有编译器。
对于我的大部分项目,我使用单独的程序在构建时生成偏移量 header 。
基本思想是创建一个 .c/.cpp
文件,其中包含类似 -
// Your program headers that define the structs here
#include <stdio.h>
#include <stddef.h>
#define OFFSET(x, str, mem) printf("#define " #x " %d\n",(int) offsetof(str, mem))
#define SIZE(x, str) printf("#define " #x " %d\n", (int) sizeof(str))
#define HEADER_START() printf("#ifndef ASM_OFFSET_H\n#define ASM_OFFSET_H\n")
#define HEADER_END() printf("#endif\n")
int main(int argc, char *argv[]) {
HEADER_START();
OFFSET(struct_name_member_name, struct_name, member_name); // Substitute your struct name and member name here
SIZE(struct_name_size, struct_name); // This macro is to get the size of a struct
HEADER_END();
return 0;
}
在构建期间执行此程序会生成一个头文件,该文件可以直接包含在 GASM 中。对于其他汇编程序,您可以更改语法以生成适当的 inc 文件。
这种方法的好处是程序使用与 C/C++ 代码相同的 header 。这样,当您更改任何 header 时,生成的偏移量应该会自动更改。
这里您必须注意的一件事是,如果您针对不同的体系结构进行交叉编译并且编译器在您的主机和目标上使用不同的布局,则此技术将无法正常工作。如果你想要类似的交叉编译,我可以写一个单独的答案。
关于c - 如何在程序集中访问 C 结构值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62309952/