|
CS456 - Systems Programming
Spring 2023
|
Displaying ./code/nasm32bit/helloworld-len.asm
; Hello World Program (Subroutines)
; 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 with: ./helloworld-len
SECTION .data
msg db 'Hello, brave new world!', 0Ah
SECTION .text
global _start
_start:
mov eax, msg ; move the address of our message string into EAX
call strlen ; call our function to calculate the length of the string
mov edx, eax ; our function leaves the result in EAX
mov ecx, msg ; this is all the same as before
mov ebx, 1
mov eax, 4
int 80h
mov ebx, 0
mov eax, 1
int 80h
strlen: ; this is our first function declaration
push ebx ; push the value in EBX onto the stack to preserve it while we use EBX in this function
mov ebx, eax ; move the address in EAX into EBX (Both 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
pop ebx ; pop the value on the stack back into EBX
ret ; return to where the function was called
|