Почему Visual C ++ 2010 использует этот синтаксис сборки для адресации памяти?

0

Я преобразовал следующий код C++ в сборку с использованием Visual C++ 2010:

int main()
{
    int i;
    i = 1234;

    return 0;
}

Я получил следующий результат:

Изображение 174551

Основываясь на моем понимании адресации памяти, вычисление для адреса памяти всегда помещается внутри квадратных скобок, поэтому почему _i$ в этом случае помещается за пределы квадратных скобок?

  • 1
    Потому что синтаксис это позволяет?
  • 0
    может потому что это связано со стековым фреймом? i локальный, и адрес локальной переменной связан с фреймом стека, что вы видите, это относительный расчет адреса. адреса глобальных переменных фиксированы.
Теги:
assembly
visual-studio-2010

1 ответ

1
Лучший ответ

Ассемблер Microsoft рассматривает нечто вроде a[b] примерно так же, как C или C++, так a[b] и b[a] в значительной степени эквивалентны. Оба указывают на добавление и некоторое необязательное масштабирование, за которым следует разыменование, но не ставьте много требований о том, какая часть является "адресом", а какая - "индексом".

  • 1
    Обычный синтаксис Intel для ассемблера это смещение [регистр] или, опционально, [регистр + смещение], но регистр [смещение] обычно не допускается, поскольку [] подразумевает косвенное обращение к регистру, а регистр без [] подразумевает прямой доступ к регистру.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню