Что означают знаки доллара ($) и процента (%) в сборке x86?
Я пытаюсь понять, как работает язык ассемблера для класса архитектуры микрокомпьютера, и я вижу в примерах различные синтаксисы:
sub $48, %esp
mov %eax, 32(%esp)
Что означают эти коды? Что такое 32 операнда в дополнение к регистру esp?
Ответы
Ответ 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 как адрес.