print_type.asm 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. %ifndef PRINT_TYPE_ASM
  2. %define PRINT_TYPE_ASM
  3. %include "syscalls.asm"
  4. section .data
  5. tag_bool db "<bool....>"
  6. tag_nil db "<nil.....>"
  7. tag_symbol db "<symbol..>"
  8. tag_char db "<char....>"
  9. tag_number db "<number..>"
  10. tag_cons db "<cons....>"
  11. tag_closure db "<closure.>"
  12. tag_string db "<string..>"
  13. tag_vecrec db "<record..>"
  14. tag_ioport db "<io-port.>"
  15. tag_gcredir db "<gc-redir>"
  16. section .text
  17. print_type:
  18. ;; INPUT: scheme object in rax
  19. ;; SIDE: prints out its type
  20. ;; OUTPUT: leaves rax unchanged
  21. mov rcx, rax
  22. and rcx, 0b111
  23. cmp rcx, 0b000
  24. je .bool_nil_symbol_char
  25. cmp rcx, 0b001
  26. jne .skip1
  27. mov rsi, tag_number
  28. jmp .p
  29. .skip1:
  30. cmp rcx, 0b010
  31. jne .skip2
  32. mov rsi, tag_cons
  33. jmp .p
  34. .skip2:
  35. cmp rcx, 0b011
  36. jne .skip3
  37. mov rsi, tag_closure
  38. jmp .p
  39. .skip3:
  40. cmp rcx, 0b100
  41. jne .skip4
  42. mov rsi, tag_string
  43. jmp .p
  44. .skip4:
  45. cmp rcx, 0b101
  46. jne .skip5
  47. mov rsi, tag_vecrec
  48. jmp .p
  49. .skip5:
  50. cmp rcx, 0b110
  51. jne .skip6
  52. mov rsi, tag_ioport
  53. jmp .p
  54. .skip6:
  55. mov rsi, tag_gcredir
  56. .p:
  57. mov rax, sys_write
  58. mov rdi, 0
  59. mov rdx, 10
  60. syscall
  61. ret
  62. .bool_nil_symbol_char:
  63. mov rcx, rax
  64. and rcx, 0b11000
  65. cmp rcx, 0b00000
  66. jne .skip7
  67. mov rsi, tag_bool
  68. jmp .p
  69. .skip7:
  70. cmp rcx, 0b01000
  71. jne .skip8
  72. mov rsi, tag_nil
  73. jmp .p
  74. .skip8:
  75. cmp rcx, 0b10000
  76. jne .skip9
  77. mov rsi, tag_symbol
  78. jmp .p
  79. .skip9:
  80. ;; 0b11000
  81. mov rsi, tag_char
  82. jmp .p
  83. %endif