UNINITIALIZED DATA
BSS Section
In x86 assembly, sometimes I need to reserve memory for potential data storage without initializing it to specific values. This is where the BSS section comes into play.
section .bss
    num resb 3      ; Reserves three bytes of memory for 'num'
section .text
    global _start
_start:
    mov bl, 1       ; Move the value 1 into bl
    mov [num], bl   ; Move the value in bl into the memory space reserved for 'num'
    mov [num+1], bl ; Move the value in bl into the next byte of 'num'
    mov [num+2], bl ; Move the value in bl into the second next byte of 'num'
                    ; Exiting the program
    mov eax, 1      ; Move 1 to eax
    int 80h         ; Interrupt
In x86 assembly, sizes are not inherently understood, so I need to provide context for data manipulation. Thatβs why I first move the value 1 into the bl register and then transfer it into the memory space reserved for num. To access a specific byte of num, I can utilize expressions like [num+1] or [num+2] to reference the subsequent bytes in memory.
Initializing Data (alternative)
Alternatively, I can initialize data with default values using the section .data. Instead of manually reserving and setting values, I can use the dup instruction to initialize memory with the specified value.
section .data
    num2 db 3 dup (2) ; Initializes 'num2' with three instances of the value 2
section .text
    global _start
_start:
    mov bl, 1       ; Move the value 1 into bl
    mov [num2], bl  ; Move the value in bl into the memory space reserved for 'num2'
    mov [num], bl   ; Move the value in bl into the memory space reserved for 'num'
    mov [num+1], bl ; Move the value in bl into the next byte of 'num'
    mov [num+2], bl ; Move the value in bl into the second next byte of 'num'
                    ; Exiting the program
    mov eax, 1      ; Move 1 to eax
    int 80h         ; Interrupt