segment .text extern printf, rand, srand, malloc, atol global main, create, fill, min ; array = create ( size ); create: push rbp mov rbp, rsp sub rsp, 32 imul rcx, 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, 1 sub rsp, frame_size mov [rbp+.array], rcx mov [rbp+.size], rdx xor r9d, r9d .more mov [rbp+.i], r9 call rand mov r9, [rbp+.i] mov rcx, [rbp+.array] mov [rcx+r9*4], eax inc r9 cmp r9, [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], rcx mov [rbp+.size], rdx xor ebx, ebx mov [rbp+.i], rbx segment .data .format: db "%10d",0x0a,0 segment .text .more lea rcx, [.format] mov rdx, [rbp+.array] mov rbx, [rbp+.i] mov edx, [rdx+rbx*4] mov [rbp+.i], rbx call printf mov rbx, [rbp+.i] inc rbx mov [rbp+.i], rbx cmp rbx, [rbp+.size] jl .more leave ret ; x = min ( array, size ); min: mov eax, [rcx] mov edx, 1 .more mov r8d, [rcx+rdx*4] cmp r8d, eax cmovl eax, r8d inc rdx cmp rdx, rdx 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 eax, 10 mov [rsp+.size], rax ; check for argv[1] providing a size cmp ecx, 2 jl .nosize mov rcx, [rdx+8] call atol mov [rsp+.size], rax .nosize: ; create the array mov rcx, [rsp+.size] call create mov [rsp+.array], rax mov rcx, 10321 call srand ; fill the array with random numbers mov rcx, [rsp+.array] mov rdx, [rsp+.size] call fill ; if size <= 20 print the array mov rdx, [rsp+.size] cmp rdx, 20 jg .toobig mov rcx, [rsp+.array] call print .toobig: ; print the minimum segment .data .format: db "min: %ld",0xa,0 segment .text mov rcx, [rsp+.array] mov rdx, [rsp+.size] call min lea rcx, [.format] mov rdx, rax call printf leave ret