Встроенный Ассемблер: Какие регистры царапины могут использоваться?

В C++ struct (почти) синонимично с class (кроме другого уровня доступа по умолчанию), таким образом, да, Вы можете.

struct A {
// fields are public by default
};

class B: public A {
// fields are private by default
};

я не знаком с MFC, но он похож на попытку поддержать и C и API C++.

6
задан dsimcha 24 October 2009 в 05:19
поделиться

3 ответа

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

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

9
ответ дан 8 December 2019 в 13:00
поделиться

Это очень специфично для компилятора. Однако для реалистичного примера возьмем 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 для других вещей в блоке.

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

7
ответ дан 8 December 2019 в 13:00
поделиться

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

2
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: