; Hello World Program (Calculating string length)
; Compile with: nasm -f elf helloworld-len.asm
; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld-len.o -o helloworld-len
; Run: ./helloworld-len
 
SECTION .data
msg     db      'Hello, solab2 world!', 0Ah ; we can modify this now without having to update anywhere else in the program
 
SECTION .text
global  _start
 
_start:
 
    mov     ebx, msg       ; move the address of our message string into EBX
    mov     eax, ebx       ; move the address in EBX into EAX as well (Both now point to the same segment in memory)
 
nextchar:
    cmp     byte [eax], 0  ; compare the byte pointed to by EAX at this address against zero (Zero is an end of string delimiter)
    jz      finished       ; jump (if the zero flagged has been set) to the point in the code labeled 'finished'
    inc     eax            ; increment the address in EAX by one byte (if the zero flagged has NOT been set)
    jmp     nextchar       ; jump to the point in the code labeled 'nextchar'
 
finished:
    sub     eax, ebx       ; subtract the address in EBX from the address in EAX
                            ; remember both registers started pointing to the same address (see line 15)
                            ; but EAX has been incremented one byte for each character in the message string
                            ; when you subtract one memory address from another of the same type
                            ; the result is number of segments between them - in this case the number of bytes
 
    mov     edx, eax       ; EAX now equals the number of bytes in our string
    mov     ecx, msg       ; the rest of the code should be familiar now
    mov     ebx, 1
    mov     eax, 4
    int     80h
 
    mov     ebx, 0
    mov     eax, 1
    int     80h
