Подтвердить что ты не робот

Что означают знаки доллара ($) и процента (%) в сборке x86?

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

sub $48, %esp
mov %eax, 32(%esp)

Что означают эти коды? Что такое 32 операнда в дополнение к регистру esp?

4b9b3361

Ответ 1

Это не синтаксис Intel, его синтаксис AT & T, также называемый синтаксисом GAS.

префикс $ для непосредственных (констант), а префикс % - для регистров (требуется 1).

Дополнительные сведения о синтаксисе AT & T см. Также в wiki- [att].


1 Если параметр noprefix не указан, см. Здесь и здесь. Но обычно noprefix используется только с .intel_syntax noprefix, чтобы получить MASM-подобный синтаксис.

Ответ 2

Да, "32 (% esp)" означает смещение 32 из% esp.

Ответ 3

Как сказал @Necrolis, написанный в синтаксисе AT & T. Это означает:

subtract 48 from the register esp (the stack pointer).
store the contents of eax to the four bytes starting at (esp + 32).

Ответ 4

По сравнению с синтаксисом Intel синтаксис AT & T имеет много отличий

  • $ означает константу (целочисленный литерал). Без него число является абсолютным адресом
  • % обозначает регистр
  • Исходный/целевой порядок отменяется
  • () используется для ссылки на память, например [] в синтаксисе Intel

Таким образом, приведенный выше фрагмент эквивалентен

sub esp, 48         ; esp -= 48
mov [esp+32], eax   ; store eax to the value at the address 'esp + 32'

Ответ 5

Это синтаксис AT & T для x86. В AT & T % обычно обозначает регистр, тогда как $ зарезервирован для непосредственных пользователей. Если вы опускаете th $, ассемблер интерпретирует 48 как адрес.