本代码的汇编部分采用Blackfin指令集。具体参考手册可以在www.analog.com主页上下载。
setjmp.asm:
.section program;
. extern _jmp_buf, _jmp_index;
_set_jmp:
. global _set_jmp;
[ -- sp] = r0;
[ -- sp] = p0;
[ -- sp] = p1;
p1.h = hi(_jmp_index);
p1.l = lo(_jmp_index);
r0 = [p1];
p0 = r0;
r0 += 4 ;
[p1] = r0;
p1.l = lo(_jmp_buf);
p1.h = hi(_jmp_buf);
p0 = p0 + p1;
r0 = rets;
[p0] = r0;
p1 = [sp ++ ];
p0 = [sp ++ ];
r0 = [sp ++ ];
unlink;
rts;
_set_jmp.end:
_long_jmp:
. global _long_jmp;
link 0xc ;
[ -- sp] = r0;
[ -- sp] = p1;
p1.l = lo(_jmp_index);
p1.h = hi(_jmp_index);
r0 = [p1];
r0 += - 4 ;
p0 = r0;
[p1] = r0;
p1.l = lo(_jmp_buf);
p1.h = hi(_jmp_buf);
nop;
p0 = p0 + p1;
p0 = [p0];
p1 = [sp ++ ];
r0 = [sp ++ ];
jump (p0);
_long_jmp.end:
. extern _jmp_buf, _jmp_index;
_set_jmp:
. global _set_jmp;
[ -- sp] = r0;
[ -- sp] = p0;
[ -- sp] = p1;
p1.h = hi(_jmp_index);
p1.l = lo(_jmp_index);
r0 = [p1];
p0 = r0;
r0 += 4 ;
[p1] = r0;
p1.l = lo(_jmp_buf);
p1.h = hi(_jmp_buf);
p0 = p0 + p1;
r0 = rets;
[p0] = r0;
p1 = [sp ++ ];
p0 = [sp ++ ];
r0 = [sp ++ ];
unlink;
rts;
_set_jmp.end:
_long_jmp:
. global _long_jmp;
link 0xc ;
[ -- sp] = r0;
[ -- sp] = p1;
p1.l = lo(_jmp_index);
p1.h = hi(_jmp_index);
r0 = [p1];
r0 += - 4 ;
p0 = r0;
[p1] = r0;
p1.l = lo(_jmp_buf);
p1.h = hi(_jmp_buf);
nop;
p0 = p0 + p1;
p0 = [p0];
p1 = [sp ++ ];
r0 = [sp ++ ];
jump (p0);
_long_jmp.end:
//
test.cpp
#include < stdio.h >
int jmp_buf[ 1024 ] = ... { } ;
int jmp_index = 0 ;
#define EXCEPTION_RETURN() asm("unlink;"); /
asm( " rts; " )
extern " C "
... {
void set_jmp(void);
void long_jmp(void);
}
static void Test( void )
... {
set_jmp();
printf("The address is: %x ", jmp_buf[0]);
printf("The index is: %d ", jmp_index);
EXCEPTION_RETURN();
}
int main( void )
... {
Test();
long_jmp();
return 1;
}
#include < stdio.h >
int jmp_buf[ 1024 ] = ... { } ;
int jmp_index = 0 ;
#define EXCEPTION_RETURN() asm("unlink;"); /
asm( " rts; " )
extern " C "
... {
void set_jmp(void);
void long_jmp(void);
}
static void Test( void )
... {
set_jmp();
printf("The address is: %x ", jmp_buf[0]);
printf("The index is: %d ", jmp_index);
EXCEPTION_RETURN();
}
int main( void )
... {
Test();
long_jmp();
return 1;
}