Что обозначают знак доллара ($) и процент (%) в сборке x86? - PullRequest
23 голосов
/ 08 февраля 2012

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

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

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

Ответы [ 5 ]

23 голосов
/ 08 февраля 2012

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

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

Подробнее о синтаксисе AT & T см. Также тег [att] вики .


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

2 голосов
/ 19 июня 2014

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

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

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

sub esp, 48         ; esp -= 48
mov [esp+32], eax   ; store eax to the value at the address `esp + 32`
2 голосов
/ 09 февраля 2012

Да, «32 (% esp)» указывает на смещение 32 от% esp.

1 голос
/ 08 февраля 2012

Как сказал @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).
0 голосов
/ 08 февраля 2012

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

...