119 lines
2.6 KiB
NASM
119 lines
2.6 KiB
NASM
global _start
|
|
|
|
; Static data
|
|
section .data
|
|
promptStr: db 'Write something! (max 32 bytes)',0xA
|
|
promptStrSize: equ $ - promptStr
|
|
|
|
unusedStr: db "This string won't be printed",0xA
|
|
unusedStrSize: equ $ - unusedStr
|
|
|
|
lessStr: db 'The input string has less than 16 bytes',0xA
|
|
lessStrSize: equ $ - lessStr
|
|
|
|
moreStr: db 'The input string has 16 bytes or more',0xA
|
|
moreStrSize: equ $ - moreStr
|
|
|
|
; Dynamic data
|
|
section .bss
|
|
inputBuffer: resb 32
|
|
inputBufferSize: equ 32
|
|
|
|
; Code
|
|
section .text
|
|
_start:
|
|
mov rax, 1
|
|
mov rdi, 1 ; stdout
|
|
mov rsi, promptStr
|
|
mov rdx, promptStrSize
|
|
syscall
|
|
|
|
jmp request_input
|
|
|
|
; Skipped over
|
|
mov rax, 1
|
|
mov rdi, 1
|
|
mov rsi, unusedStr
|
|
mov rdx, unusedStrSize
|
|
syscall
|
|
|
|
request_input:
|
|
xor rax, rax ; 0 = read
|
|
xor rdi, rdi ; 0 = stdin
|
|
mov rsi, inputBuffer
|
|
mov rdx, inputBufferSize
|
|
syscall
|
|
|
|
mov rbx, rax ; store read bytes
|
|
|
|
; *** FLAGS *** (16 bit era)
|
|
; Bit Abbreviation Description
|
|
; 0 CF Carry Flag (1 = carry, 0 = no carry)
|
|
; 2 PF Parity Flag (1 = even, 0 = uneven)
|
|
; 4 AF Adjust Flag (1 = auxiliary carry, 0 no ...)
|
|
; 6 ZF Zero Flag (1 = zero, 0 = non zero)
|
|
; 7 SF Sign Flag (1 = negative, 0 = positive)
|
|
; 8 TF Trap Flag
|
|
; 9 IF Interrupt Flag (1 = enabled, 0 = disabled)
|
|
; 10 DF Direction Flag (1 = down, 0 = up)
|
|
; 11 OF Overflow Flag (1 = overflow, 0 = no overflow)
|
|
; 12 --v
|
|
; 13 IOPL IO Privilege Level
|
|
; 14 NT Nested Task
|
|
;
|
|
; *** EFLAGS *** (32 bit era)
|
|
; 16 RF Resume Flag
|
|
; 17 VM Virtual 8086 mode
|
|
; 18 AC Alignment check
|
|
; 19 VIF Virtual Interrupt Flag
|
|
; 20 VIP Virtual Interrupt Pending
|
|
; 21 ID CPUID enabled flag
|
|
;
|
|
; *** RFLAGS *** (64 bit era)
|
|
; - - None yet
|
|
|
|
; Subtraction without storing the result
|
|
cmp rbx, 16
|
|
; Jump based upon the flags set above
|
|
jl less_than_16
|
|
|
|
; >= 16 bytes
|
|
mov rax, 1
|
|
mov rdi, 1
|
|
mov rsi, moreStr
|
|
mov rdx, moreStrSize
|
|
syscall
|
|
|
|
jmp size_printed
|
|
|
|
less_than_16:
|
|
mov rax, 1
|
|
mov rdi, 1
|
|
mov rsi, lessStr
|
|
mov rdx, lessStrSize
|
|
syscall
|
|
|
|
size_printed:
|
|
dec rbx ; subtract the newline from the count
|
|
|
|
xor rcx, rcx ; loop variable
|
|
loop_begin:
|
|
cmp rcx, rbx ; while loop var < (string size - 1)
|
|
jge loop_end
|
|
inc byte [inputBuffer + rcx]
|
|
inc rcx
|
|
jmp loop_begin
|
|
|
|
loop_end:
|
|
inc rbx ; restore original bytes read count
|
|
|
|
mov rax, 1
|
|
mov rdi, 1
|
|
mov rsi, inputBuffer
|
|
mov rdx, rbx
|
|
syscall
|
|
|
|
mov rax, 60
|
|
xor rdi, rdi
|
|
syscall ; see ya
|