Ада-95. Компилятор GNAT



         

Ограничения - часть 2


/p>

При использовании другого типа процессора или при необходимости получения более исчерпывающей информации об ограничениях, следует обратиться к руководствам по gcc и as.

При необходимости использования более специфических ограничений, которые описаны в руководстве по gcc, следует помнить, что допускается использование комбинаций из нескольких самостоятельных ограничений.

В настоящий момент должно быть понятно, что ограничения используются для указания компилятору как необходимо управлять конкретной переменной (или как ее интерпретировать).

Теперь необходимо рассмотреть то, как указать компилятору где эта переменная находится.

Для связывания параметра вывода с ассемблерным операндом используется %x-нотация, в которой x является числом.

Asm ("pushfl" & LF & HT & -- сохранить регистр флагов в стеке "popl %%eax" & LF & HT & -- загрузить флаги из стека в регистр eax "movl %%eax, %0", -- сохранить значение флагов в переменной Outputs => Unsigned_32'Asm_Output ("=g", Eax));

Таким образом, в показанном выше фрагменте кода, %0 будет заменяться фактическим кодом, в соответствии с решением компилятора о фактическом месторасположении переменной Eax.

Означает-ли это, что мы можем иметь только одну переменную вывода?

Нет, мы можем иметь их столько сколько нам необходимо.

Это работает достаточно просто:

можно описать множество параметров вывода разделяя их запятыми и завершая список символом точки с запятой

  • отсчет операндов ведется в последовательности %0, %1, %2

    и т.д., начиная с первого параметра вывода

    Для демонстрации сказанного, приведем простой пример:

    Asm ("movl %%eax, %0" & "movl %%ebx, %1" & "movl %%ecx, %2", Outputs => (Unsigned_32'Asm_Output ("=g", Eax"), -- %0 = Eax (Unsigned_32'Asm_Output ("=g", Ebx"), -- %1 = Ebx (Unsigned_32'Asm_Output ("=g", Ecx)); -- %2 = Ecx

    Следует нпомнить с чего начиналось написание нашего примера:




    Содержание  Назад  Вперед