Это «делает это вручную» для генерации статических адресов, как обходной путь для ассемблера MARS, которому не хватает %hi(symbol)
и %lo(symbol)
, чтобы заставить компоновщик заполнить 4097
(0x1001
) из старшей половиныадреса Alength
и Aarray
, а также 4 и 8 из нижней половины этих адресов.
Этот код предполагает, что MARS поместит секцию .data
в 0x10010000
, как этоговорит в строке с директивой .data
.
Две строки суммируют до 4 байтов, поэтому значения слов уже выровнены по словам.Этот код пропускает директиву .align
, даже если бы он заканчивался нулевыми байтами (пока вы не добавите еще одну строку и ваше слово не прервется).
Если вы скомпилируете этот C в проводнике компилятора Godbolt :
int x = 1; // with no initializer it goes in the .bss as .space 4
int foo() { return x; }
MIPS gcc5.4 -O3 дает вам этот ассм (некоторый шум убирается):
foo():
lui $2,%hi(x)
lw $2,%lo(x)($2)
j $31
nop # IDK why it didn't put the load in the branch-delay slot; clang does
.data
.p2align 2 # actually gcc uses .align 2 but I disambiguated
x:
.word 1
$2
is $v0
, возвращаемое значение в стандартном соглашении о вызовах MIPS.