3.4. Сигнализация изменения регистров

Вверх  Предыдущий  Следующий

Если компилятор использует переменные, он иногда записывает их или результат каких-либо вычислений в регистры процессора. Если вы вставляете ассемблерный код в вашу программу, который изменяет регистры процессора, то это может помешать компилятору работать с регистрами. Чтобы избежать этой проблемы, Free Pascal позволяет вам указать компилятору, какие регистры изменялись в ассемблерном блоке (asm). Тогда компилятор сохранит и восстановит эти регистры, если он их использовал. Указать компилятору на регистры, которые изменяются, можно путём указания набора имен регистров, имеющихся в ассемблерном блоке, как показано ниже:

asm

end ['R1', … ,'Rn'];

Здесь набор от R1 до Rn – это имена регистров, которые вы изменяете в вашем ассемблерном коде.
Например:

asm

movl BP,%eax

movl 4(%eax),%eax

movl %eax,__RESULT

end ['EAX'];

В этом примере компилятору указано, что регистр EAX был изменён.

Для ассемблерных процедур, то есть для процедур, которые написаны полностью на ассемблере, ABI процессора и платформы должны соблюдаться, то есть процедура сама должна знать, какие регистры сохранять, а какие нет, но она может указать компилятору, используя тот же метод, какие регистры были изменены или нет. Компилятор сохранит указанные регистры в стек на входе и восстановит их на выходе из процедуры.

Единственное, что компилятор обычно делает, это создаёт минимальный кадр стека, если это необходимо (например, при объявлении переменных). Всё остальное зависит от программиста.