setjmp.c

来自「CVAVR的函数库的源代码。开发AVR的编译器CodeVision AVR最新版」· C语言 代码 · 共 95 行

C
95
字号
/* 
  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 + =
减小字号Ctrl + -
显示快捷键?