            segment .text
            extern  printf, random, malloc, atoi
            global  main, create, fill, min

    ;       array = create ( size );
    create:
            push    rbp
            mov     rbp, rsp
            imul    rdi, 4
            call    malloc
            leave
            ret

    ;       fill ( array, size );
    fill:
    .array  equ     local1
    .size   equ     local2
    .i      equ     local3
            push    rbp
            mov     rbp, rsp
            frame   2, 3, 0
            sub     rsp, frame_size
            mov     [rbp+.array], rdi
            mov     [rbp+.size], rsi
            xor     ecx, ecx
    .more   mov     [rbp+.i], rcx
            call    random
            mov     rcx, [rbp+.i]
            mov     rdi, [rbp+.array]
            mov     [rdi+rcx*4], eax
            inc     rcx
            cmp     rcx, [rbp+.size]
            jl      .more
            leave
            ret

    ;       print ( array, size );
    print:
    .array  equ     local1
    .size   equ     local2
    .i      equ     local3
            push    rbp
            mov     rbp, rsp
            frame   2, 3, 2
            sub     rsp, frame_size
            mov     [rbp+.array], rdi
            mov     [rbp+.size], rsi
            xor     ecx, ecx
            mov     [rbp+.i], rcx
            segment .data
    .format:
            db      "%10d",0x0a,0
            segment .text
    .more   lea     rdi, [.format]
            mov     rdx, [rbp+.array]
            mov     rcx, [rbp+.i]
            mov     esi, [rdx+rcx*4]
            mov     [rbp+.i], rcx
            xor     eax, eax
            call    printf
            mov     rcx, [rsp+.i]
            inc     rcx
            mov     [rbp+.i], rcx
            cmp     rcx, [rbp+.size]
            jl      .more
            leave
            ret

    ;       x = min ( array, size );
    min:
            mov     eax, [rdi]
            mov     rcx, 1
    .more   mov     r8d, [rdi+rcx*4]
            cmp     r8d, eax
            cmovl   eax, r8d
            inc     rcx
            cmp     rcx, rsi
            jl      .more
            ret

    main:
    .array  equ     local1
    .size   equ     local2
            push    rbp
            mov     rbp, rsp
            frame   2, 2, 2
            sub     rsp, frame_size

    ;       set default size
            mov     ecx, 10
            mov     [rbp+.size], rcx

    ;       check for argv[1] providing a size
            cmp     edi, 2
            jl      .nosize
            mov     rdi, [rsi+8]
            call    atoi
            mov     [rbp+.size], rax
    .nosize:

    ;       create the array
            mov     rdi, [rbp+.size]
            call    create
            mov     [rbp+.array], rax

    ;       fill the array with random numbers
            mov     rdi, rax
            mov     rsi, [rbp+.size]
            call    fill

    ;       if size <= 20 print the array
            mov     rsi, [rbp+.size]
            cmp     rsi, 20
            jg      .toobig
            mov     rdi, [rbp+.array]
            call    print
    .toobig:

    ;       print the minimum
            segment .data
    .format:
            db      "min: %ld",0xa,0
            segment .text
            mov     rdi, [rbp+.array]
            mov     rsi, [rbp+.size]
            call    min
            lea     rdi, [.format]
            mov     rsi, rax
            xor     eax, eax
            call    printf

            leave
            ret