From a89bc395b2f1be2190441d0a303cc685f5e09fea Mon Sep 17 00:00:00 2001 From: Alexander Rosenberg Date: Thu, 6 Oct 2022 23:55:27 -0700 Subject: [PATCH] Fix some cases with 0, and fix a label name --- bmi-calc/main.nasm | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/bmi-calc/main.nasm b/bmi-calc/main.nasm index 640aaf8..cec1288 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_inf_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_inf_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,inf_float_text + mov rdx,inf_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 @@ -157,7 +185,7 @@ print_float_scale_loop: cvtss2si rax,xmm0 mov rcx,23 mov rbx,10 -print_float_reverse_loop: +print_float_mem_loop: xor rdx,rdx div rbx add rdx,'0' @@ -165,7 +193,7 @@ print_float_reverse_loop: dec rcx cmp rax,0 - jne print_float_reverse_loop + jne print_float_mem_loop push rcx push 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,10 @@ 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 +inf_float_text: db "Infinity" +inf_float_length: equ $ - inf_float_text _10f: dd 10.0 _0.1f: dd 0.1 _100f: dd 100.0