Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bits 64
- global _start
- section .text
- ;; rsi - current line end
- _start:
- mov rsi, line
- mov r12, buf
- mov r13, r12
- .fgets:
- call loadc
- cmp byte [rsi-1], 10
- jne .fgets
- ;; rbx - line pointer
- ;; eax - 1st character
- ;; ecx - 2nd character
- mov byte [rsi], 0
- mov rbx, line-1
- xor eax, eax
- xor ecx, ecx
- .check_bigrams:
- inc rbx
- .loop:
- cmp rbx, rsi
- je .pass
- mov al, [rbx]
- sub al, 97
- jl .check_bigrams
- mov cl, [rbx+1]
- sub cl, 97
- jl .check_bigrams
- mov edx, 1
- shl edx, cl
- and edx, [bigrams+eax*4] ; is a valid bigram?
- jnz .check_bigrams
- .fail:
- mov rsi, line ; reset line
- jmp .fgets
- ;; Output bytes between line and rsi
- .pass:
- mov edi, 1
- mov rdx, rsi
- mov rsi, line
- sub rdx, rsi
- mov eax, 1
- syscall
- jmp .fgets
- exit:
- xor edi, edi
- mov eax, 60
- syscall
- ;; r12 - input buffer start
- ;; r13 - input buffer end
- loadc:
- cmp r12, r13
- je .refill
- .copy:
- mov al, [r12]
- inc r12
- mov [rsi], al
- inc rsi
- ret
- .refill:
- mov r12, rsi
- xor edi, edi
- mov rsi, buf
- mov rdx, bufsize
- xor eax, eax
- syscall
- cmp eax, 0
- je exit
- mov rsi, r12
- mov r12, buf
- lea r13, [r12+rax]
- jmp .copy
- section .rodata
- bigrams:
- dd 0x01feff7f, 0x01164911, 0x001a4d95, 0x01564959, 0x01fef9ff
- dd 0x001a4931, 0x001e69d1, 0x015e4111, 0x02befc7f, 0x00104001
- dd 0x00042110, 0x013cdd3d, 0x0116f113, 0x035c6d7d, 0x017eff7f
- dd 0x011ec991, 0x00100000, 0x017efd5d, 0x015ddd95, 0x015e4995
- dd 0x000eb97f, 0x00104111, 0x00066191, 0x00000011, 0x0006d91d
- dd 0x00000010
- section .bss
- line:
- resb 1024
- buf:
- resb 4096
- bufsize:equ $-buf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement