Inline Assembler: какие регистры можно использовать? - PullRequest
6 голосов
/ 24 октября 2009

При вставке встроенного ассемблера в функцию на C-подобном языке, каково соглашение о том, какие регистры вы можете использовать для нуля? Обязан ли компилятор сохранять значения всех регистров, которые ему нужно сохранить перед входом в блок asm? Ответственность за сохранение значений в этих регистрах и восстановление их перед выходом из блока asm лежит на программисте. Существует ли типичное соглашение или это очень зависит от реализации?

Ответы [ 3 ]

9 голосов
/ 24 октября 2009

Встроенная сборка по определению зависит от компилятора.

Большинство компиляторов, поддерживающих встроенную сборку, имеют синтаксис, который позволяет указать, какие регистры изменены сборкой. Затем компилятор может сохранять и восстанавливать эти регистры по мере необходимости.

7 голосов
/ 24 октября 2009

Это очень зависит от компилятора. Однако для реалистичного примера возьмем gcc на x86. Формат:

asm ( assembler template
    : output operands               (optional)
    : input operands                (optional)
    : list of clobbered registers       (optional)
    );  

Где "список засоренных регистров" - вы сообщаете компилятору, который регистрирует ваш код, который используется.

Вот простой код для копирования в память:

asm ("movl $count, %%ecx;
      up: lodsl;    
      stosl;
      loop up;"
    :           /* no output */
    :"S"(src), "D"(dst) /* input */
    :"%ecx", "%eax" );  /* clobbered list */    

Учитывая эти указания, gcc не будет использовать eax и ecx для других вещей в блоке.

Подробнее здесь .

2 голосов
/ 24 октября 2009

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

...