;citim 3 nr intregi
;det minimul dintre ele, folosind o functie
includelib libcmt.lib
includelib legacy_stdio_definitions.lib
printf proto
scanf proto
.data
read_prompt1 byte "Dati num1: ",0
read_prompt2 byte "Dati num2: ",0
read_prompt3 byte "Dati num3: ",0
read_fmt  byte "%lld",0
num1 sqword ?
num2 sqword ?
num3 sqword ?
mesaj byte "Maximul este %lld",0ah,0
mesaj2 byte "este %lld",0ah,0
mesaj3 byte "... %lld",0ah,0
.code
main proc
;printf("Dati num1:");
;scanf("%lld",num1);
sub rsp,40
lea rcx,read_prompt1
call printf
lea rcx,read_fmt
lea rdx,num1
call scanf
add rsp,40

;printf("Dati num2:");
;scanf("%lld",num2);
sub rsp,40
lea rcx,read_prompt2
call printf
lea rcx,read_fmt
lea rdx,num2
call scanf
add rsp,40

;printf("Dati num3:");
;scanf("%lld",num3);
sub rsp,40
lea rcx,read_prompt3
call printf
lea rcx,read_fmt
lea rdx,num3
call scanf
add rsp,40

;apelam maxim3(num1,num2,num3)
;arg. sunt in rcx, rdx, r8.
;valoarea returnata se afla in rax

mov rcx,num1
mov rdx,num2
mov r8,num3
call maxim3


;afisam minimul aflat in rax
sub rsp,40
lea rcx,mesaj
mov rdx,rax
call printf
add rsp,40

ret
main endp

;maxim3(long long arg1, long long arg2, long long arg3)
;if arg1 >= arg2  if arg1>=arg3 max=arg1; else max=arg3
;else             if arg2>=arg3 max=arg2; else max=arg3
;rcx=arg1, rdx=arg2, r8=arg3
maxim3 proc
cmp rcx,rdx
jnge comp_23
    cmp rcx,r8
    jnge max_arg3
    mov rax,rcx
    jmp final
max_arg3: 
    mov rax,r8
    jmp final
comp_23:
    cmp rdx,r8
    jnge max_arg3
    mov rax,rdx
final:
ret
maxim3 endp
end