⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setjmp.c

📁 CVAVR的函数库的源代码。开发AVR的编译器CodeVision AVR最新版本2.53的函数库c语言源代码。函数短小精悍
💻 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 + -