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