Как получить доступ к структурам полей в сборке x86? - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть эта программа:

#include <stdio.h>
#include <stdlib.h>

typedef struct item {
    int low; int high; char label[16];
} Item;

typedef struct item_coll {
    size_t length; Item *items[];
} ItemColl;

extern int find_first_in_range(ItemColl *ic, int rlow, int rhigh);

/*
char *find_first_in_range(ItemColl *ic, int rlow, int rhigh) {
    for (size_t i = 0; i < ic->length; i++)
        if (ic->items[i]->low >= rlow && ic->items[i]->high <= rhigh)
            return &ic->items[i]->label[0];
    return NULL;
}
* */

int main() {

    struct item fruits[] = {
        {10, 20, "Apple"},
        {12, 14, "Pear"},
        { 8, 12, "Banana"},
        { 2,  4, "Grape"},
        {15, 35, "Watermelon"}
    };

    struct item_coll *basket = malloc (sizeof *basket + 5 * sizeof *basket->items);
    basket->length = 5;

    for (size_t i = 0; i < 5; i++)  
        basket->items[i] = &fruits[i];

    int label = find_first_in_range (basket, 12, 15);
    printf ("%d\n", label);

    free (basket);

    return 0;
}

Как получить доступ к различным полям в fruits?Прямо сейчас я смог получить следующую информацию:

xor %r12, %r12
add $8, %r12
mov (%rdi, %r12), %rdi
mov (%rdi), %rax
ret
  • Это даст мне 10 из Apple.

  • Если я не использую %r12 и просто загружаю значение %rdi из памяти, я получаю 5 (длина basket).

  • Если я добавлю 16 к %r12, я получу 12 от Pear.

  • Если я добавлю 24 к %r12 Я получаю 8 от Banana.

Как мне получить доступ, например, к 20 in Apple?Разве мне не нужно просто добавлять 12 к %r12?Это дает мне ошибку сегментации.

...