本代码的汇编部分采用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: // 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;}