From 33175e2c193dbead54eab9ab4afa355956d9491f Mon Sep 17 00:00:00 2001 From: Kris Lamoureux Date: Tue, 7 Oct 2025 22:18:26 -0400 Subject: [PATCH] Subroutines --- helloworld.asm | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/helloworld.asm b/helloworld.asm index 63087e8..67c8edd 100644 --- a/helloworld.asm +++ b/helloworld.asm @@ -10,8 +10,22 @@ 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) + mov eax, msg + call strlen + + mov edx, eax ; our function leaves the result in EAX + mov ecx, msg + mov ebx, 1 ; STDOUT + mov eax, 4 ; SYS_WRITE + int 80h + + mov ebx, 0 ; return 0 + mov eax, 1 ; SYS_EXIT + int 80h + +strlen: + push ebx ; preserve EBX while we use in this function + mov ebx, eax ; move the address in EAX into EBX nextchar: cmp byte [eax], 0 ; compare the byte pointed to by EAX at this address against zero (Zero is an end of string delimiter) @@ -20,17 +34,6 @@ nextchar: 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 ; move the memory address of our message string into ecx - mov ebx, 1 ; write to the STDOUT file - mov eax, 4 ; invoke SYS_WRITE (kernel opcode 4) - int 80h - mov ebx, 0 ; return 0 - mov eax, 1 ; SYS_EXIT - int 80h + sub eax, ebx + pop ebx + ret