global _start section .data arr db 5, 7, 3, 1, 2 arrEnd: buff times 32 db 0 buffend: count dq 0 section .text default rel _start: mov al, 0xFF lea rsi, [arr] lea rdi, [arrEnd] .while: movzx rbx, byte [rsi] ; текущее число cmp rbx, rax cmovl rax, rbx inc rsi cmp rsi, rdi jne .while call print_num_to_buf mov rdx, [count] call write_text mov rax, 60 mov rdi, 0 syscall ; Функция выводит buff ; In: ; - RSI - начало буфера ; - RDX - размер буфера ; Регистры не изменяет write_text: push rax push rdi push rsi push rdx mov rax, 1 ; sys_write mov rdi, 1 ; stdout syscall mov [count], rax pop rdx pop rsi pop rdi pop rax ret ; Функция выводит число в buff ; In: RAX ; Out: RSI - указатель на начало строки print_num_to_buf: lea rsi, [buffend] dec rsi mov rdi, rsi ; сохранить последний адрес mov byte [rsi], 0 ; вписать нуль dec rsi mov byte [rsi], 0xA ; вписать перенос строки dec rsi mov byte [rsi], '0' test rax, rax jz .return mov rcx, 10 ; десятичный делитель .while: xor rdx, rdx test rax, rax jz .break div rcx or dl, 0x30 mov [rsi], dl dec rsi jmp .while .break: inc rsi .return: sub rdi, rsi inc rdi mov [count], rdi ret