Не могу понять значение в% rax в простой сборке x86 - PullRequest
0 голосов
/ 29 декабря 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 char *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];

    char *label = find_first_in_range (basket, 12, 15);
    printf ("%s\n", label);

    free (basket);

    return 0;
}

У меня есть эта программа на C, и цель состоит в том, чтобы сделать функцию find_first_in_range в сборке.Прямо сейчас я просто пытаюсь добраться до 10 в Apple, но это дает мне странное значение в %rax.

Вот что я сделал в сборке:

    .globl find_first_in_range

# *ic   is passed in %rdi
# rlow  is passed in %rsi
# rhigh is passed in %rdx

find_first_in_range:
    mov %rdi, %rax

%rsi содержит 12 и %rdx содержит 15, которые являются левым и правым пределами, которые я прошел в find_first_in_range (basket, 12, 15);, ноне должен %rax держать 10?Из первого элемента fruits[].

Другой вопрос, который у меня возникает, - как мне получить доступ, например, к длине basket?Который 5.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

%rsi содержит 12, а %rdx содержит 15, которые являются левым и правым пределами, которые я прошел в find_first_in_range (basket, 12, 15);, но разве %rax не должен содержать 10?От первого элемента fruits[].

С чего бы это ?!Вы передали указатель на struct item_coll.У вас есть указатель на struct item_coll.Затем вам нужно сделать косвенный доступ через этот указатель, чтобы получить length и LEA адрес basket->items, и использовать косвенное обращение через него для доступа к значениям в структурах, на которые указывают указатели.

Лучший способ понять, как выполнить операцию в сборке, чтобы сделать простую функцию C , которая выполняет ту же операцию, а затем скомпилировать функцию с оптимизацией достаточно высокой уровень (O2!), а затем понять сгенерированный код.

0 голосов
/ 29 декабря 2018

Само ic находится в %rdi: указатель на ItemColl.Таким образом, ic->length, являясь первым элементом в этой структуре, имеет (после mov) всего (%rax) (предположительно, длиной 8 байт).

...