Помогите перевести со сборки на C - PullRequest
3 голосов
/ 06 мая 2010

У меня есть код из функции

subl $24, %esp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax

До того, как код будет просто командой 'ENTER', а затем есть оператор if, который возвращает 1, если ebp> eax или 0, если он меньше. Я предполагаю, что cmpl означает сравнение, но я не могу сказать, каковы конкретные значения. Кто-нибудь может сказать мне, что происходит?

Ответы [ 3 ]

18 голосов
/ 06 мая 2010

Да cmpl означает сравнение (с 4-байтовыми аргументами). Предположим, что за фрагментом кода следует jg <addr>:

movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
jg <addr>

Тогда код похож на

eax = ebp[8];
if (eax > ebp[12])
   goto <addr>;
2 голосов
/ 06 мая 2010

Ваш фрагмент кода похож на код записи , используемый некоторыми процессорами и компиляторами. код ввода - это код сборки, который выдает компилятор при вводе функции.

Код записи отвечает за сохранение параметров функции и выделение места для локальных переменных и, при необходимости, их инициализацию. Код входа использует указатели на область хранения переменных. Некоторые процессоры используют комбинацию регистров EBP и ESP для указания местоположения локальных переменных (и параметров функции).

Поскольку компилятор знает, где хранятся переменные (и параметры функции), он удаляет имена переменных и использует числовое индексирование. Например, строка:

movl 8(%ebp), %eax

либо переместит содержимое 8-й локальной переменной в регистр EAX, либо переместит значение на 8 байтов от начала локальной области (при условии, что указатели регистра EBP на начало локальной переменной) область).

Инструкция:

subl $24, %esp

подразумевает, что компилятор резервирует 24 байта в стеке. Это может быть для защиты некоторой информации в соглашении о вызовах функций. Функция могла бы использовать область после этого для собственного использования. Эта зарезервированная область может содержать параметры функции.

Фрагмент кода, который вы указали, выглядит так, будто сравнивает две локальные переменные внутри функции:

void Unknown_Function(long param1, long param2, long param3)
{
  unsigned int local_variable_1;
  unsigned int local_variable_2;
  unsigned int local_variable_3;

  if (local_variable_2 < local_variable_3)
  {
   //...
  }
}

Попробуйте разобрать вышеуказанную функцию и посмотрите, насколько близко она соответствует вашему фрагменту кода.

0 голосов
/ 06 мая 2010

Это сравнение между (EBP + 8) и (EBP + 12). На основе результата сравнения инструкция cmpl устанавливает флаги, которые используются в соответствии с инструкциями перехода.

В 32-разрядный Mac OS X ABI EBP + 8 - это первый параметр функции, а EBP + 12 - второй параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...