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

被折叠的 条评论
为什么被折叠?



