Цитата(_Pasha @ Dec 17 2008, 12:17)

Есть у меня еще в стадии тестирования субвекторизация.
Есть несколько менее переносимый, зато более эффективный способ. В том смысле, что переписать эту субвекторизацию на другой асм другого процессора+компилятора можно, как можно и посмотреть реализацию структуры jump_buf и сделать переключатель, как у Rst7, привязанный к процессору+компилятору, но переписываемый под любую другую компбинацию. А тут - привязка к конкретному инструменту. Но раз в примере всё равно использован gcc, то... в нём можно взять адрес метки.
Во-первых, при этом можно WherePC сделать макросом, адрес вычисляется линкером:
Код
#define glue2(a,b) a##b
#define WPC_LABEL(a,b) glue2(a,b)
#define WherePC(a) { a = &&WPC_LABEL(WPC,__LINE__); WPC_LABEL(WPC,__LINE__):; }
volatile unsigned char a;
void *p1;
void *p2;
void foo() {
++a;
WherePC(p1);
++a;
WherePC(p2);
++a;
}
И результат компиляции:
Код
foo:
lds r24,a
subi r24,lo8(-(1))
sts a,r24
ldi r24,lo8(gs(.L2))
ldi r25,hi8(gs(.L2))
sts (p1)+1,r25
sts p1,r24
.L2:
lds r24,a
subi r24,lo8(-(1))
sts a,r24
ldi r24,lo8(gs(.L3))
ldi r25,hi8(gs(.L3))
sts (p2)+1,r25
sts p2,r24
.L3:
lds r24,a
subi r24,lo8(-(1))
sts a,r24
ret
Во вторых, этот макрос при такой постановке вопроса не нужен вообще:
http://forum.sources.ru/index.php?showtopi...p;#entry1929594В переводе на AVR-ский язык
Код
ISR(INT0_vect)
{
static void *next_state = &&start;
goto *next_state;
start:
next_state = &&idle;
return;
idle:
if (PINB & 0x01) {
PORTB |= 0x80;
next_state = &&drain;
}
return;
drain:
if (PINB & 0x02) {
PORTB &= ~0x80;
next_state = &&idle;
}
return;
}
И результат:
Код
.text
.size foo, .-foo
.global __vector_1
__vector_1:
push __zero_reg__
push __tmp_reg__
in __tmp_reg__,__SREG__
push __tmp_reg__
clr __zero_reg__
push r24
push r25
push r30
push r31
lds r30,next_state.1519
lds r31,(next_state.1519)+1
ijmp
.L6:
.L13:
ldi r24,lo8(gs(.L7))
ldi r25,hi8(gs(.L7))
sts (next_state.1519)+1,r25
sts next_state.1519,r24
rjmp .L12
.L7:
sbis 35-0x20,0
rjmp .L12
sbi 37-0x20,7
ldi r24,lo8(gs(.L10))
ldi r25,hi8(gs(.L10))
sts (next_state.1519)+1,r25
sts next_state.1519,r24
rjmp .L12
.L10:
sbis 35-0x20,1
rjmp .L12
cbi 37-0x20,7
rjmp .L13
.L12:
pop r31
pop r30
pop r25
pop r24
pop __tmp_reg__
out __SREG__,__tmp_reg__
pop __tmp_reg__
pop __zero_reg__
reti
.data
next_state.1519:
.word gs(.L6)