Post

6. Thumb Mode & Thumb-2

6. Thumb Mode & Thumb-2

ARM processors support multiple instruction sets, including the ARM instruction set (a fixed 32-bit instruction set) and Thumb instruction sets (which primarily use 16-bit instructions but can also include 32-bit instructions in Thumb-2). The Thumb instruction sets provide a more compact representation of ARM instructions, improving code density while maintaining performance.

Thumb Mode: 16-bit vs. 32-bit Instructions

Thumb mode was introduced to reduce the memory footprint of applications by using 16-bit instructions instead of the traditional 32-bit ARM instructions. Thumb mode provides a subset of ARM instructions but offers increased efficiency, especially in memory-constrained environments (e.g., embedded systems and mobile devices).

FeatureARM Mode (A32)Thumb Mode (T16)Thumb-2 (T32)
Instruction Size32-bit16-bitMixed 16-bit & 32-bit
Code DensityLowerHigher (Better for memory-limited systems)Higher
Instruction SetFull ARM instruction setLimited subset of ARMAlmost full ARM instruction set
PerformanceHighGenerally lower but efficientHigh
Use CasePerformance-critical applicationsCode size reductionBalance of performance and size

Switching Between ARM and Thumb Mode (BX, BLX)

Since ARM and Thumb use different instruction encodings, special instructions (BX and BLX) are used to switch between them dynamically.

1. BX (Branch and Exchange) Instruction

  • Used to switch between ARM and Thumb states.
  • If the least significant bit (LSB) of the target address is 1, execution switches to Thumb mode.
  • If the LSB is 0, execution remains in ARM mode.

Example: Switching to Thumb Mode

1
2
MOV R0, #1      // Load value 1 into R0
BX  R0          // Switch to Thumb mode (because LSB is 1)
  • Similar to BX but also stores the return address (used for function calls).
  • Allows calling a function written in a different mode (ARM ↔ Thumb).

Example: Calling a Thumb Function from ARM

1
BLX Function_Thumb    // Branch to Thumb function and switch mode

Thumb-2 Extensions (T32 Instruction Set)

Thumb-2 was introduced in ARMv6T2 and later architectures to bridge the gap between ARM and Thumb. It extends the 16-bit Thumb instruction set by allowing a mix of 16-bit and 32-bit instructions, making it more powerful while still maintaining high code density.

Key Features of Thumb-2

  • Uses both 16-bit and 32-bit instructions for better performance.
  • Expands the available instruction set, making it almost equivalent to full ARM.
  • Maintains backward compatibility with Thumb (T16).

Example of Thumb-2 Code

1
2
MOVS R0, #5     // 16-bit instruction
ADD  R1, R0, R2 // 32-bit instruction in Thumb-2

Example: Mixing ARM and Thumb Code

ARM Code

1
2
3
4
.global main
main:
    BLX thumb_function  ; Call a Thumb function
    B   main            ; Loop

Thumb Code

1
2
3
4
5
6
.thumb
.thumb_func
.global thumb_function
thumb_function:
    MOV R0, #42
    BX  LR              ; Return to ARM mode
This post is licensed under CC BY 4.0 by the author.