segment .text
global main
extern printf, scanf
main:
a equ local1
b equ local2
push rbp
mov rbp, rsp
frame 2, 2, 3
sub rsp, frame_size
segment .data
.scanf db "%lf %lf",0
.prompt db "Enter 2 floating point numbers: ",0
segment .text
.loop lea rcx, [.prompt]
call printf
lea rcx, [.scanf]
lea rdx, [rsp+a]
lea r8, [rsp+b]
call scanf
cmp ax, 2
jne .done
movsd xmm0, [rbp+a]
movsd xmm1, [rbp+b]
ucomisd xmm0, xmm1
jb .b
.bret movsd xmm0, [rsp+a]
ucomisd xmm0, xmm1
jbe .be
.beret movsd xmm0, [rsp+a]
movsd xmm1, [rsp+b]
ucomisd xmm0, xmm1
jg .a
.aret movsd xmm0, [rsp+a]
movsd xmm1, [rsp+b]
ucomisd xmm0, xmm1
jae .ae
.aeret movsd xmm0, [rsp+a]
movsd xmm1, [rsp+b]
ucomisd xmm0, xmm1
je .e
.eret movsd xmm0, [rsp+a]
movsd xmm1, [rsp+b]
ucomisd xmm0, xmm1
jne .ne
.neret jmp .loop
segment .data
.printb db "%f < %f",0x0a,0
segment .text
.b:
lea rcx, [.printb]
movsd xmm2, xmm1
movq r8, xmm2
movsd xmm1, xmm0
movq rdx, xmm1
call printf
jmp .bret
segment .data
.printbe db "%f <= %f",0x0a,0
segment .text
.be:
lea rcx, [.printbe]
movsd xmm2, xmm1
movq r8, xmm2
movsd xmm1, xmm0
movq rdx, xmm1
call printf
jmp .beret
segment .data
.printa db "%f > %f",0x0a,0
segment .text
.a:
lea rcx, [.printa]
movsd xmm2, xmm1
movq r8, xmm2
movsd xmm1, xmm0
movq rdx, xmm1
call printf
jmp .aret
segment .data
.printae db "%f >= %f",0x0a,0
segment .text
.ae:
lea rcx, [.printae]
movsd xmm2, xmm1
movq r8, xmm2
movsd xmm1, xmm0
movq rdx, xmm1
call printf
jmp .aeret
segment .data
.printe db "%f == %f",0x0a,0
segment .text
.e:
lea rcx, [.printe]
movsd xmm2, xmm1
movq r8, xmm2
movsd xmm1, xmm0
movq rdx, xmm1
call printf
jmp .eret
segment .data
.printne db "%f != %f",0x0a,0
segment .text
.ne:
lea rcx, [.printne]
movsd xmm2, xmm1
movq r8, xmm2
movsd xmm1, xmm0
movq rdx, xmm1
call printf
jmp .neret
.done mov eax, 0
leave
ret