numbers db 5, 2, 8, 1, 6, 3, 9, 4, 7
len equ $ - numbers
format db "Max number: %d", 0xA, 0
section .text
global _start
_start:
; Сортировка пузырьком
mov ecx, len
dec ecx
outer_loop:
xor esi, esi
inner_loop:
mov eax, esi
inc eax
mov edi, esi
mov bl, [numbers + esi]
cmp bl, [numbers + eax]
jge not_swapped
mov al, [numbers + esi]
mov ah, [numbers + eax]
mov [numbers + esi], ah
mov [numbers + eax], al
not_swapped:
inc esi
cmp esi, ecx
jnz inner_loop
dec ecx
jnz outer_loop
; Последний элемент массива после сортировки - самый большой
movzx eax, byte [numbers + ecx]
; Вывод самой большой цифры
mov edi, format
mov esi, eax
call print_number
; Выход из программы
mov eax, 60
xor edi, edi
syscall
; Функция преобразования числа в строку и вывода строки
print_number:
push rax ; сохраняем регистры
push rdx
push rbx
push rcx
mov ecx, 10 ; десятичная система счисления
mov rbx, 0 ; счетчик цифр
.loop:
xor rdx, rdx ; сбрасываем rdx для деления
div rcx ; делим rsi на 10, остаток в rdx, результат в rsi
add dl, '0' ; преобразуем остаток в ASCII
push rdx ; сохраняем цифру на стеке
inc rbx ; увеличиваем счетчик цифр
test rsi, rsi ; проверяем, закончили ли мы
jnz .loop ; если нет, продолжаем
.print_loop:
pop rdx ; достаем цифру из стека
mov rax, 1 ; системный вызов для вывода
mov rdi, 1 ; файловый дескриптор (stdout)
mov rsi, rdx ; указатель на цифру
mov rdx, 1 ; длина сообщения (1 байт)
syscall ; вызываем системный вызов
inc rdx ; увеличиваем длину для следующей цифры
dec rbx ; уменьшаем счетчик цифр
jnz .print_loop ; если есть еще цифры, выводим их
pop rcx
pop rbx
pop rdx
pop rax
ret
mark@mark-ASUS-TUF-Gaming-A15-FA506QM-FA506QM:~/prog$ nasm -f elf64 bubblesort.asm -o bubblesort.o
mark@mark-ASUS-TUF-Gaming-A15-FA506QM-FA506QM:~/prog$ ld -o bubblesort bubblesort.o
mark@mark-ASUS-TUF-Gaming-A15-FA506QM-FA506QM:~/prog$ ./bubblesort
Segmentation fault (core dumped)
Вроде нормально,а чувство что что то все таки не так
mov edi, esi тут надо было mov edi , eax но все равно не работает,походу еще где то ошибка
Видишь core dumped — пишешь coredumpctl gdb и пошёл. Ну или сам под gdb запускаешь.
Обсуждают сегодня