Функции сборки x86 - PullRequest
       7

Функции сборки x86

2 голосов
/ 23 января 2012

У меня есть функция, которая вызывается main.Предположим, что имя функции funct1.funct1 вызывает другую функцию с именем read_input.

Теперь предположим, что funct1 начинается следующим образом:

push %rbp
push %rbx
sub $0x28, %rsp
mov $rsp, %rsi
callq 4014f0 read_input
cmpl $0x0, (%rsp)
jne (some terminating function)

Итак, несколько вопросов:

  1. В этом случае, read_input имеет только один аргумент, который является %rbx?
  2. Кроме того, если указатель стека уменьшается на 0x28, это означает, что строка размера 0x28 выталкивается в стек?(Я знаю, что это строка).
  3. А каково значение mov %rsp, %rsi перед вызовом функции?
  4. И, наконец, когда возвращается read_input, куда помещается возвращаемое значение?

Спасибо и извините за вопросы, но я только начинаю изучать x86!

1 Ответ

3 голосов
/ 23 января 2012

Похоже, ваш код использует Linux / AMD ABI.Я отвечу на ваши вопросы в этом контексте.

  1. Нет, rbx - это регистр, сохраняемый абонентом (энергонезависимый).Ваша функция сохраняет его, чтобы он не нарушал значение вызывающего абонента.Это не восстанавливается в коде, который вы показали, но это потому, что вы не показали всю функцию.Если есть больше для этой функции, и я думаю, что есть, это потому, что rbx используется где-то позже в этой подпрограмме.
  2. Да, пространство для 0x28 байт данных используетсясделано в стеке.Предполагая, что read_input принимает строку в качестве параметра, ваше описание разумно.Однако это не обязательно точно.Некоторые из этих данных могут быть использованы для других локальных переменных, кроме того, что буфер выделяется для передачи в read_input.
  3. Эта инструкция помещает указатель на вновь выделенный стек стека в rsi.rsi - это второй регистр параметров для соглашения о вызовах AMD x64.Это означает, что вы будете вызывать read_input с первым параметром, переданным этой функции , вместе с указателем на ваш новый буфер стека.
  4. In rax,если это 64-битное значение или меньше, в rax & rdx, если оно больше.Или, если это с плавающей точкой, в xmm0, ymm0 или st(0).Вам, вероятно, стоит взглянуть на описание вашего соглашения о вызовах, чтобы разобраться с этим - есть отличный PDF-файл по адресу по этой ссылке .Ознакомьтесь с таблицей 4.
...