c - 如何在程序集中访问 C 结构值?

标签 c assembly x86 nasm

当我想在汇编中访问 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/

相关文章:

c++ - 将 mpfr_t(或任何其他任意精度库类型)转换为 __float128

c - DDA 算法不为某些坐标绘制线条?

windows - 从文本创建 COM 文件

assembly - 如何在 ARM 上进行整数(有符号或无符号)除法?

x86 - 为什么 “movnti” 后跟一个 “sfence” 保证持久排序?

c - 如何从文件中获取替代行并将其作为字符串存储到结构中?

algorithm - 程序员如何确保编译器创建正确的代码?

c++ - 对于 x86 汇编和优化代码中的循环?

c - 在英特尔 x64 汇编中执行函数的最快(CPU 方式)方式?

c - 如何在 OpenMP LLVM 中使用运行时跟踪?