summaryrefslogtreecommitdiff
path: root/PGU/CHAP6_7/count-chars.s
blob: 7e12791c4a445772700f1d1cac965acbfc5d0cd1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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