История изменений
Исправление 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