struct数据项的内存地址

时间:2014-10-01 18:06:32

标签: c assembly att

给出以下结构:

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

elem s[100];

并且知道s,i和j分别位于%ebx,%esi和%edi中,如何确定

的内存地址
s[i].b[j]

谢谢!

3 个答案:

答案 0 :(得分:4)

这很简单:

  • s[i]的地址偏离s[0]地址i * sizeof(elem)字节。

  • 成员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)

答案 1 :(得分:0)

你可以在c中找到

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

elem s[100];

int main(){
    int i,j;
    for(i=0;i<10;i++){
       printf("\n%p",&s[i]);                
        for(j=0;j<10;j++){
         printf("\n\t%p",&(s[i].b[j]));
        }
    }

    return 0;

}

输出:

00443010
        00443014
        00443018
        0044301C
        00443020
        00443024
        00443028
        0044302C
        00443030
        00443034
        00443038
0044303C
        00443040
        00443044
        00443048
        0044304C
        00443050
        00443054
        00443058
        0044305C
        00443060
        00443064
00443068
        0044306C
        00443070
        00443074
        00443078
        0044307C
        00443080
        00443084
        00443088
        0044308C
        00443090
00443094
        00443098
        0044309C
        004430A0
        004430A4
        004430A8
        004430AC
        004430B0
        004430B4
        004430B8
        004430BC
        ........

答案 2 :(得分:0)

您可以为基地址添加偏移量。唯一的困难是知道您可以使用#offsetof标头中定义的宏<stddef>来获取结构内元素的偏移量:

  

大纲顶部

   #include <stddef.h>

   size_t offsetof(type, member); DESCRIPTION         top

   The macro offsetof() returns the offset of the field member from the
   start of the structure type.

   This macro is useful because the sizes of the fields that compose a
   structure can vary across implementations, and compilers may insert
   different numbers of padding bytes between fields.  Consequently, an
   element's offset is not necessarily given by the sum of the sizes of
   the previous elements.

   A compiler error will result if member is not aligned to a byte
   boundary (i.e., it is a bit field).
#include <stddef.h>

int s_i_j_addr( int s, int i, int j) {
    if( i >= 100 || j >= 10) return -1; // error
    return s + i * sizeof( elem) + offsetof(elem, b) + j * sizeof(int);
}