words.asm 781 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. section .bss
  2. num resq 1
  3. wrd resq 4096
  4. section .text
  5. global _start
  6. _start:
  7. call readword
  8. cmp rax,-1
  9. je .done
  10. jmp _start
  11. .done:
  12. call printwords
  13. call die
  14. readword
  15. mov rbx,[num]
  16. mov rax,rbx
  17. add rax,1
  18. mov [num],rax
  19. shl rbx,5 ;; = *32
  20. lea rbx,[wrd + rbx]
  21. .loop:
  22. call getchar
  23. cmp rax,-1
  24. je .done
  25. cmp rax,' '
  26. je .done
  27. cmp rax,0x0A
  28. je .done
  29. mov byte [rbx],al
  30. inc rbx
  31. jmp .loop
  32. .done
  33. mov byte [rbx],0
  34. ret
  35. printwords:
  36. mov rbx,0
  37. push rbx
  38. .loop:
  39. mov rbx,[rsp]
  40. mov rax,rbx
  41. inc rax
  42. mov [rsp],rax
  43. mov rcx,[num]
  44. cmp rax,rcx
  45. je .done
  46. shl rbx,5 ;; = *32
  47. lea rbx,[wrd + rbx]
  48. mov rax,1
  49. mov rdi,1
  50. mov rsi,rbx
  51. mov rdx,32
  52. syscall
  53. mov rax,0xA
  54. call putchar
  55. jmp .loop
  56. .done:
  57. pop rbx
  58. ret
  59. die:
  60. mov rax,60
  61. mov rdi,0
  62. syscall
  63. %include "getput.asm"