Я преобразовал следующий код C++ в сборку с использованием Visual C++ 2010:
int main()
{
int i;
i = 1234;
return 0;
}
Я получил следующий результат:
Основываясь на моем понимании адресации памяти, вычисление для адреса памяти всегда помещается внутри квадратных скобок, поэтому почему _i$
в этом случае помещается за пределы квадратных скобок?
Ассемблер Microsoft рассматривает нечто вроде a[b]
примерно так же, как C или C++, так a[b]
и b[a]
в значительной степени эквивалентны. Оба указывают на добавление и некоторое необязательное масштабирование, за которым следует разыменование, но не ставьте много требований о том, какая часть является "адресом", а какая - "индексом".
i
локальный, и адрес локальной переменной связан с фреймом стека, что вы видите, это относительный расчет адреса. адреса глобальных переменных фиксированы.