From b9a752f17e9b2d8567495058dbbc6d8d99f5d10e Mon Sep 17 00:00:00 2001 From: Alexander Rosenberg Date: Thu, 6 Oct 2022 23:55:27 -0700 Subject: [PATCH] Handle some edge cases with 0 --- bmi-calc/main.nasm | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/bmi-calc/main.nasm b/bmi-calc/main.nasm index 640aaf8..9136dc9 100644 --- a/bmi-calc/main.nasm +++ b/bmi-calc/main.nasm @@ -83,6 +83,9 @@ good_height: mov rdx,height_notice_post_length syscall + cmp r14,0 + je print_zero_bmi + ; calculate bmi (kg/(m^2)) movq xmm1,r14 ; height divss xmm1,[_100f] ; cm to m @@ -110,11 +113,32 @@ good_height: call clear_stdin - ; exit +exit: xor rdi,rdi mov rax,SYS_exit syscall +print_zero_bmi: + mov rax,SYS_write + mov rdi,FD_stdout + mov rsi,bmi_notice_text + mov rdx,bmi_notice_length + syscall + + mov rax,SYS_write + mov rdi,FD_stdout + mov rsi,zero_float_text + mov rdx,zero_float_length + syscall + + mov rax,SYS_write + mov rdi,FD_stdout + mov rsi,newline_char + mov rdx,1 + syscall + + jmp exit + clear_stdin: ; 16 - read buff ; 4 - pollfd.fd @@ -146,6 +170,10 @@ clear_stdin_end: ret print_float: ; void print_float(float f, int percission) + movq rax,xmm0 + cmp rax,0 + je print_float_zero + sub rsp,24 movss xmm1,[_10f] mov rcx,rdi @@ -202,6 +230,13 @@ print_float_reverse_loop: add rsp,24 ret +print_float_zero: + mov rax,SYS_write + mov rdi,FD_stdout + mov rsi,zero_float_text + mov rdx,zero_float_length + syscall + ret ; on error, return 0 in rax. otherwise, return 1 in rax ; and the result in xmm0 @@ -361,6 +396,8 @@ size_error_text: db "Number too long!",0xA size_error_length: equ $ - size_error_text period_char: db "." newline_char: db 0xA +zero_float_text: db ".000" +zero_float_length: equ $ - zero_float_text _10f: dd 10.0 _0.1f: dd 0.1 _100f: dd 100.0