
Angel code examples
The following ARM code is the Angel equivalent of the "Hello World" program on page 69 in the book. Note that, although the WriteC macro is defined, it isn't used in the code as it is more efficient to retain the conditional SWI.
AREA HelloW,CODE,READONLY
SWI_ANGEL EQU 0x123456 ;SWI number for Angel semihosting
MACRO
$l Exit ;Angel SWI call to terminate execution
$l MOV r0, #0x18 ;Angel SWIreason_ReportException(0x18)
LDR r1, =0x20026 ;report ADP_Stopped_ApplicationExit
SWI SWI_ANGEL ;ARM semihosting SWI
MEND
MACRO
$l WriteC ;Angel SWI call to output char in [r1]
$l MOV r0, #0x3 ;select Angel SYS_WRITEC function
SWI SWI_ANGEL
MEND
ENTRY ;code entry point
ADR r1, TEXT-1 ;r1->"Hello World"
MOV r0, #0x3 ;select Angel SYS_WRITEC
LOOP LDRB r2, [r1,#1]! ;get next byte
CMP r2, #0 ;check for text end
SWINE SWI_ANGEL ;if not end print...
BNE LOOP ;..and loop back
Exit ;end of execution
ALIGN ;to ensure ADR works
TEXT DATA
= "Hello World",&a,&d,0
END ;end of program source
The following ARM code is the Angel equivalent of the Thumb "Hello World" program on pages 204-5 in the book. Again, not all of the defined macros are used in the code example. "Exit" is the ARM exit macro, "TExit" is the Thumb equivalent, and so on.
AREA HelloWT,CODE,READONLY
SWI_ANGEL EQU 0x123456 ;SWI number for Angel semihosting (ARM)
SWI_TANGEL EQU 0xAB ;SWI number for Angel semihosting (Thumb)
MACRO
$l Exit ;Angel SWI call to terminate execution
$l MOV r0, #0x18 ;Angel SWIreason_ReportException(0x18)
LDR r1, =0x20026 ;report ADP_Stopped_ApplicationExit
SWI SWI_ANGEL ;ARM semihosting SWI
MEND
MACRO
$l TExit ;Angel SWI call to terminate execution
$l MOV r0, #0x18 ;Angel SWIreason_ReportException(0x18)
LDR r1, =0x20026 ;report ADP_Stopped_ApplicationExit
SWI SWI_TANGEL ;THUMB semihosting SWI
MEND
MACRO
$l WriteC ;Angel SWI call to output char in [r1]
$l MOV r0, #0x3 ;select Angel SYS_WRITEC function
SWI SWI_ANGEL ;ARM semihosting SWI
MEND
MACRO
$l TWriteC ;Angel SWI call to output char in [r1]
$l MOV r0, #0x3 ;select Angel SYS_WRITEC function
SWI SWI_TANGEL ;THUMB semihosting SWI
MEND
ENTRY ;code entry point
CODE32 ;enter in ARM state
ADR r0, START+1 ;get Thumb entry address
BX r0 ;enter Thumb area
CODE16
START ADR r1, TEXT ;r1->"Hello World"
MOV r0, #0x3 ;select Angel SYS_WRITEC
LOOP LDRB r2, [r1] ;get next byte
CMP r2, #0 ;check for text end
BEQ DONE ;finished? **T
SWI SWI_TANGEL ;if not end print...
ADD r1, r1, #1 ;increment pointer **T
B LOOP ;..and loop back
DONE TExit ;end of execution
ALIGN ;to ensure ADR works
TEXT DATA
= "Hello World",&a,&d,0
END ;end of program source