如何访问程序集x86中的结构字段?

时间:2018-12-30 13:40:41

标签: assembly x86 cpu-registers

我有这个程序:

#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的值,则会得到5basket的长度)。

  • 如果将16添加到%r12,则会从12获得Pear

  • 如果将24添加到%r12,则会从8获得Banana

例如,如何访问20中的Apple?我是否只需要向12添加%r12?这给我带来了细分错误。

0 个答案:

没有答案