2014-10-01 1 views
1

Учитывая следующую структуру:адрес памяти элемента структура данных

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

elem s[100]; 

и зная, что S, I и J находятся в% EBX,% еси, и% еди соответственно, как я определить адрес памяти

s[i].b[j] 

?

Спасибо!

+0

Вы не можете, не зная, как структурируются ваши пакеты компиляторов/пэдов. –

+0

x не было необходимости ... Я отредактировал вопрос. Спасибо @KerrekSB –

ответ

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) 
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 
     ........ 
+1

Я думаю, что OP хочет решение в сборке, а не C. – isedev

+0

Я думаю, что '% p' - лучший выбор для печати указателей. – HuStmpHrrr

+0

yes you r ryt @HuStmpHrrr – Rustam

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); 
}