c - 结构数据项的内存地址

标签 c assembly att

给定以下结构:

typedef struct {
  char a;
  int b[10];
} elem;

elem s[100];

知道s、i、j分别位于%ebx、%esi、%edi中,如何确定内存地址

s[i].b[j]

?

谢谢!

最佳答案

这很简单:

  • s[i]的地址与地址 s[0] 的偏移量通过 i * sizeof(elem)字节。

  • 成员(member)地址b[j]从成员 b[0] 偏移通过 j * sizeof(int)字节。

  • b[0]的地址在对象内部 elem x与地址 x 的偏移量通过 offsetof(elem, b)字节。你需要#include <stddef.h>对于这个宏。

您可以编写一个 C 程序来发出所有相关常量,然后在您的汇编代码中使用它们。在任何情况下,你都想计算:

s + i * sizeof(elem) + offsetof(elem, b) + j * sizeof(int)

或者:

ebx + esi * sizeof(elem) + offsetof(elem, b) + edi * sizeof(int)

关于c - 结构数据项的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26147744/

相关文章:

c - 不知道为什么它退出循环(在 C 中)

c - rand() 和 RAND_MAX 根据数据类型给出不同的值

c - 获取缓冲区末尾的地址而不是其开头的地址

arrays - 在 Assembly (x86) 中添加 2D 数组

x86 - 32位X86中局部变量和全局变量有什么区别?

android - 发送和接收自定义数据并为其使用付费的应用

c - 如何在 C 中声明指向结构的指针?

c - char 数组中的终止符

c++ - Clang 对于 7 次比较生成的代码比 8 次比较生成的代码更差

assembly - 为 mov 指令选择后缀 (l-b-w)