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

📄 objmacs.s

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 S
📖 第 1 页 / 共 2 页
字号:
;;; h_objmacro.s
;;; Copyright (C) Advanced RISC Machines Ltd., 1991

;;; RCS $Revision: 1.18.2.1 $
;;; Checkin $Date: 1998/09/16 10:42:29 $
;;; Revising $Author: wdijkstr $

 [ :LNOT: :DEF: THUMB
        GBLL    THUMB
    [ :DEF: thumb
THUMB   SETL {TRUE}
    |
    [ {CONFIG} = 16
THUMB   SETL    {TRUE}
    |
THUMB   SETL    {FALSE}
    ]
    ]
 ]
 [ THUMB
        CODE32
 ]
 [ :LNOT: :DEF: INTERWORK
        GBLL    INTERWORK
INTERWORK SETL {FALSE}
 ]

 [ :LNOT::DEF:EMBEDDED_CLIB
; If EMBEDDED_CLIB is not defined we are going to define it
        GBLL    EMBEDDED_CLIB
; If 'embedded' is defined EMBEDDED_CLIB defaults to {TRUE} else {FALSE}
    [ :DEF:embedded
EMBEDDED_CLIB   SETL    {TRUE}
    |
EMBEDDED_CLIB   SETL    {FALSE}
    ]
 ]

 [ :LNOT: :DEF: LDM_MAX
        GBLA    LDM_MAX
LDM_MAX SETA    16
 ]

 [ :LNOT: :DEF: make
        GBLS    make
make    SETS    "all"
 ]

 [ :LNOT: :DEF: FPIS
        GBLA    FPIS
FPIS    SETA    3
 ]

        GBLL    FPE2
FPE2    SETL    FPIS=2

        GBLS    VBar
        GBLS    UL
        GBLS    XXModuleName

VBar    SETS    "|"
UL      SETS    "_"


        MACRO
        Module  $name
XXModuleName SETS UL:CC:"$name":CC:UL
        MEND

        MACRO
$Label  Variable $Size
        LCLS    Temps
        LCLA    Tempa
 [ "$Size"=""
Tempa   SETA    1
 |
Tempa   SETA    $Size
 ]
Temps   SETS    VBar:CC:XXModuleName:CC:"$Label":CC:VBar
        KEEP    $Temps
        ALIGN
O_$Label *      .-StaticData
$Temps  %       &$Tempa*4
        MEND

        MACRO
$Label  ExportedVariable $Size
        LCLS    Temps
        LCLA    Tempa
 [ "$Size"=""
Tempa   SETA    1
 |
Tempa   SETA    $Size
 ]
Temps   SETS    VBar:CC:"$Label":CC:VBar
        EXPORT  $Temps
        ALIGN
O_$Label *      .-StaticData
$Temps  %       &$Tempa*4
        MEND

        MACRO
$Label  ExportedWord $Value
        LCLS    Temps
Temps   SETS    VBar:CC:"$Label":CC:VBar
        EXPORT  $Temps
        ALIGN
O_$Label *      .-StaticData
$Temps   &      $Value
        MEND

        MACRO
$Label  ExportedVariableByte $Size
        LCLS    Temps
        LCLA    Tempa
 [ "$Size"=""
Tempa   SETA    1
 |
Tempa   SETA    $Size
 ]
Temps   SETS    VBar:CC:"$Label":CC:VBar
        EXPORT  $Temps
O_$Label *      .-StaticData
$Temps  %       &$Tempa
        MEND

        MACRO
$Label  VariableByte $Size
        LCLS    Temps
        LCLA    Tempa
 [ "$Size"=""
Tempa   SETA    1
 |
Tempa   SETA    $Size
 ]
Temps   SETS    VBar:CC:XXModuleName:CC:"$Label":CC:VBar
        KEEP    $Temps
O_$Label *      .-StaticData
$Temps  %       &$Tempa
        MEND

        MACRO
$Label  InitByte $Value
$Label  =        $Value
        MEND

        MACRO
$Label  InitWord $Value
$Label  &        $Value
        MEND

        MACRO
$Label  Keep    $Arg
        LCLS    Temps
$Label  $Arg
Temps   SETS    VBar:CC:XXModuleName:CC:"$Label":CC:VBar
        KEEP    $Temps
$Temps
        MEND


        MACRO
        PopFrame  $Regs,$Caret,$CC,$Base
 [ {CONFIG} = 16
 ! 1, "MACRO PopFrame not implemented for 16 bit code"
 ]
        LCLS    BaseReg
 [ "$Base" = ""
BaseReg SETS    "fp"
 |
BaseReg SETS    "$Base"
 ]
        LCLA    count
        LCLS    s
        LCLS    ch
s       SETS    "$Regs"
count   SETA    1
        WHILE   s<>""
ch        SETS    s:LEFT:1
s         SETS    s:RIGHT:(:LEN:s-1)
          [ ch = ","
count       SETA    count+1
          |
            [ ch = "-"
              ! 1, "Can't handle register list including '-'"
            ]
          ]
        WEND
 [ LDM_MAX < count
        LCLA    r
        LCLS    subs
s       SETS    "$Regs"
subs    SETS    ""
r       SETA    0
        SUB     ip, $BaseReg, #4*&$count
        WHILE   s<>""
ch        SETS    s:LEFT:1
s         SETS    s:RIGHT:(:LEN:s-1)
          [ ch = ","
r           SETA    r+1
            [ r >= LDM_MAX
              LDM$CC.FD ip!,{$subs}
subs          SETS    ""
r             SETA    0
            |
subs          SETS    subs:CC:ch
            ]
          |
            [ ch = "-"
              ! 1, "Push can't handle register list including '-'"
            |
subs          SETS    subs:CC:ch
            ]
          ]
        WEND
        LDM$CC.FD   ip,{$subs}$Caret
 |
        LDM$CC.DB   $BaseReg, {$Regs}$Caret
 ]
        MEND

        MACRO
        Pop     $Regs,$Caret,$CC,$Base
 [ {CONFIG} = 16
  [ "$Caret" <> ""
  ! 1, "Cannot use writeback in 16 bit code"
  ]
  [ "$Base" <> ""
  ! 1, "Cannot specify a base register in 16 bit code"
  ]
 ]
        LCLS    BaseReg
 [ "$Base" = ""
BaseReg SETS    "sp"
 |
BaseReg SETS    "$Base"
 ]
 [ {CONFIG} = 16
  [ "$CC" <> "" :LAND: "$CC" <> "AL"
    BN$CC       %FT0
  ]
 ]
 [ LDM_MAX < 16
        LCLA    r
        LCLS    s
        LCLS    subs
        LCLS    ch
s       SETS    "$Regs"
subs    SETS    ""
r       SETA    0
        WHILE   s<>""
ch        SETS    s:LEFT:1
s         SETS    s:RIGHT:(:LEN:s-1)
          [ ch = ","
r           SETA    r+1
            [ r >= LDM_MAX
             [ {CONFIG} = 16
              POP       {$subs}
             |
              LDM$CC.FD   $BaseReg!,{$subs}
             ]
subs          SETS    ""
r             SETA    0
            |
subs          SETS    subs:CC:ch
            ]
          |
            [ ch = "-"
              ! 1, "Can't handle register list including '-'"
            |
subs          SETS    subs:CC:ch
            ]
          ]
        WEND
  [ {CONFIG} = 16
        POP         {$subs}
0
  |
        LDM$CC.FD   $BaseReg!,{$subs}$Caret
  ]
 |
  [ {CONFIG} = 16
        POP         {$Regs}
0
  |
        LDM$CC.FD   $BaseReg!, {$Regs}$Caret
  ]
 ]
        MEND

        MACRO
        Return  $UsesSb, $ReloadList, $Base, $CC
 [ {CONFIG} = 16
  [ "$UsesSb" <> ""
        !       1, "Cannot use SB in 16 bit code"
  ]
  [ "$Base" = "fpbased"
        !       1, "Cannot use fpbased in 16 bit code"
  ]
 ]
        LCLS    Temps
Temps   SETS    "$ReloadList"
 [ "$UsesSb" <> "" :LAND: make="shared-library"
   [ Temps = ""
Temps   SETS    "sb"
   |
Temps   SETS    Temps:CC:", sb"
   ]
 ]

 [ {CONFIG} = 26
   [ "$Base" = "LinkNotStacked" :LAND: "$ReloadList"=""
          MOV$CC.S pc, lr
   |
     [ Temps <> ""
Temps   SETS    Temps :CC: ","
     ]
     [ "$Base" = "fpbased"
       PopFrame "$Temps.fp,sp,pc",^,$CC
     |
       Pop      "$Temps.pc",^,$CC
     ]
   ]
 |
  [ {CONFIG} = 16
      [ "$CC" <> "" :LAND: "$CC" <> "AL"
        BN$CC   %FT0
      ]
   [ "$Base" = "LinkNotStacked" :LAND: "$ReloadList"=""
     [ INTERWORK
        BX      lr
     |
        MOV     pc, lr
     ]
   |
     [ Temps <> ""
Temps   SETS    Temps :CC: ","
     ]
     [ INTERWORK
       BX       pc
       CODE32
       Pop      "$Temps.lr",,
       BX       lr
       CODE16
     |
       Pop      "$Temps.pc",,
     ]
   ]
0
  |
   [ "$Base" = "LinkNotStacked" :LAND: "$ReloadList"=""
    [ INTERWORK :LOR: THUMB
        BX$CC lr
    |
        MOV$CC pc, lr
    ]
   |
     [ Temps <> ""
Temps   SETS    Temps :CC: ","
     ]
    [ INTERWORK :LOR: THUMB
     [ "$Base" = "fpbased"
       PopFrame "$Temps.fp,sp,lr",,$CC
     |
       Pop      "$Temps.lr",,$CC
     ]
     BX$CC lr
    |
     [ "$Base" = "fpbased"
       PopFrame "$Temps.fp,sp,pc",,$CC
     |
       Pop      "$Temps.pc",,$CC
     ]
    ]
   ]
  ]
 ]
        MEND

        MACRO
        PushA   $Regs,$Base
 [ {CONFIG} = 16
        !       1, "MACRO PushA not implemented for 16 bit code"
 ]
        ; Push registers on an empty ascending stack, with stack pointer $Base
        ; (no default for $Base, won't be sp)
 [ LDM_MAX < 16
        LCLA    r
        LCLS    s
        LCLS    subs
        LCLS    ch
s       SETS    "$Regs"
subs    SETS    ""
r       SETA    0
        WHILE   s<>""
ch        SETS    s:LEFT:1
s         SETS    s:RIGHT:(:LEN:s-1)
          [ ch = ","
r           SETA    r+1
            [ r >= LDM_MAX
              STMIA   $Base!,{$subs}
subs          SETS    ""
r             SETA    0
            |
subs          SETS    subs:CC:ch
            ]
          |
            [ ch = "-"
              ! 1, "Can't handle register list including '-'"
            |
subs          SETS    subs:CC:ch
            ]
          ]
        WEND
        STMIA   $Base!,{$subs}
 |
        STMIA   $Base!, {$Regs}
 ]
        MEND

        MACRO
        PopA    $Regs,$Base
  [ {CONFIG} = 16
        !       1, "MACRO PopA not implemented for 16 bit code"
  ]
        ; Pop registers from an empty ascending stack, with stack pointer $Base
        ; (no default for $Base, won't be sp)
 [ LDM_MAX < 16
        LCLA    n
        LCLA    r
        LCLS    s
        LCLS    subs
        LCLS    ch
s       SETS    "$Regs"
n       SETA    :LEN:s
subs    SETS    ""
r       SETA    0
        WHILE   n<>0
n         SETA    n-1
ch        SETS    s:RIGHT:1
s         SETS    s:LEFT:n
          [ ch = ","
r           SETA    r+1
            [ r >= LDM_MAX
              LDMDB   $Base!,{$subs}
subs          SETS    ""
r             SETA    0
            |
subs          SETS    ch:CC:subs
            ]
          |
            [ ch = "-"
              ! 1, "Can't handle register list including '-'"
            |
subs          SETS    ch:CC:subs
            ]
          ]
        WEND
        LDMDB   $Base!,{$subs}
 |
        LDMDB   $Base!, {$Regs}
 ]
        MEND

⌨️ 快捷键说明

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