Go to main content

School of Computer Science Intranet

APT research areas

Discover our main research areas

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