summaryrefslogtreecommitdiff
path: root/PGU/CHAP9/count-chars.s
diff options
context:
space:
mode:
authorCarlos Maiolino <[email protected]>2025-07-10 22:55:07 +0200
committerCarlos Maiolino <[email protected]>2025-07-10 22:56:55 +0200
commitd98f46ce647846b0aa30b2e16a30fd4e152a1bf5 (patch)
tree267474fcc77cf20b428f6f4c7f768ca09f4cfe0e /PGU/CHAP9/count-chars.s
parent869e68986aa8f69af6e7842260a68d1e5c6f796f (diff)
Add new code
Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'PGU/CHAP9/count-chars.s')
-rw-r--r--PGU/CHAP9/count-chars.s47
1 files changed, 47 insertions, 0 deletions
diff --git a/PGU/CHAP9/count-chars.s b/PGU/CHAP9/count-chars.s
new file mode 100644
index 0000000..7e12791
--- /dev/null
+++ b/PGU/CHAP9/count-chars.s
@@ -0,0 +1,47 @@
+# Count the characters in a string (until a null byte is reached)
+# It's supposed to behave similarly with strlen()
+#
+# Returns the count in %rax
+#
+# - %rcx: Char count
+# - %rdx: current Char address
+# - %al: current char
+#
+
+.type count_chars, @function
+.globl count_chars
+
+# We receive the string addr in the stack.
+# Remember %rsp + 8 contains the return value
+.equ ST_STRING_ADDRESS, 16
+
+count_chars:
+ pushq %rbp
+ movq %rsp, %rbp
+
+ #initialize counter
+ movq $0, %rcx
+
+ # Start address of string:
+ movq ST_STRING_ADDRESS(%rbp), %rdx
+
+count_loop_begin:
+
+ # Grab char
+ movb (%rdx), %al
+
+ cmpb $0, %al
+ je count_loop_end
+
+ # We are not done yet...
+ incq %rcx
+ incq %rdx
+ jmp count_loop_begin
+
+count_loop_end:
+
+ movq %rcx, %rax
+
+ movq %rbp, %rsp
+ popq %rbp
+ ret