segment .text
    global  main
    extern  printf

; void print_max ( long a, long b )
; {
a   equ  local1
b   equ  local2
max equ  local3
print_max:
    push rbp          ; normal stack frame
    mov  rbp, rsp
    frame   2, 3, 4
;   leave space for a, b and max and shadow
    sub  rsp, frame_size
;   int max;
    mov  [rbp+a], rcx ; save a
    mov  [rbp+b], rdx ; save b
;   max = a;
    mov  [rbp+max], rcx
;   if ( b > max ) max = b;
    cmp  rdx, rcx
    jng  skip
    mov  [rbp+max], rdx
skip:
;   printf ( "max(%ld,%ld) = %ld\n",
;            a, b, max );
    segment .data
fmt db   'max(%ld,%ld) = %ld',0xa,0
    segment .text
    lea  rcx, [fmt]
    mov  rdx, [rbp+a]
    mov  r8, [rbp+b]
    mov  r9, [rbp+max]
    call printf
; }
    leave
    ret

main:
    push rbp
    mov  rbp, rsp
    sub  rsp, 32     ; shadow space for register parameters
;   print_max ( 100, 200 );
    mov  rcx, 200    ; first parameter
    mov  rdx, 200    ; second parameter
    call print_max
    xor  eax, eax    ; to return 0
    leave
    ret