gcc вграден монтаж за превключване на контекста

Опитвам се да внедря превключване на контекст, използвайки gcc за m68k процесори. Трябва да използвам вградено асемблиране за запазване на всички регистри d0, d1...d7 и a0,...a7. Чудех се дали мога да използвам цикъл в моя вграден gcc, който да ми позволи да запазя тези регистри, вместо да пиша отделен ред код за всеки регистър.

за напр.

move.l %d0, temp pcb.cpuregs.d0 = темп

искам да направя 0 вътре в d0 като брояч на цикъл.


person rsinha    schedule 27.06.2009    source източник


Отговори (3)


Ето:

MOVEM.L D0-D7/A0-A7,-(A7) ;Save registers onto stack.

Не е нужно да използвате стека, можете да използвате друг адрес.
Имам чувството, че режимът преди намаляване е задължителен,
но не мога да го тествам в момента, тъй като не го правя имат 68k машина.

p.s. това вероятно не е gcc диалект, тъй като gcc не съществуваше, когато
написах този код, но съм сигурен, че можете да го разберете.

p.p.s защо не използвате setjmp вместо вградено асемблиране?
тогава вашият превключвател на контекст ще бъде полу-преносим.

person Rhythmic Fistman    schedule 27.06.2009
comment
Да, наистина, използвайте setjmp. Ако можете да избегнете асемблиращия код, направете го. - person Max Lybbert; 02.07.2009
comment
Правя нещо подобно: настройвам указатели на стека на съпрограми към техните собствени отделни пространства на стека, преди да ги извикам, за което само setjmp е недостатъчно. Може ли asm като този да бъде поставен във вградена функция, която може да бъде гарантирано вградена, или трябва да се използва макрос, за да се избегне функционално извикване (и свързаните с него мутации в регистрите, които искаме да запазим)? - person Alexander; 27.10.2017
comment
Зависи от вашия компилатор, но това звучи точно като това, за което бихте използвали вградено асемблиране. - person Rhythmic Fistman; 31.10.2017

Може да помислите за макроси:

#define SAVE_REG_DXX(no)  __asm__ __volatile__("move.l %%d" #no ", %0" : "=g" (pcb.cpuregs.d ## no))

SAVE_REG_DXX(0);
SAVE_REG_DXX(1);
SAVE_REG_DXX(2);

#undef SAVE_REG_DXX
person Adrian Panasiuk    schedule 27.06.2009

Не можете да използвате цикъл for в стил C вътре в блока asm. Но можете да използвате вашия C код, за да създадете низ и да го предадете на asm.

person eduffy    schedule 27.06.2009