Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. %include "simple_io.inc"
  2.  
  3. global asm_main
  4.  
  5. SECTION .data
  6. err1: db "incorrect number of command line arguments",10,0
  7. err2: db "incorrect length of argument",10,0
  8. err3: db "incorrect first letter of argument (should be 3 or 5 or 7 or 9)",10,0
  9. err4: db "incorrect second letter of argument (should be an upper case letter)", 10,0
  10. sizeparam: db "size is: ", 10, 0
  11. letterparam: db "letter is: ", 10,0
  12.  
  13. SECTION .bss
  14.  
  15. SECTION .text
  16.  
  17. ;recieves parameters: letter in [RBP+24], number in [RBP+32]
  18. display_shape:
  19. enter 0, 0
  20. saveregs
  21. mov rax, sizeparam
  22. call print_string
  23. mov rax, [RBP+32]
  24. call print_int
  25. call print_nl
  26. mov rax, letterparam
  27. call print_string
  28. mov rax, [rbp+24]
  29. call print_char
  30. call print_nl
  31. restoregs
  32. leave
  33. ret
  34.  
  35. asm_main:
  36. enter 0,0 ; setup routine
  37. saveregs ; save all registers
  38.  
  39. ;; the first param is in rdi, so rdi=argc
  40. cmp rdi, qword 2 ; argc should be 2
  41. jne ERR1
  42.  
  43. ;; check length here
  44. mov rbx, qword 0
  45. mov rbx, [rsi+8]
  46. mov al, byte [rbx+2]
  47. cmp al, byte 0
  48. jne ERR2
  49.  
  50. ;; check if first char is a digit
  51. mov r12, qword 0
  52. mov r12b, byte [rbx]
  53.  
  54. cmp r12, 48 ; compare al to the ASCII value of '1'
  55. jb ERR3 ; error if ASCII value is less than '1' = 31h
  56. cmp r12, 57 ; compare al to the ASCII value of '9'
  57. ja ERR3
  58.  
  59. ;; must be above one and odd
  60. sub r12, 48 ;convert char to number
  61. cmp r12, 3
  62. jl ERR3 ; can't be less than 3
  63. cmp r12, 4 ; cant be even
  64. je ERR3
  65. cmp r12, 6 ; cant be even
  66. je ERR3
  67. cmp r12, 8 ; cant be even
  68. je ERR3
  69.  
  70. ;; second char must be upper case letter
  71. mov r11, qword 0
  72. mov r11b, byte [rbx+1] ;contains the second char
  73.  
  74. ;; checks if second char is upper case letter
  75. cmp r11, 65
  76. jb ERR4
  77. cmp r11, 90
  78. ja ERR4
  79.  
  80. push r12
  81. push r11
  82. sub rsp, 8
  83. call display_shape
  84. add rsp, 8
  85. pop r11
  86. pop r12
  87.  
  88.  
  89. jmp asm_main_end
  90.  
  91. ERR1:
  92. mov rax, err1
  93. call print_string
  94. jmp asm_main_end
  95.  
  96. ERR2:
  97. mov rax, err2
  98. call print_string
  99. jmp asm_main_end
  100.  
  101. ERR3:
  102. mov rax, err3
  103. call print_string
  104. jmp asm_main_end
  105.  
  106. ERR4:
  107. mov rax, err4
  108. call print_string
  109. jmp asm_main_end
  110.  
  111. asm_main_end:
  112. restoregs ; restore all registers
  113. leave
  114. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement