Ерунда на постном масле, причём здесь стек? Ну вызвали вы подпрограмму, ну взяли вы адрес ячеек, который сгенерила сишная программа, ну вызвали вы из си ассемблерную программу, ну так сохраните регистры, которые она использует. Тем более, что вызов подпрограммы можно оформить отдельной строкой (отдельным оператором), а сишная программа вроде бы не "пересекает" регистры разных операторов (без учёта оптимизации, конечно).
Ниже приведен обещанный пример объединения по третьему варианту. Вырвано из рабочего проекта, кое-что удалено, кое-что подправлено.
CODE
// File: example.c
// Title: Example
// Version: 1.4
// Last updated: 09.03.13
// Author: GM
//Target: ATmega324PA (16MHz operating frequency)
//
// Support E-mail: xxxxx@xxxx.ru
//
// DESCRIPTION
// The routine measures
#define F_CPU 16000000UL //16MHz
#define PI 3.14159265359L
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <avr/pgmspace.h>
extern void mactest(void);
extern void asmroutine(void);
long long volatile re0=0;
long long volatile uval;
long volts[20] __attribute__ ((section (".block80")));
int ptra,ptrb;
unsigned char tab10k/ / __attribute__ ((section (".gentable")));
unsigned char tab10k/380/ =
{
128,137,147,157,167,176,185,194,
202,210,217,224,230,236,241,245,
248,251,253,254,255,254,253,251,
248,245,241,236,230,224,217,210
};
int main (void)
{
double num,R0;
int i,j;
mactest();
while(1) //loop forever
{
asmroutine();
re1=0;
im1=im1+(((long long)volts[j++])*((long long)sin10[i]));
}
}
;File: asmroutine.ASM
;Title: asm subroutine example
;Version: 1.1
;Last updated: 01.06.11
;Author: GM
;Target: ATmega324PA (16MHz operating frequency)
;
;Support E-mail: xxxxxx@xxxx.ru
;
;DESCRIPTION
; -----------------------
.nolist
#include <avr/io.h> // Include device specific definitions
.list
;#define tmp1 r16;
;#define rs 0
;#define rw 1
;#define e 2
;#define rst 6;
;#define cs 5;
;#define sclk 4;
;#define sda 3;
#define c0 r8
#define c1 r9
#define c2 r10
#define c3 r11
#define d0 r12
#define d1 r13
#define d2 r14
#define d3 r15
#define zl r30
#define zh r31
.global tab25k
.global re0
.global im0
.global asmroutine
.func asmroutine
asmroutine:
ldi ZL,lo8(tab25k)
ldi ZH,hi8(tab25k)
clr c0
clr c1
clr d1
asm1: lpm r0,Z+
lds c0,re0+0
lds c1,re0+1
add c0,d0
adc c1,d1
adc c2,d2
sts re0+1,c1
sts re0+2,c2
sts re0+3,c3
; rjmp asm1
ret
.endfunc