Switch in Assembly Language

Our first program demonstrates the use of switch statements for various types of conditional logic. Here’s the full source code.

section .data
    msg_write db "Write ", 0
    msg_one db "one", 0
    msg_two db "two", 0
    msg_three db "three", 0
    msg_weekend db "It's the weekend", 0
    msg_weekday db "It's a weekday", 0
    msg_before_noon db "It's before noon", 0
    msg_after_noon db "It's after noon", 0
    msg_bool db "I'm a bool", 0
    msg_int db "I'm an int", 0
    msg_unknown db "Don't know type %T", 0
    format db "%s", 0

section .bss
    res resb 10

section .text
    global _start

_start:
    ; Here’s a basic switch.
    mov eax, 2
    mov ebx, msg_write
    call print_string
    call print_num
    mov ebx, format
    call print_string

    cmp eax, 1
    je case_one
    cmp eax, 2
    je case_two
    cmp eax, 3
    je case_three

    jmp end_switch

case_one:
    mov ebx, msg_one
    call print_string
    jmp end_switch

case_two:
    mov ebx, msg_two
    call print_string
    jmp end_switch

case_three:
    mov ebx, msg_three
    call print_string
    jmp end_switch

end_switch:

    ; Using commas to separate multiple expressions in the same case statement
    ; Optional default case as well.
    ; Rotate day_flag register to simulate weekdays and weekends
    ; (we pretend it's a simple hardware timer feature)
    ; 0 = Monday, 6 = Sunday
    mov cl, 5  ; Simulate Friday
    cmp cl, 5
    je case_weekend
    cmp cl, 6
    je case_weekend

    mov ebx, msg_weekday
    call print_string
    jmp end_time_check

case_weekend:
    mov ebx, msg_weekend
    call print_string

end_time_check:

    ; Switch without an expression for if/else logic
    ; Non-constant case expressions.
    mov ecx, 14  ; Simulate hour of the day (14:00)
    cmp ecx, 12
    jl case_before_noon

    mov ebx, msg_after_noon
    call print_string
    jmp end_time_of_day

case_before_noon:
    mov ebx, msg_before_noon
    call print_string

end_time_of_day:

    ; Type switch to discover type of an interface value.
    ; This is exemplary as Assembly doesn't directly support types
    ; but we'll simulate type checking concept.
    mov eax, 1  ; Simulate an integer type

    cmp eax, 1
    je case_int
    cmp eax, 0
    je case_bool

    mov ebx, msg_unknown
    call print_string ; Print "Don't know type %T\n"

case_bool:
    mov ebx, msg_bool
    call print_string

case_int:
    mov ebx, msg_int
    call print_string

    ; Exit program
    mov eax, 60  ; syscall: exit
    xor edi, edi ; exit code 0
    syscall

print_num:
    ; Print number in eax (as ASCII string)
    add eax, '0'
    mov [res], al
    mov rsi, res
    call print_string
    ret

print_string:
    ; syscall: write(int fd, const void *buf, size_t count)
    mov eax, 1
    mov edi, 1
    syscall
    ret

To run this assembly program, follow these steps:

  1. Assemble the program using nasm.
$ nasm -f elf64 switch_example.asm -o switch_example.o
  1. Link the assembled object file.
$ ld switch_example.o -o switch_example
  1. Run the executable.
$ ./switch_example
Write 2 as two
It's a weekday
It's after noon
I'm a bool
I'm an int
Don't know type %T

Now that we can run and build basic assembly programs demonstrating conditionals with switch-like logic, let’s learn more about the language’s capabilities.