Advertisement
Guest User

bigrams.s

a guest
Jul 3rd, 2015
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. bits 64
  2. global _start
  3.  
  4. section .text
  5.  
  6. ;; rsi - current line end
  7. _start:
  8.     mov rsi, line
  9.     mov r12, buf
  10.     mov r13, r12
  11. .fgets:
  12.     call loadc
  13.     cmp byte [rsi-1], 10
  14.     jne .fgets
  15.  
  16. ;; rbx - line pointer
  17. ;; eax - 1st character
  18. ;; ecx - 2nd character
  19.     mov byte [rsi], 0
  20.     mov rbx, line-1
  21.     xor eax, eax
  22.     xor ecx, ecx
  23. .check_bigrams:
  24.     inc rbx
  25. .loop:
  26.     cmp rbx, rsi
  27.     je .pass
  28.     mov al, [rbx]
  29.     sub al, 97
  30.     jl .check_bigrams
  31.     mov cl, [rbx+1]
  32.     sub cl, 97
  33.     jl .check_bigrams
  34.     mov edx, 1
  35.     shl edx, cl
  36.     and edx, [bigrams+eax*4]  ; is a valid bigram?
  37.     jnz .check_bigrams
  38. .fail:
  39.     mov rsi, line             ; reset line
  40.     jmp .fgets
  41. ;; Output bytes between line and rsi
  42. .pass:
  43.     mov edi, 1
  44.     mov rdx, rsi
  45.     mov rsi, line
  46.     sub rdx, rsi
  47.     mov eax, 1
  48.     syscall
  49.     jmp .fgets
  50.  
  51. exit:
  52.     xor edi, edi
  53.     mov eax, 60
  54.     syscall
  55.  
  56. ;; r12 - input buffer start
  57. ;; r13 - input buffer end
  58. loadc:
  59.     cmp r12, r13
  60.     je .refill
  61. .copy:
  62.     mov al, [r12]
  63.     inc r12
  64.     mov [rsi], al
  65.     inc rsi
  66.     ret
  67. .refill:
  68.     mov r12, rsi
  69.     xor edi, edi
  70.     mov rsi, buf
  71.     mov rdx, bufsize
  72.     xor eax, eax
  73.     syscall
  74.     cmp eax, 0
  75.     je exit
  76.     mov rsi, r12
  77.     mov r12, buf
  78.     lea r13, [r12+rax]
  79.     jmp .copy
  80.  
  81. section .rodata
  82. bigrams:
  83.     dd 0x01feff7f, 0x01164911, 0x001a4d95, 0x01564959, 0x01fef9ff
  84.     dd 0x001a4931, 0x001e69d1, 0x015e4111, 0x02befc7f, 0x00104001
  85.     dd 0x00042110, 0x013cdd3d, 0x0116f113, 0x035c6d7d, 0x017eff7f
  86.     dd 0x011ec991, 0x00100000, 0x017efd5d, 0x015ddd95, 0x015e4995
  87.     dd 0x000eb97f, 0x00104111, 0x00066191, 0x00000011, 0x0006d91d
  88.     dd 0x00000010
  89.  
  90. section .bss
  91. line:
  92.     resb 1024
  93. buf:
  94.     resb 4096
  95. bufsize:equ $-buf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement