Весь вопрос немного неточен ... (перечитывая его, вы на самом деле очень конкретны в отношении "в сборке выше" ... о, хорошо, тогда ответ "никуда" ... и остальная часть моего ответадля вопроса, который не был опубликован, но, надеюсь, объясняющего, почему «нигде» не является ответом на ваш вопрос).
У вас есть источник C, и затем вы показываете некоторую сборку в качестве вывода компилятора (но вы не указываете компилятор) и затем вы спрашиваете о сборке ...
C определяется на "абстрактной машине C", а вы смотрите на конкретную реализацию x86-64 такой абстрактной машины.
Хотя в этой реализации есть некоторые правила, в которых статические переменные обычно заканчиваются, это полностью зависит от компилятора - как он хочет их реализовать.
В чистой сборке (например,от руки, или с точки зрения процессора) нет такой вещи, как «статическое значение».У вас есть только регистры, память и периферийные устройства.
Таким образом, в Assembly (машинный код) вы можете использовать определенный регистр или определенную часть памяти в качестве статической переменной.В зависимости от того, что больше соответствует вашим потребностям (не существует жесткого правила, которое заставляло бы вас делать это каким-либо особым образом, за исключением того, что вы должны выразить свою идею в допустимом машинном коде для целевого ЦП, но это обычно означает, что существуют миллиарды возможностей и даже когдаограничивая себя только «разумными», это все же больше в сторону десятков возможных способов, чем только одного).
Вы можете (в x86-64) даже создать немного запутанную схему, как сохранить значение в виде кодасостояние («часть памяти» - это тогда память, занятая машинным кодом), то есть оно не будет напрямую записано в память как значение, но код будет следовать определенным путям кода (из многих возможных), чтобы получить правильный конечный результат,т.е. кодирование значения в самом коде.Есть, например, полный по Тьюрингу способ компилирования исходного кода C в машинный код x86-64 с использованием только инструкции mov
, который, возможно, не использует память для статических переменных (не уверен, добавляет ли он раздел .data
или избегает его путемкомпилировать его в код mov
тоже, но из его явного существования должно быть совершенно очевидно, как теоретически можно избежать .data
).
Таким образом, вы либо спрашиваете, как конкретный компилятор C с конкретными параметрами времени компиляцииреализует статические значения (и это может иметь несколько вариантов в зависимости от источника и используемых опций) ...
... или если вы действительно спрашиваете "где статические значения хранятся в сборке", тогда ответ «где угодно, если ваш машинный код действителен и корректен» , поскольку вся концепция «статического значения» имеет более высокий уровень, чем процессор, на котором она работает, так что это похоже на интерпретацию конкретной цели машинного кода«это статическое значение», но в CPU нет специальной инструкции / поддержки.