LINUX.ORG.RU

История изменений

Исправление 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, :

Я не могу найти и понять ошибку

Неправильно преобразовывается строка в число(использование регистров в операции умножения), число в строку(перемещение остатка) и кривая работа с буфером при выводе строки(тут вообще все неправильно).