Какова цель этой функции в сборке? - PullRequest
0 голосов
/ 23 ноября 2018

Я читаю ассемблерный код, и у меня нет доступного исходного кода.В сборке есть одна функция с именем next_text, которую я пытаюсь понять.Может ли кто-нибудь помочь мне в этом?

      next_text()

       push   %rbp
       push   %rbx
       sub    $0x108,%rsp
       mov    %rdi,%rbp
       mov    %esi,%ebx
       jmp    <next_text+45>
   16  mov    %rbp,%rdx
       mov    $0x100,%esi
       mov    %rsp,%rdi
       callq  <fgets@plt>
       test   %rax,%rax
       jne    <next_text+42>
       callq  <func>
   42  sub    $0x1,%ebx
   45  test   %ebx,%ebx
       jg     <next_text+16>
       add    $0x108,%rsp
       pop    %rbx
       pop    %rbp
       retq   

Здесь %ebx начинается с определенного большого целого числа, например 16000.Мое понимание того, что делает эта функция, заключается в том, что она принимает аргумент, который является потоком файлов.Затем он читает файл построчно.Максимальная длина строки составляет 100 hex, что составляет 256 символов.Затем он вычитает ebx на 1, и, пока файл достаточно длинный, продолжает читать файл на 16000 строк, а в конце, когда ebx равен 0, он завершается.Правильно ли мое понимание?Кроме того, команда sub $0x108,%rsp особенно важна здесь, или это просто настройка стековой памяти?

1 Ответ

0 голосов
/ 23 ноября 2018

Похоже, это так:

void next_text(FILE *f, count) {
    char  buf[256];
    while (count-- > 0) {
        if (fgets(buf, sizeof buf, f)) {
            func();
        }
    }
}
...