4 an example thumb assembly language module – ARM VERSION 1.2 User Manual

Page 30

Advertising
background image

Writing ARM and Thumb Assembly Language

2-18

Copyright © 2000, 2001 ARM Limited. All rights reserved.

ARM DUI 0068B

2.3.4

An example Thumb assembly language module

Example 2-3 illustrates some of the core constituents of a Thumb assembly language
module. It is based on

subrout.s

. It is supplied as

thumbsub.s

in the

examples\asm

subdirectory of the ADS. Refer to Code examples on page 2-2 for instructions on how
to assemble, link, and execute the example.

Example 2-3

AREA ThumbSub, CODE, READONLY ; Name this block of code
ENTRY ; Mark first instruction to execute
CODE32 ; Subsequent instructions are ARM
header ADR r0, start + 1 ; Processor starts in ARM state,
BX r0 ; so small ARM code header used
; to call Thumb main program
CODE16 ; Subsequent instructions are Thumb
start
MOV r0, #10 ; Set up parameters
MOV r1, #3
BL doadd ; Call subroutine
stop
MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SWI 0xAB ; Thumb semihosting SWI
doadd
ADD r0, r0, r1 ; Subroutine code
MOV pc, lr ; Return from subroutine
END ; Mark end of file

CODE32 and CODE16 directives

These directives instruct the assembler to assemble subsequent instructions as ARM
(

CODE32

) or Thumb (

CODE16

) instructions. They do not assemble to an instruction to

change the processor state at runtime. They only change the assembler state.

The ARM assembler,

armasm

, starts in ARM mode by default. You can use the

-16

option

in the command line if you want it to start in Thumb mode.

BX instruction

This instruction is a branch that can change processor state at runtime. The least
significant bit of the target address specifies whether it is an ARM instruction (clear) or
a Thumb instruction (set). In this example, this bit is set in the

ADR

pseudo-instruction.

Advertising