Существуют ли значения по умолчанию для регистров? - PullRequest
5 голосов
/ 10 ноября 2010

Я пытаюсь понять небольшой код:

jg 0x00000047
dec esp
inc esi
add [ecx],eax

Какое значение eax ?Это четыре первых предложения программы, и я не знаю, есть ли значение по умолчанию или предыдущие предложения добавляют что-то в eax.

Моя ОС - Linux, а исполняемый файл компилируется gcc4.3из исходного кода C (gcc file.c exec)

Ответы [ 4 ]

5 голосов
/ 10 ноября 2010

Зависит от платформы, языка и / или соглашения о вызовах. Но да, код до этого обычно должен был установить EAX в какое-то значение. EAX является одним из тех регистров, которые изменяются так часто, что обычно не используются для хранения данных.

Инструкции выглядят довольно случайно. В частности, «dec esp» - это, как правило, огромное «нет-нет», так как стек всегда должен быть выровнен по dword. Вы уверены, что это настоящий код? Байты инструкции переводятся в «\ x7fELF», если я правильно переводю, что говорит мне о том, что это всего лишь байты заголовка программы Linux, а не фактические байты кода.

4 голосов
/ 10 ноября 2010

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

Например, соглашение о вызовах cdecl для x86 , которое используется большинством компиляторов Си, говорит, что при возврате функции возвращаемое значение попадает в регистр eax. Поэтому, если у вас есть функция int foo(), вы знаете, что после того, как foo выполнит свой код операции ret, eax будет содержать тот int, который вернул foo.

В отличие от этого, процессор PowerPC (обычно) имеет (как минимум) 32 регистра, просто называемых r0, r1, ... r31. Соглашение о вызовах AIX для этого чипа говорит, что указатель стека идет на r1, что параметры функции передаются на r3 через r11, что возвращаемые значения возвращаются на r3 и так далее.

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

struct CFoo {  void __stdcall method(); };

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

Когда мы говорим о том, как операционная система передает информацию в программу (или оборудование в операционную систему), мы обычно называем это ABI вместо соглашения о вызовах, но это та же идея , Так что в случае вашей программы она была написана, предполагая, что ОС передаст ей какую-то конкретную информацию на eax. Это предположение будет характерно для операционной системы, компилятора и, возможно, даже для отдельной программы.

3 голосов
/ 10 ноября 2010

Некоторые инструкции неявно обновляют регистры, даже если адресаты не указаны явно в коде.Некоторые примеры:

  • cpuid возвращает значения в eax, ebx, ecx и edx
  • loop уменьшает ecx
  • rep строковые инструкции изменяют ecx,edi и esi
  • rdmsr изменяет eax и edx
  • mul и div изменяет eax и edx

И есть много других примеров.

Вы не можете предположить, просто увидев, что eax не указан в коде, что он не изменился.

Даже если вы знаете, на какие регистры влияют какие инструкции, единственный раз, когда у вас естьЛюбая гарантия для значения:

  • после того, как известная вам инструкция обновляет его
  • сразу после аппаратного сброса

В любое другое время вы можетеникогда не делайте предположений о значениях.

2 голосов
/ 10 ноября 2010

Это не правильный код. Вы уверены, что это не текст?

Расшифровка 32-битного x86 дает строку ELF:

00: 7F 45  // 0x7F E
02: 4C     // L
03: 46     // F
04: 01 01  // ?? ??

Попробуйте открыть файл как файл ELF, а не только как двоичный файл.

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