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

📄 setjmp.s43

📁 德州仪器(TI) 的超低功耗16 位RISC 混合信号处理器的MSP430 平台为电池供电的测量应用提供了最终解决方案。应用包括便携式医疗设备、低功耗工业操作、无线、实用计量等
💻 S43
字号:
//////////////////////////////////////////////////////////////////
// Copyright 1996, 2002 IAR Systems.  All rights reserved.
// $Id: setjmp.s43 1.5 2005/06/22 08:25:34Z ifrc Exp fredrikc $

#include "macros.m43"
#include "cfi.m43"

#define W0      R12
#define W1      R14
#define W2      R13

        XCFI_NAMES libNames
        XCFI_COMMON libCommon, libNames


// ---------------------------------------------------------
// setjmp
//

        MODULE  ?setjmp
        PUBLIC  setjmp

        RSEG    CODE:CODE:NOROOT(1)

        EXTERN  ?setjmp_save_r4
        EXTERN  ?setjmp_save_r5

        REQUIRE ?setjmp_save_r4
        REQUIRE ?setjmp_save_r5

        XCFI_BEGIN setjmp

        CFI     W0 Undefined

setjmp:
#if __CORE__==__430X_CORE__
        // Save all callee-save registers.
        MOVA    R11,  0(W0)
        MOVA    R10,  4(W0)
        MOVA    R9,   8(W0)
        MOVA    R8,  12(W0)
        MOVA    R7,  16(W0)
        MOVA    R6,  20(W0)
        MOVA    SP,  24(W0)
        // Save the return address.
        MOVX.A  @SP, 28(W0)
#else
        // Save all callee-save registers.
        MOV     R11,  0(W0)
        MOV     R10,  2(W0)
        MOV     R9,   4(W0)
        MOV     R8,   6(W0)
        MOV     R7,   8(W0)
        MOV     R6,  10(W0)
        MOV     SP,  12(W0)
        // Save the return address.
        MOV     @SP, 14(W0)
#endif
        REQUIRE ?setjmp_end

        XCFI_END setjmp


        // -------------------
        // Save R5, if not locked by all modules.
        //

        RSEG    CODE:CODE:NOROOT(1)
        PUBLIC  ?setjmp_r5

        XCFI_BEGIN ?setjmp_r5

        CFI     W0 Undefined

?setjmp_r5
#if __CORE__==__430X_CORE__
        MOVA    R5,  32(W0)
#else
        MOV     R5,  16(W0)
#endif
        XCFI_END ?setjmp_r5


        // -------------------
        // Save R4, if not locked by all modules.
        //

        RSEG    CODE:CODE:NOROOT(1)
        PUBLIC  ?setjmp_r4

        XCFI_BEGIN ?setjmp_r4

        CFI     W0 Undefined

?setjmp_r4
#if __CORE__==__430X_CORE__
        MOVA    R4,  36(W0)
#else
        MOV     R4,  18(W0)
#endif
        XCFI_END ?setjmp_r4


        // -------------------
        // The end.
        //

        RSEG    CODE:CODE:NOROOT(1)
        PUBLIC  ?setjmp_end

        XCFI_BEGIN ?setjmp_end

        CFI     W0 Undefined

?setjmp_end:
        MOV     #0, W0

        XRET

        XCFI_END ?setjmp_end

        ENDMOD


// ---------------------------------------------------------
// ?setjmp_save_rX
//
// The following three modules are the library versions
// of modules generated by the C-compiler to force
// the setjmp/longjmp functions to include code
// to handle non-locked registers.
//
// The setjmp/longjmp routines require these.  In the
// C-compiler generated version they in turn require
// ?setjmpX and ?longjmpX which will save the appropriate
// number of registers.
//
// Note that it is sufficient for one module to
// use a non-locked register to make setjmp/longjmp
// save that register regardless from which module
// it was called.
//

        MODULE  ?setjmp_save_r4
        PUBWEAK ?setjmp_save_r4
        RSEG    CODE:CODE:NOROOT(1)

?setjmp_save_r4:
        ENDMOD

        MODULE  ?setjmp_save_r5
        PUBWEAK ?setjmp_save_r5
        RSEG    CODE:CODE:NOROOT(1)

?setjmp_save_r5:
        ENDMOD


// ---------------------------------------------------------
// longjmp
//

// A note on the implementation.  The two segment parts "?longjmp_r5"
// and "?longjmp_r4" could be excluded or included depending on
// register locking.  Note that the latter can not rely on side
// effects (read: post increment) performed in the former.  This is
// the cause of the "2(W2)" operand in the latter.

        MODULE  ?longjmp
        PUBLIC  longjmp
        PUBLIC  ?longjmp_end

        EXTERN  ?setjmp_save_r4
        EXTERN  ?setjmp_save_r5

        RSEG    CODE:CODE:NOROOT(1)

        XCFI_BEGIN longjmp

        CFI     W0  Undefined
        CFI     W2  Undefined

        // Undefined due to calling convention.
        CFI     R15 Undefined
        CFI     R14 Undefined
        CFI     R13 Undefined
        CFI     R12 Undefined

        CFI     R11 Undefined
        CFI     R10 Undefined
        CFI     R9  Undefined
        CFI     R8  Undefined
        CFI     R7  Undefined
        CFI     R6  Undefined


longjmp:
        // Pointer to the buffer.
        MOV     W0, W2

        // Move the return value to the return location.
        MOV     W1, W0

        // Ensure that the return value is not zero.
        CMP     #0, W0
        JNE     nonzero
        MOV     #1, W0

nonzero:
#if __CORE__==__430X_CORE__
        // Restore the callee-save registern.
        MOVX.A  @W2+, R11
        CFI     R11 SameValue

        MOVX.A  @W2+, R10
        CFI     R10 SameValue

        MOVX.A  @W2+, R9
        CFI     R9 SameValue

        MOVX.A  @W2+, R8
        CFI     R8 SameValue

        MOVX.A  @W2+, R7
        CFI     R7 SameValue

        MOVX.A  @W2+, R6
        CFI     R6 SameValue

        MOVX.A  @W2+, SP
        CFI     rememberstate
        CFI     PC Undefined

        // Restore the return address.
        MOVX.A  @W2+ , 0(SP)
#else
        // Restore the callee-save registern.
        MOV     @W2+, R11
        CFI     R11 SameValue

        MOV     @W2+, R10
        CFI     R10 SameValue

        MOV     @W2+, R9
        CFI     R9 SameValue

        MOV     @W2+, R8
        CFI     R8 SameValue

        MOV     @W2+, R7
        CFI     R7 SameValue

        MOV     @W2+, R6
        CFI     R6 SameValue

        MOV     @W2+, SP
        CFI     rememberstate
        CFI     PC Undefined

        // Restore the return address.
        MOV     @W2+ , 0(SP)
#endif
        CFI     restorestate

        REQUIRE ?longjmp_end

        XCFI_END longjmp


        // -------------------
        // Restore R5, if not locked by all modules.
        //

        RSEG    CODE:CODE:NOROOT(1)
        PUBLIC  ?longjmp_r5
        XCFI_BEGIN ?longjmp_r5

        CFI     PC Undefined

        CFI     R15 Undefined
        CFI     R14 Undefined
        CFI     R13 Undefined
        CFI     R12 Undefined

        CFI     R5 Undefined

?longjmp_r5:

#if __CORE__==__430X_CORE__
        MOVX.A  @W2, R5
#else
        MOV     @W2, R5
#endif

        CFI     R5 SameValue

        XCFI_END ?longjmp_r5


        // -------------------
        // Restore R4, if not locked by all modules.
        //

        RSEG    CODE:CODE:NOROOT(1)
        PUBLIC  ?longjmp_r4

        XCFI_BEGIN ?longjmp_r4

        CFI     PC Undefined

        CFI     R15 Undefined
        CFI     R14 Undefined
        CFI     R13 Undefined
        CFI     R12 Undefined

        CFI     R4  Undefined

?longjmp_r4:
#if __CORE__==__430X_CORE__
        MOVX.A  4(W2), R4
#else
        MOV     2(W2), R4
#endif

        CFI     R4  SameValue

        XCFI_END ?longjmp_r4


        // -------------------
        // The end.
        //

        RSEG    CODE:CODE:NOROOT(1)

        XCFI_BEGIN ?longjmp_end

        CFI     PC Undefined

        CFI     R15 Undefined
        CFI     R14 Undefined
        CFI     R13 Undefined
        CFI     R12 Undefined

        XRET

?longjmp_end:

        XCFI_END ?longjmp_end

        ENDMOD

        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -