История изменений
Исправление arax, (текущая версия) :
Я не могу найти и понять ошибку
Неправильно преобразовывается строка в число(использование регистров в операции умножения), число в строку(перемещение остатка) и кривая работа с буфером при выводе строки(тут вообще все неправильно).
Вот код максимально близкий к оригиналу где это исправлено:
section .data
num dd 0
section .bss
buf resb 10
section .text
global _start
_start:
; Считывание числа из терминала
mov rax, 0
mov rdi, 0
mov rsi, buf
mov rdx, 10
syscall
; Подготовка к перевода строки в число
xor rax, rax
xor rbx, rbx
mov rbx, 10
lea rsi, [buf]
mov rcx, 10
xor rdi, rdi
convert_to_uint32_t:
; 10 раз считываем значение элементов массива buf
; из аски кода вычитаем код нуля => получаем цифру
; текущее число умножаем на 10 и прибавляем цифру
cmp rcx, 0
je end_convert
cmp byte[rsi], '0'
jl end_convert
cmp byte[rsi], '9'
ja end_convert
mov rax, rdi
mul rbx
mov rdi, rax
movzx rax, byte[rsi]
sub rax, '0'
add rdi, rax
inc rsi
dec rcx
jmp convert_to_uint32_t
end_convert:
mov [num], rdi
lea rsi, [buf+10]
mov rax, [num]
xor rbx, rbx
mov rbx, 10
; Обратное преобразованание числа в строку для вывода
convert_to_str:
xor rdx, rdx
div rbx
add rdx, '0'
mov byte[rsi], dl
dec rsi
cmp rax, 0
jne convert_to_str
; Выводим строку числа
mov rax, 1
mov rdi, 1
lea rdx, [buf+10]
sub rdx, rsi
inc rdx
syscall
; Корректное завершение программы
mov rax, 60
xor rdi, rdi
syscall
PS
Если чё, я на ассемблере лет 25 не писал :)
Исходная версия arax, :
Я не могу найти и понять ошибку
Неправильно преобразовывается строка в число(использование регистров в операции умножения), число в строку(перемещение остатка) и кривая работа с буфером при выводе строки(тут вообще все неправильно).