Может кто-нибудь объяснить мне (в очень простых терминах), в чем разница между регистрами esp, ebp и esi? - PullRequest
5 голосов
/ 21 апреля 2011

Мне нужно изучить ассемблер, и я очень озадачен тем, что делают / указывают разные регистры.

Ответы [ 3 ]

10 голосов
/ 21 апреля 2011

На некоторых архитектурах, таких как MIPS, все регистры созданы равными, и на самом деле нет никакой разницы, кроме имени регистра (и соглашений о программном обеспечении).В x86 вы можете в основном использовать любые регистры для вычислений общего назначения, но некоторые регистры неявно связаны с набором команд.

Здесь можно найти много информации о специальных целях для регистров здесь .

Примеры:

  • eax, аккумулятор: многие арифметические инструкции неявно работают с eax.Для многих инструкций существуют также специальные более короткие кодировки, характерные для EAX: например, add eax, 123456 на 1 байт короче add ecx, 123456.(add eax, imm32 против add r/m32, imm32)
  • ebx, база: несколько неявных применений, но xlat - это та, которая соответствует "базе"именование.Все еще актуально: cmpxchg8b.Поскольку это редко требуется для чего-либо конкретного, некоторые 32-битные соглашения о вызовах / ABI используют его как указатель на "глобальную таблицу смещений" в Независимом от позиции коде (PIC).
  • edx, данные: некоторые арифметические операции неявно работают с 64-битным значением в edx: eax
  • ecx, счетчик, используемый для подсчета сдвигов и для rep movs.Кроме того, в основном устаревшая loop инструкция неявно уменьшает ecx
  • esi, исходный индекс: некоторые строковые операции читают строку из памяти, на которую указывает esi
  • edi, целевой индекс: некоторые строковые операции записывают строку в память, указанную edi.например, rep movsb копирует байты ECX из [esi] в [edi].
  • ebp, базовый указатель: обычно используется для указания на локальные переменные.Неявно используется leave.
  • esp, указатель стека: указывает на вершину стека, неявно используется push, pop, call и ret

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

Справочное руководство программиста Intel 80386 является незаменимым ресурсом, он в основном говорит вам все, что нужно знать о сборке x86, кромедля новых расширений и производительности на современном оборудовании.

Книга PC Assembly (e) - отличный ресурс для изучения ассемблера.

7 голосов
/ 21 апреля 2011

Регистр sp - это указатель стека, используемый для операций со стеком, таких как push и pop.

Стек известен как структура LIFO («последний вошел, первый вышел»), что означает, что последнее, что было добавлено, - это то, что сорвало кулак. Он используется, помимо прочего, для реализации возможности вызова функций.

Регистр bp является базовым указателем и обычно используется для операций со стеком.

Это означает, что это фиксированная ссылка для поиска локальных переменных, переданных параметров и т. Д. В стеке для заданного уровня (в то время как sp может изменяться во время выполнения функции, bp обычно не изменяется).

Если вы смотрите на ассемблере, например:

mov eax, [bp+8]

вы видите, как код обращается к переменной, зависящей от уровня стека.

Регистр si является исходным индексом, обычно используемым для операций массового копирования (di является его эквивалентным целевым индексом). Intel имеет эти регистры вместе со специальными инструкциями для быстрого перемещения байтов в памяти.

Варианты e- - это всего лишь 32-битные версии этих (изначально) 16-битных регистров. И, как будто этого было недостаточно, у нас также есть 64-битные r- варианты: -)

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

Переписано здесь и немного отредактировано, чтобы сделать ответ автономным.


enter image description here

РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ

8086 CPU имеет 8 регистров общего назначения, каждый из которых имеет свое имя:

  • AX - регистр аккумулятора (делится на AH/AL). Вероятно, наиболее часто используемый регистр для общего назначения.
  • BX - регистр базовых адресов (делится на BH/BL).
  • CX - регистр счета (делится на CH/CL). Специальные инструкции по наведению и сдвигу.
  • DX - регистр данных (делится на DH/DL). Используется с AX для некоторых операций MUL и DIV и для указания портов в некоторых операциях IN и OUT.
  • SI - регистр исходного индекса. Специальная инструкция для использования в качестве источника массовой памяти (DS:SI).
  • DI - регистр индекса назначения. Специальная инструкция для использования в качестве места назначения массовой памяти (ES:DI).
  • BP - базовый указатель, в основном используемый для доступа к параметрам и переменным в стеке.
  • SP - указатель стека, используемый для основных операций стека.

РЕГИСТРЫ СЕГМЕНТА

  • CS - указывает на сегмент, содержащий текущую инструкцию.
  • DS - обычно указывает на сегмент, где определены переменные.
  • ES - регистр дополнительного сегмента, кодер определяет его использование.
  • SS - указывает на сегмент, содержащий стек.

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

Сегментные регистры работают вместе с регистром общего назначения для доступа к любому значению памяти. Например, если мы хотим получить доступ к памяти по физическому адресу 12345h, мы могли бы установить DS = 1230h и SI = 0045h. Таким образом, мы можем получить доступ к гораздо большему объему памяти, чем с одним регистром, который ограничен 16-битными значениями.

Процессор вычисляет физический адрес, умножая регистр сегмента на 10h и добавляя в него регистр общего назначения (1230h * 10h + 45h = 12345h):

1230
 0045
=====
12345

Адрес, сформированный из 2 регистров, называется эффективным адресом.

Это использование только для реального режима (это единственный режим, который имел 8086).Более поздние процессоры изменили эти регистры с сегментов на селекторы, и они используются для поиска адресов в таблице, вместо того, чтобы выполнять фиксированные вычисления над ними.

По умолчанию регистры BX, SI и DIработа с DS сегментным регистром;и BP и SP работают с сегментным регистром SS.

РЕГИСТРЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ

IP - указатель инструкции:

  • Всегда указывает на следующую инструкцию, которая будет выполнена.
  • Адрес смещения относительно CS.

IP регистр всегда работает вместе с CS регистром сегмента ион указывает на выполняемую в данный момент инструкцию.

FLAGS REGISTER

Определяет текущее состояние процессора.Эти флаги автоматически изменяются ЦП после математических операций, это позволяет определить тип результата и определить условия для передачи управления другим частям программы.

Как правило, вы не можете получить доступ к этим регистрам напрямую.

enter image description here

  • Флаг переноса CF - этот флаг устанавливается в 1, когда происходит переполнение без знака.Например, при добавлении байтов 255 + 1 (результат не находится в диапазоне 0 ... 255).Если переполнения нет, этот флаг устанавливается на 0.
  • Флаг четности PF - этот флаг устанавливается на 1, когда в результате есть четное число из одного бита, и на 0, если есть нечетное числоодин бит.
  • Вспомогательный флаг AF - установить на 1, когда есть переполнение без знака для низкого куска (4 бита).
  • Нулевой флаг ZF - установить на 1, когда результат равен нулю.Для ненулевого результата этот флаг установлен на 0.
  • Sign Flag SF - установлен на 1, если результат отрицательный.Если результат положительный, он устанавливается на 0. (Этот флаг принимает значение старшего значащего бита.)
  • Флаг прерывания TF - Используется для отладки на кристалле.
  • Разрешение прерыванияФлаг IF - когда этот флаг установлен в 1, CPU реагирует на прерывания от внешних устройств.
  • Флаг направления DF - этот флаг используется некоторыми инструкциями для обработки цепочек данных, когда этот флаг установлен в0 - обработка выполняется вперед, когда этот флаг установлен в 1, обработка выполняется в обратном направлении.
  • Флаг переполнения OF - устанавливается в 1 при переполнении со знаком.Например, при добавлении байтов 100 + 50 (результат не находится в диапазоне -128 ... 127).
1 голос
/ 21 апреля 2011

Вот упрощенная сводка:

ESP - это текущий указатель стека, поэтому вы обычно обновляете его только для манипулирования стеком, а EBP также предназначен для манипулирования стеком, например, для сохранения значения ESP перед выделением стека.пространство для локальных переменных.Но вы также можете использовать EBP в качестве регистра общего назначения.

ESI - это регистр расширенного индекса источника, «строка» (отличается от C-строки, и я не имею в виду тип C-строки, которую носят женщинылибо) такие инструкции, как MOVS, используют ESI и EDI.

Адресация памяти:

x86 ЦПУ имеют эти специальные регистры, называемые «регистры сегментов», каждый из которых может указывать на свой адрес, например DS (обычно называемый сегментом данных) может указывать на 0x1000000, а SS (обычно называемый сегментом стека) может указывать на 0x2000000.

Когда вы используете EBP и ESP, регистр сегмента по умолчанию используется для SSI для ESI (и других общихцель регистров) это DS.Например, скажем, DS = 0x1000000, SS = 0x2000000, EBP = 0x10, ESI = 0x10, поэтому:

  mov eax,[esp] //loading from address 0x2000000 + 0x10
  mov eax,[esi] //loading from address 0x1000000 + 0x10

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

  mov eax,ds:[ebp]

С точки зрения сложения, вычитания, логических операций и т. Д. Между ними нет реальной разницы.

...