In this program I was required to calculate the Harmonic Average using an assembly program with a C driver.

Harmonic mean is defined as:

$$ \frac{n}{\dfrac{1}{x_1} + \dfrac{1}{x_2} + \cdots + \dfrac{1}{x_n}}$$

where \$n = \$ number of inputs and \$x_i = \$ a real number.

I would like to know if:

 - My code follows common practices.
 - My code is formatted correctly.
 - If comments need to be improved.
 - My code is straightforward; that is, I have achieved the goal with the least amount of work.
 - There any improvements I should make in my code.

Attached below is my program in Assembly: 

    ;Assembly function that computs the harmonic mean
    ;of an array of 64-bit floating-point numbers.
    ;Retrieves input using a C program.
    ;
    ;Harmonic mean is defined as Sum(n/((1/x1) + (1/x2) + ... + (1/xn)))
    ;
    ;	expects:
    ;		RDI - address of array
    ;		RSI - length of the array
    ;	returns
    ;		XMMO - the harmonic average of array's values
    
    global harmonicMean
    
    section .data
    	Zero dd 0.0
    	One dd 1.0
    
    section .text
    	harmonicMean:
    		push rbp
    		mov rbp, rsp			  ;C prologue
    	
    		movss xmm10, [Zero]		  ;Holds tally of denominator
    		cvtsi2ss xmm0, rsi		  ;Take length and put it into xmm0 register
    	
    		.whileLoop:
    			cmp rsi, 0			  ;Is the length of array 0?
    			je .endwhile
    			call addDen			  ;Compute a denominator value and add it to sum
    			add rdi, 4			  ;Add size of float to address
    			dec rsi				  ;Decrease the length
    			jmp .whileLoop
    		.endwhile:
    		
    		divss xmm0, xmm10
    		
    		leave
    		ret
    		
    	
    	;Calculates a number in the denominator
    	addDen:
    		push rdi
    		movss xmm8, [One]
    		movss xmm9, [rdi]
    		divss xmm8, xmm9
    		addss xmm10, xmm8
    		pop rdi
    		ret