id: 9
title: Loops
subtitle: The power of repetition
description: Use branches to build a loop

tutorial:
  - title: What is a loop?
    text: >
      A loop runs the same code **over and over**. In assembly, a loop is just
      **branching back to a label**!
  - title: Loop structure
    text: >
      ① initialize ② do work ③ update the counter ④ test + branch back:
    code: |
      MOV R4, #0        ; ① initialize
      loop:              ; loop start
        ADD R4, R4, #1  ; ②③ counter += 1
        CMP R4, #5      ; ④ reached 5?
        BLE loop         ; not yet, jump back
      XHLT
  - title: Watch out!
    text: >
      Forget to update the counter and you've made an **infinite loop**
      (don't worry — execution stops automatically after 10000 steps).

goal: Compute **1+2+3+...+10** into **R0** (the answer is 55)

initialState: {}

testCases:
  - init: {}
    expected:
      registers:
        R0: 55

hints:
  - "R0 accumulates the sum, R4 is the counter (1 to 10)"
  - "Loop body: ADD R0, R0, R4 / ADD R4, R4, #1 / CMP R4, #10 / BLE loop"
  - "Full: MOV R0, #0 / MOV R4, #1 / loop: ADD R0, R0, R4 / ADD R4, R4, #1 / CMP R4, #10 / BLE loop / XHLT"

starThresholds: [7, 9, 12]

starterCode: |
  ; Compute 1+2+3+...+10
  ; Result goes in R0
  ;
  ; Tip: use a register as the counter


  XHLT

showMemory: false
