给出以下结构:
typedef struct {
char a;
int b[10];
} elem;
elem s[100];
并且知道s,i和j分别位于%ebx,%esi和%edi中,如何确定
的内存地址s[i].b[j]
谢谢!
答案 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);
}