Сравнение массива struct char с указателем char в сборке - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь сравнить первый символ первой структуры в списке с первым символом токена в сборке. Тем не менее, два символа никогда не равны по некоторым причинам. Я знаю, что первый символ в первом ученике совпадает с первым символом в токене.

struct student
{
  long    ID;          /* 8 bytes in 64-bit */
  char    name[24];
};

/*
* list - the starting address of the list of structures to be searched
* count - total number of names in list
* token - name to be searched in the list
*/
long search_by_name (char* list, long count, char* token)
{
    long index = 0;

asm
(
    "movq %1, %%rax;" // list to rax       
    "movq %2, %%rbx;" // token to rbx
    "movq %3, %%rcx;" // count to rcx 

    "movq 8(%%rax), %%rsi;" // Offset rax by 8 to get to first char in struct
    "movq (%%rbx), %%rdi;" // Move memory address rbx into rdi
    "cmpq %%rdi, %%rsi;" // Compare the two chars
    "je equals;"         // Two chars are never equal for some reason

    "jmp finish;"

"equals:"
    "movq 0(%%rax), %%rax;"
    "jmp finish;"

"finish:"
      : "=a" (index)
     : "r" (list), "r" (token), "r" (count)
     : 
     );
     return index;
}
What it's supposed to do in C:

struct student *clist = (struct student*)list;
for (index = 0; index < count; index++)  
    if ( strcasecmp( clist[index].name, token ) == 0)
        return clist[index].ID;
return 0;

Код C - это то, чем должен быть конечный результат, но я все еще пытаюсь понять, как сравнить clist[index].name и token. Как бы я сравнил массив struct char с токеном char *?

Редактировать: Сравнение сработало после изменения его на:

movq 8(%%rax), %%r10; 
movq (%%rbx), %%r11; 
cmpb %%r10b, %%r11b;

1 Ответ

1 голос
/ 25 апреля 2020

Две основные проблемы: во-первых, cmpq сравнивает первые 8 символов, а не только один. Во-вторых, когда сравнение не удается, вы возвращаете указатель list, а не какой-либо часовой.

Кроме того, вы забиваете кучу регистров, но не сообщаете G CC. После вашего последнего : добавьте "rbx", "rcx", "rsi", "rdi", "cc", "memory".

...