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