Hi,
muss in einer c-Funktion aus Zeitgründen Asm verwenden. Bisher musste ich hierfür allerdings noch nie einen Wert zurückgeben.

Problem:
Ich muss in einer Interruptroutine so schnell wie möglich Port D lesen.
Ich habe hierfür folgende Routine erstellt:
Code:
volatile unsigned char G_cLastData = 0xAA;

EXTINT_INTERRUPT_HANDLER(SIG_INTERRUPT0){
    asm volatile(
		"IN		%0, %1"	"\n\t"
		: "=r" (G_cLastData)			//Output
		: "I"  (_SFR_IO_ADDR(PORTD))	//Input
	);
}
Das produziert folgenden Asm Code
Code:
EXTINT_INTERRUPT_HANDLER(SIG_INTERRUPT0){
     d70:	1f 92       	push	r1
     d72:	0f 92       	push	r0
     d74:	0f b6       	in	r0, 0x3f	; 63
     d76:	0f 92       	push	r0
     d78:	11 24       	eor	r1, r1
     d7a:	8f 93       	push	r24
     d7c:	cf 93       	push	r28
     d7e:	df 93       	push	r29
     d80:	cd b7       	in	r28, 0x3d	; 61
     d82:	de b7       	in	r29, 0x3e	; 62
    asm volatile(
     d84:	82 b3       	in	r24, 0x12	; 18
     d86:	80 93 79 00 	sts	0x0079, r24
     d8a:	80 91 79 00 	lds	r24, 0x0079
     d8e:	df 91       	pop	r29
     d90:	cf 91       	pop	r28
     d92:	8f 91       	pop	r24
     d94:	0f 90       	pop	r0
     d96:	0f be       	out	0x3f, r0	; 63
     d98:	0f 90       	pop	r0
     d9a:	1f 90       	pop	r1
     d9c:	18 95       	reti

Meine Fragen nun:
-Funktioniert das so?
-Wie kann ich dem Compiler sagen, dass er mir den Stack vorher nicht aufräumen muss, da im Code die Register nicht verwendet werden?


Gruss
Michael