📄 setjmp.c
字号:
/*
CodeVisionAVR C Compiler
(C) 1998-2002 Pavel Haiduc, HP InfoTech S.R.L.
non-local jump functions
*/
#pragma warn-
int setjmp(char *env)
{
#ifdef _MODEL_TINY_
#asm
ld r26,y
clr r27
#endasm
#else
#asm
ld r26,y
ldd r27,y+1
#endasm
#endif
#asm
clr r30
clr r31
_setjmp_entry:
sbiw r30,0
brne _setjmp1
ldi r22,low(_setjmp_entry)
st x+,r22 ;ret_addr
ldi r22,high(_setjmp_entry)
st x+,r22
st x+,r28 ;data_sp=Y
st x+,r29
in r22,spl ;hard_sp=SP
st x+,r22
in r22,sph
st x+,r22
pop r23
pop r22
push r22
push r23
st x+,r22
st x+,r23
in r22,sreg
st x,r22 ;status=SREG
rjmp _setjmp_exit
_setjmp1:
cli
ld r28,x+
ld r29,x+
ld r22,x+
out spl,r22
ld r22,x+
out sph,r22
ld r22,x+
push r22
ld r22,x+
push r22
ld r22,x
out sreg,r22
_setjmp_exit:
#endasm
}
void longjmp(char *env, int retval)
{
#ifdef _MODEL_TINY_
#asm
ldd r26,y+2
clr r27
#endasm
#else
#asm
ldd r26,y+2
ldd r27,y+3
#endasm
#endif
#asm
ld r30,y
ldd r31,y+1
sbiw r30,0
brne _longjmp1
ldi r30,1
clr r31
_longjmp1:
ld r22,x+
push r22
ld r22,x+
push r22
#endasm
}
#ifdef _WARNINGS_ON_
#pragma warn+
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -