📄 objmacs.s
字号:
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 + -