169 похожих чатов

Может кто помочь с насм в линуксе? asm section .data

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)
Вроде нормально,а чувство что что то все таки не так

3 ответов

69 просмотров
Mark- Автор вопроса

mov edi, esi тут надо было mov edi , eax но все равно не работает,походу еще где то ошибка

Видишь core dumped — пишешь coredumpctl gdb и пошёл. Ну или сам под gdb запускаешь.

Mark- Автор вопроса

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта