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

📄 objmacs.s

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 S
📖 第 1 页 / 共 2 页
字号:
        MACRO
        Push    $Regs, $Base
        LCLS    BaseReg
 [ "$Base" = ""
BaseReg SETS    "sp"
 |
BaseReg SETS    "$Base"
 ]
 [ 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
             [ {CONFIG} = 16
              PUSH    {$subs}
             |
              STMFD   $BaseReg!,{$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
  [ {CONFIG} = 16
        PUSH    {$subs}
  |
        STMFD   $BaseReg!,{$subs}
  ]
 |
  [ {CONFIG} = 16
        PUSH    {$Regs}
  |
        STMFD   $BaseReg!, {$Regs}
  ]
 ]
        MEND

        MACRO
        FunctionEntry $UsesSb, $SaveList, $MakeFrame
  [ {CONFIG} = 16
    [ "$UsesSb" <> ""
        !       1, "Cannot use SB in 16 bit code"
    ]
    [ "$MakeFrame" <> ""
        !       1, "Cannot make frame in 16 bit code"
    ]
  ]
        LCLS    Temps
        LCLS    TempsC
Temps   SETS    "$SaveList"
TempsC  SETS    ""
 [ Temps <> ""
TempsC SETS Temps :CC: ","
 ]

 [ "$UsesSb" <> "" :LAND: make="shared-library"
   [ "$MakeFrame" = ""
        MOV     ip, sb  ; intra-link-unit entry
        Push    "$TempsC.sb,lr"
        MOV     sb, ip
   |
        MOV     ip, sb  ; intra-link-unit entry
        Push    "sp,lr,pc"
        ADD     lr, sp, #8
        Push    "$TempsC.sb,fp"
        MOV     fp, lr
        MOV     sb, ip
   ]
 |
   [ "$MakeFrame" = ""
        Push    "$TempsC.lr"
   |
        MOV     ip, sp
        Push    "$TempsC.fp,ip,lr,pc"
        SUB     fp, ip, #4
   ]
 ]
        MEND


        GBLA    V_N

        [ INTERWORK :LOR: THUMB

        MACRO
$label  VEnter_16               ; Like VEnter, but declare __16$label as the
        CODE16                  ; THUMB entry point
__16$label
        BX      pc
        CODE32
$label  STMFD   r13!,veneer_s   ; ARM is the declared entry point
        MEND

        MACRO
$label  VEnter                  ; Declare the THUMB entry point as the main
        CODE16                  ; entry point
$label  BX      pc
        CODE32
__32$label                      ; Declare a __32$label entry point for ARM
        STMFD   r13!,veneer_s
        MEND

        MACRO
$label  VReturn $cc
$label  LDM$cc.FD r13!,veneer_s
        BX$cc   lr
        MEND

        MACRO
$label  VPull $cc
$label  LDM$cc.FD r13!,veneer_s
        MEND

        MACRO
$label  ReturnToLR $cc
$label  BX$cc   lr
        MEND

        MACRO
$label  ReturnToLR_flg $cc
$label  BX$cc   lr
        MEND

        MACRO
$label  ReturnToStack $cc
$label  LDM$cc.FD sp!,{lr}
        BX$cc   lr
        MEND

        MACRO
$label  PullFromStack $cc
$label  LDM$cc.FD sp!,{lr}
        MEND

        MACRO
$label  EnterWithLR_16
        [ "$label" <> ""
        EXPORT __16$label
        EXPORT $label
        ]
        CODE16
__16$label
        BX      pc
        CODE32
$label
        MEND


        MACRO
$label  EnterWithLR_Thumb
        [ "$label" <> ""
        EXPORT __16$label
        ]
        [ INTERWORK     ; must create ARM interworking veneer
        CODE32
        EXPORT $label
$label
        ADR ip, __16$label + 1
        BX ip
        ]
        CODE16
__16$label
        MEND

        MACRO
$label  EnterWithStack_16
        [ "$label" <> ""
        EXPORT __16$label
        EXPORT $label
        ]

        CODE16
__16$label
        BX      pc
        CODE32
$label  STMFD   sp!,{lr}
        MEND

        MACRO
$label  EnterWithLR
        [ "$label" <> ""
        EXPORT __32$label
        EXPORT $label
        ]
        CODE16
$label  BX      pc
        CODE32
__32$label
        MEND

        MACRO
$label  EnterWithStack
        [ "$label" <> ""
        EXPORT __32$label
        EXPORT $label
        ]
        CODE16
$label  BX      pc
        CODE32
__32$label
        STMFD   sp!,{lr}
        MEND
        
        MACRO
        Export $name
        EXPORT  $name
        EXPORT  __16$name
        MEND

        MACRO
        Export_32 $name
        EXPORT  __32$name
        EXPORT  $name
        MEND

        MACRO
        Import_32 $name
        IMPORT __32$name
        MEND

        MACRO
$label  B_32 $name
$label  B       __32$name
        MEND

        |

;ARM 32 and 26-bit mode

        MACRO
$label  VEnter_16
$label  STMFD   r13!,veneer_s
        MEND

        MACRO
$label  VEnter
$label  STMFD   r13!,veneer_s
        MEND

        MACRO
$label  VReturn $cc
$label  [ INTERWORK
        LDM$cc.FD r13!,veneer_s
        BX$cc   lr
        |
        [ {CONFIG} = 32 
        LDM$cc.FD r13!,veneer_l
        ]
        [ {CONFIG} = 26
        LDM$cc.FD r13!,veneer_l^
        ]
        ]
        MEND    

        MACRO
$label  VPull $cc
$label  LDM$cc.FD r13!,veneer_s
        MEND

        MACRO
$label  ReturnToLR $cc
$label  [ INTERWORK
        BX$cc   lr
        |
        [ {CONFIG} = 32
        MOV$cc  pc,lr
        ]
        [ {CONFIG} = 26
        MOV$cc.S pc,lr
        ]
        ]
        MEND

        MACRO
$label  ReturnToLR_flg $cc
$label  [ INTERWORK
        BX$cc   lr
        |
        MOV$cc  pc,lr
        ]
        MEND

        MACRO
$label  ReturnToStack $cc
$label  [ INTERWORK
        LDM$cc.FD sp!,{lr}
        BX$cc    lr
        |
        [ {CONFIG} = 32
        LDM$cc.FD sp!,{pc}
        ]
        [ {CONFIG} = 26
        LDM$cc.FD sp!,{pc}^
        ]
        ]
        MEND

        MACRO
$label  PullFromStack $cc
$label  LDM$cc.FD sp!,{lr}
        MEND

        MACRO
$label  EnterWithLR_16
        EXPORT $label
$label
        MEND

        MACRO
$label  EnterWithStack_16
        EXPORT $label
$label  STMFD   sp!,{lr}
        MEND

        MACRO
$label  EnterWithLR
        EXPORT $label
$label
        MEND

        MACRO
$label  EnterWithStack
        EXPORT $label
$label  STMFD   sp!,{lr}
        MEND

        MACRO
        Export $name
        EXPORT  $name
        MEND

        MACRO
        Export_32 $name
        EXPORT  $name
        MEND

        MACRO
        Import_32 $name
        IMPORT $name
        MEND

        MACRO
$label  B_32 $name
$label  B       $name
        MEND

        ]



        MACRO
        DataArea
        AREA    |C$$data|, DATA
        MEND

 [ make <> "shared-library"

        MACRO
        CodeArea $name
    [ INTERWORK
        AREA    |C$$code|, CODE, READONLY, INTERWORK
    |
        AREA    |C$$code|, CODE, READONLY
    ]
        MEND

        MACRO
        LoadStaticAddress $Addr, $Reg, $Ignore
        LDR     $Reg, =$Addr
        MEND

        MACRO
        LoadStaticBase $Reg, $Ignore
        LoadStaticAddress StaticData, $Reg, $Ignore
        MEND

        MACRO
        AdconTable
        MEND

        MACRO
        Function $name, $type   ; should be ARMFunction...
        LCLS    Temps
Temps   SETS    VBar:CC:"$name":CC:VBar
        EXPORT  $Temps      ; oops, forgot to check $type...
  [ THUMB :LAND: {CONFIG} <> 16
        CODE16
$Temps
        BX      pc
        CODE32
; If we are *NOT* building an interworking library we must set bit 0 of lr
; as the caller will not have done it for us.
    [ :LNOT:INTERWORK
        ORR     lr, lr, #1
    ]
  |
$Temps
  ]
        MEND

 |

        MACRO
        CodeArea $name
        AREA    |C$$code|, CODE, READONLY, REENTRANT, PIC
        MEND

        MACRO
        AdconTable
        AREA    |sb$$adcons|, DATA, READONLY, BASED sb
        MEND

        MACRO
        Function $name, $type
        LCLS    Temps
Temps   SETS    VBar:CC:"$name":CC:VBar
 [ "$type" = ""
        EXPORT  $Temps
 |
        EXPORT  $Temps[$type]
 ]
$Temps
        MEND

 ]


        MACRO
        CODE_32
        [ {CONFIG} = 16
        CODE32
        ]
        MEND

        MACRO
        CODE_16
        [ {CONFIG} <> 16
        CODE16
        ]
        MEND

        END

⌨️ 快捷键说明

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