LINUX.ORG.RU

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

Исправление wandrien, (текущая версия) :

Починил. Спрашивайте ваши вопросы.

section .data
    nl  db 10

section .bss
    buf resb 10
    
section .text
    global _start

_start:
    mov rax, 458920117
    call print_num
    call print_nl

    mov rax, 0
    mov rdi, 0
    mov rsi, buf
    mov rdx, 10
    syscall

    mov r8, rax
    xor rax, rax
    mov rbx, 10
    mov rsi, buf

convert_to_uint32_t:
    cmp r8, 0
    je  end_convert
    movzx rcx, byte[rsi]
    sub rcx, '0'
    jb  end_convert
    cmp rcx, 9
    ja  end_convert
    mul rbx
    add rax, rcx
    inc rsi
    dec r8
    jmp convert_to_uint32_t

end_convert:

    call print_num
    call print_nl

    mov rax, 60
    xor rdi, rdi
    syscall


print_num:
    lea rsi, [buf+10]
    mov rbx, 10
.convert_to_str:
    dec rsi
    xor rdx, rdx
    div rbx
    add rdx, '0'
    mov byte [rsi], dl
    cmp rax, 0
    jne .convert_to_str

    mov rax, 1
    mov rdi, 1
    lea rdx, [buf+10]
    sub rdx, rsi
    syscall

    ret

print_nl:
    mov rax, 1
    mov rdi, 1
    mov rdx, 1;
    lea rsi, [nl]
    syscall

    ret

Исправление wandrien, :

Починил. Спрашивайте ваши вопросы.

section .data
    nl  db 10

section .bss
    buf resb 10
    
section .text
    global _start

_start:
    mov rax, 458920117
    call print_num
    call print_nl

    mov rax, 0
    mov rdi, 0
    mov rsi, buf
    mov rdx, 10
    syscall

    mov r8, rax
    xor rax, rax
    mov rbx, 10
    mov rsi, buf

convert_to_uint32_t:
    cmp r8, 0
    je  end_convert
    movzx rcx, byte[rsi]
    sub rcx, '0'
    jb  end_convert
    cmp rcx, 9
    ja  end_convert
    mul rbx
    add rax, rcx
    inc rsi
    dec r8
    jmp convert_to_uint32_t

end_convert:

    call print_num
    call print_nl

    mov rax, 60
    xor rdi, rdi
    syscall


print_num:
    lea rsi, [buf+10]
    mov rbx, 10
.convert_to_str:
    dec rsi
    xor rdx, rdx
    div rbx
    add rdx, '0'
    mov byte [rsi], dl
    cmp rax, 0
    jne .convert_to_str

    mov rax, 1
    mov rdi, 1
    mov rdx, 10
    lea rdx, [buf+10]
    sub rdx, rsi
    syscall

    ret

print_nl:
    mov rax, 1
    mov rdi, 1
    mov rdx, 1;
    lea rsi, [nl]
    syscall

    ret

Исправление wandrien, :

Починил. Спрашивайте ваши вопросы.

section .data
    nl  db 10

section .bss
    buf resb 10
    
section .text
    global _start

_start:
    mov rax, 458920117
    call print_num
    call print_nl

    mov rax, 0
    mov rdi, 0
    mov rsi, buf
    mov rdx, 10
    syscall

    mov r8, rax
    xor rax, rax
    mov rbx, 10
    mov rsi, buf

convert_to_uint32_t:
    cmp r8, 0
    je  end_convert
    movzx rcx, byte[rsi]
    sub rcx, '0'
    jb  end_convert
    mul rbx
    add rax, rcx
    inc rsi
    dec r8
    jmp convert_to_uint32_t

end_convert:

    call print_num
    call print_nl

    mov rax, 60
    xor rdi, rdi
    syscall


print_num:
    lea rsi, [buf+10]
    mov rbx, 10
.convert_to_str:
    dec rsi
    xor rdx, rdx
    div rbx
    add rdx, '0'
    mov byte [rsi], dl
    cmp rax, 0
    jne .convert_to_str

    mov rax, 1
    mov rdi, 1
    mov rdx, 10
    lea rdx, [buf+10]
    sub rdx, rsi
    syscall

    ret

print_nl:
    mov rax, 1
    mov rdi, 1
    mov rdx, 1;
    lea rsi, [nl]
    syscall

    ret

Исправление wandrien, :

Починил. Спрашивайте ваши вопросы.

section .data
    nl  db 10

section .bss
    buf resb 10
    
section .text
    global _start

_start:
    mov rax, 458920117
    call print_num
    call print_nl

    ; Считывание числа из терминала
    mov rax, 0
    mov rdi, 0
    mov rsi, buf
    mov rdx, 10
    syscall

    mov r8, rax
    xor rax, rax
    mov rbx, 10
    mov rsi, buf

convert_to_uint32_t:
    cmp r8, 0
    je  end_convert
    movzx rcx, byte[rsi]
    sub rcx, '0'
    jb  end_convert
    mul rbx
    add rax, rcx
    inc rsi
    dec r8
    jmp convert_to_uint32_t

end_convert:

    call print_num
    call print_nl

    mov rax, 60
    xor rdi, rdi
    syscall


print_num:
    lea rsi, [buf+10]
    mov rbx, 10
.convert_to_str:
    dec rsi
    xor rdx, rdx
    div rbx
    add rdx, '0'
    mov byte [rsi], dl
    cmp rax, 0
    jne .convert_to_str

    mov rax, 1
    mov rdi, 1
    mov rdx, 10
    lea rdx, [buf+10]
    sub rdx, rsi
    syscall

    ret

print_nl:
    mov rax, 1
    mov rdi, 1
    mov rdx, 1;
    lea rsi, [nl]
    syscall

    ret

Исходная версия wandrien, :

Починил. Спрашивайте ваши вопросы.

section .data
    nl  db 10

section .bss
    buf resb 10
    
section .text
    global _start

_start:
    mov rax, 458920117
    call print_num
    call print_nl

    ; Считывание числа из терминала
    mov rax, 0
    mov rdi, 0
    mov rsi, buf
    mov rdx, 10
    syscall

    ; Подготовка к перевода строки в число
    mov r8, rax
    xor rax, rax
    mov rbx, 10
    mov rsi, buf

convert_to_uint32_t:
    ; 10 раз считываем значение элементов массива buf
    ; из аски кода вычитаем код нуля => получаем цифру
    ; текущее число умножаем на 10 и прибавляем цифру
    cmp r8, 0
    je  end_convert
    movzx rcx, byte[rsi]
    sub rcx, '0'
    jb  end_convert
    mul rbx
    add rax, rcx
    inc rsi
    dec r8
    jmp convert_to_uint32_t

end_convert:

    call print_num
    call print_nl

    ; Корректное завершение программы 
    mov rax, 60
    xor rdi, rdi
    syscall


print_num:
    lea rsi, [buf+10]
    mov rbx, 10
.convert_to_str:
    dec rsi
    xor rdx, rdx
    div rbx
    add rdx, '0'
    mov byte [rsi], dl
    cmp rax, 0
    jne .convert_to_str

    mov rax, 1
    mov rdi, 1
    mov rdx, 10
    lea rdx, [buf+10]
    sub rdx, rsi
    syscall

    ret

print_nl:
    mov rax, 1
    mov rdi, 1
    mov rdx, 1;
    lea rsi, [nl]
    syscall

    ret