splash365

Assembly [Assignment2]

Apr 9th, 2021 (edited)
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2. .stack 100h
  3.  
  4. .data
  5. ret_msg  db  'Process returned 0 (0x0)$'
  6. ip_msg   db  'n = $'
  7. inv      db  'Invalid Input!$'
  8. new_line db  0ah,0dh,"$"
  9. space    db  ' $'
  10. i        db  1
  11. j        db  1  
  12. char     db  1  ; for storing input char
  13. n        db  1  ; pre-process input char into numeric
  14. type     db  1  ; type = 1 denotes number, type = 2 denotes upper case, type = 3 denotes lower case
  15. val      db  1  ; for printing a character
  16. cnt_sp   db  1  ; for storing number of spaces
  17.  
  18. .code
  19. main proc
  20.     mov ax, @data
  21.     mov ds, ax
  22.    
  23.     INPUT:
  24.     mov ah, 9
  25.     lea dx, ip_msg
  26.     int 21h    
  27.     mov ah, 1
  28.     int 21h    
  29.     mov char, al
  30.    
  31.     ; new line
  32.     mov ah, 9
  33.     lea dx, new_line
  34.     int 21h
  35.    
  36.     ; check if it is '$'
  37.     cmp char, '$'
  38.     je EXIT
  39.    
  40.     ; check if input character is a number
  41.     cmp char, '9'
  42.     jg Alphabet
  43.     cmp char, '0'
  44.     jle Invalid
  45.    
  46.     ; assigning input type and pre-process n for number
  47.     mov type, 1
  48.     mov bl, char
  49.     mov n, bl
  50.     sub n, 48
  51.     jmp Display
  52.    
  53.     ; check if it is an Alphabet
  54.     Alphabet:
  55.     cmp char, 'A'
  56.     jl Invalid
  57.     cmp char, 'Z'
  58.     jg Lower_Case
  59.    
  60.     ; assigning input type and pre-process n for Upper Case Alphabet
  61.     mov type, 2
  62.     mov bl, char
  63.     mov n, bl
  64.     sub n, 64
  65.     jmp Display
  66.    
  67.     ; check for valid lower case alphabet
  68.     Lower_Case:
  69.     cmp char, 'a'
  70.     jl Invalid
  71.     cmp char, 'z'
  72.     jg Invalid
  73.    
  74.     ; assigning input type and pre-process n for Lower Case Alphabet
  75.     mov type, 3
  76.     mov bl, char
  77.     mov n, bl
  78.     sub n, 96
  79.     jmp Display
  80.    
  81.     Invalid:
  82.     mov ah, 9
  83.     lea dx, inv
  84.     int 21h  
  85.    
  86.     ; new line
  87.     mov ah, 9
  88.     lea dx, new_line
  89.     int 21h
  90.     int 21h
  91.    
  92.     jmp INPUT
  93.    
  94.     Display:
  95.        
  96.     ; Outer for loop
  97.     mov i, 1
  98.     mov bl, n    
  99.     OUTER_FOR:
  100.     cmp i, bl
  101.     jg OUTER_FOR_EXIT
  102.    
  103.     ; Inside Outer for
  104.     mov cl, n
  105.     sub cl, i
  106.     mov cnt_sp, cl
  107.     add cnt_sp, cl
  108.    
  109.     ; Loop for printing spaces
  110.     mov j, 1
  111.     mov cl, cnt_sp
  112.     SPACE_FOR:
  113.     cmp j, cl
  114.     jg SPACE_FOR_EXIT
  115.    
  116.     ; inside space printing loop
  117.     mov ah, 9
  118.     lea dx, space
  119.     int 21h
  120.     inc j
  121.     jmp SPACE_FOR
  122.    
  123.     SPACE_FOR_EXIT:
  124.    
  125.     ; First half
  126.     mov j, 1
  127.     mov cl, i
  128.     FIRST_HALF_FOR:
  129.     cmp j, cl
  130.     jg FIRST_HALF_FOR_EXIT
  131.    
  132.     ; inside printing first half
  133.     mov ch, j
  134.     mov val, ch
  135.     cmp type, 1
  136.     je generate_number_first
  137.     cmp type, 2
  138.     je generate_upper_first
  139.     jmp generate_lower_first
  140.    
  141.     generate_number_first:
  142.     add val, 48
  143.     jmp print_char_first
  144.     generate_upper_first:
  145.     add val, 64
  146.     jmp print_char_first
  147.     generate_lower_first:
  148.     add val, 96
  149.     jmp print_char_first
  150.    
  151.     print_char_first:
  152.     mov ah, 2
  153.     mov dl, val
  154.     int 21h
  155.     mov ah, 9
  156.     lea dx, space
  157.     int 21h
  158.    
  159.     inc j
  160.     jmp FIRST_HALF_FOR
  161.    
  162.     FIRST_HALF_FOR_EXIT:
  163.    
  164.     ; Second half
  165.     mov cl, i    
  166.     mov j, cl
  167.     sub j, 1
  168.     SECOND_HALF_FOR:
  169.     cmp j, 1
  170.     jl SECOND_HALF_FOR_EXIT
  171.    
  172.     ; inside printing second half
  173.     mov ch, j
  174.     mov val, ch
  175.     cmp type, 1
  176.     je generate_number_second
  177.     cmp type, 2
  178.     je generate_upper_second
  179.     jmp generate_lower_second
  180.    
  181.     generate_number_second:
  182.     add val, 48
  183.     jmp print_char_second
  184.     generate_upper_second:
  185.     add val, 64
  186.     jmp print_char_second
  187.     generate_lower_second:
  188.     add val, 96
  189.     jmp print_char_second
  190.    
  191.     print_char_second:
  192.     mov ah, 2
  193.     mov dl, val
  194.     int 21h
  195.     mov ah, 9
  196.     lea dx, space
  197.     int 21h
  198.    
  199.     dec j
  200.     jmp SECOND_HALF_FOR
  201.    
  202.     SECOND_HALF_FOR_EXIT:
  203.    
  204.     mov ah, 9
  205.     lea dx, new_line
  206.     int 21h
  207.    
  208.     inc i  
  209.     jmp OUTER_FOR
  210.    
  211.     OUTER_FOR_EXIT:
  212.    
  213.     mov ah, 9
  214.     lea dx, new_line
  215.     int 21h
  216.    
  217.     jmp INPUT
  218.    
  219.     ; exit
  220.     EXIT:
  221.     mov ah, 9
  222.     lea dx, new_line
  223.     int 21h
  224.     lea dx, ret_msg
  225.     int 21h
  226.    
  227.     main endp
  228. end main
Add Comment
Please, Sign In to add comment