79 lines
1.4 KiB
NASM
79 lines
1.4 KiB
NASM
global _start
|
|
|
|
section .data
|
|
g_buff times 10 db 0
|
|
g_buffLen dq 0
|
|
g_digit db "Digit"
|
|
g_digitLen dq $-g_digit
|
|
g_notDigit db "Not a digit"
|
|
g_notDigitLen dq $-g_notDigit
|
|
|
|
section .text
|
|
default rel
|
|
|
|
_start:
|
|
call read_text
|
|
|
|
movzx rax, byte [g_buff] ; первый символ
|
|
|
|
cmp rax, '0'
|
|
jl .notDigit
|
|
cmp rax, '9'
|
|
jg .notDigit
|
|
.digit:
|
|
lea rsi, [g_digit]
|
|
mov rdx, [g_digitLen]
|
|
jmp .write
|
|
.notDigit:
|
|
lea rsi, [g_notDigit]
|
|
mov rdx, [g_notDigitLen]
|
|
|
|
.write:
|
|
call write_text
|
|
|
|
mov rax, 60
|
|
mov rdi, 0
|
|
syscall
|
|
|
|
; Функция читает текст в буффер
|
|
; Регистры не изменяет
|
|
read_text:
|
|
push rax
|
|
push rdi
|
|
push rsi
|
|
push rdx
|
|
|
|
mov rax, 0 ; sys_read
|
|
mov rdi, 0 ; stdin
|
|
lea rsi, [rel g_buff] ; адрес буфера
|
|
mov rdx, 256 ; количество байт
|
|
syscall
|
|
mov [g_buffLen], rax
|
|
|
|
pop rdx
|
|
pop rsi
|
|
pop rdi
|
|
pop rax
|
|
ret
|
|
|
|
; Функция выводит buff
|
|
; In:
|
|
; - RSI - начало буфера
|
|
; - RDX - размер буфера
|
|
; Регистры не изменяет
|
|
write_text:
|
|
push rax
|
|
push rdi
|
|
push rsi
|
|
push rdx
|
|
|
|
mov rax, 1 ; sys_write
|
|
mov rdi, 1 ; stdout
|
|
syscall
|
|
mov [g_buffLen], rax
|
|
|
|
pop rdx
|
|
pop rsi
|
|
pop rdi
|
|
pop rax
|
|
ret |