Advertisement
Artychenal

Untitled

May 22nd, 2025
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
6502 TASM/64TASS 19.98 KB | Source Code | 0 0
  1. .model small
  2. .stack 100h
  3.  
  4. .data
  5.     welcomeMsg      db 'Program for array operations (up to 20 elements)', 0Dh, 0Ah, '$'
  6.     enterSizeMsg    db 'Enter array size (2-20): $'
  7.     enterElementMsg db 'Enter element $'
  8.     colonMsg        db ': $'
  9.     newLineMsg      db 0Dh, 0Ah, '$'
  10.     menuMsg         db 0Dh, 0Ah, 'Menu:', 0Dh, 0Ah
  11.                     db '1. Sum of array elements', 0Dh, 0Ah
  12.                     db '2. Find maximum element', 0Dh, 0Ah
  13.                     db '3. Find minimum element', 0Dh, 0Ah
  14.                     db '4. Sort array', 0Dh, 0Ah
  15.                     db '5. Display array', 0Dh, 0Ah
  16.                     db '6. Input new array', 0Dh, 0Ah
  17.                     db '0. Exit', 0Dh, 0Ah
  18.                     db 'Enter your choice: $'
  19.     sumMsg          db 0Dh, 0Ah, 'Sum of array elements: $'
  20.     maxMsg          db 0Dh, 0Ah, 'Maximum element: $'
  21.     minMsg          db 0Dh, 0Ah, 'Minimum element: $'
  22.     sortedMsg       db 0Dh, 0Ah, 'Array has been sorted:', 0Dh, 0Ah, '$'
  23.     arrayMsg        db 0Dh, 0Ah, 'Current array: $'
  24.     invalidInputMsg db 0Dh, 0Ah, 'Invalid input! Try again.', 0Dh, 0Ah, '$'
  25.     overflowMsg     db 0Dh, 0Ah, 'Overflow error! Sum exceeds 16-bit range.', 0Dh, 0Ah, '$'
  26.     rangeErrorMsg   db 0Dh, 0Ah, 'Value out of range (-32767..32767)! Try again.', 0Dh, 0Ah, '$'
  27.     spaceMsg        db ' $'
  28.    
  29.     array           dw 20 dup(?)
  30.     sorted_array    dw 20 dup(?)
  31.     array_size      dw ?
  32.  
  33. .code
  34. main proc
  35.                          mov  ax, @data
  36.                          mov  ds, ax
  37.                          mov  es, ax
  38.  
  39.                          mov  dx, offset welcomeMsg
  40.                          mov  ah, 9
  41.                          int  21h
  42.  
  43.                          call inputArray
  44.  
  45.     main_loop:          
  46.                          mov  dx, offset menuMsg
  47.                          mov  ah, 9
  48.                          int  21h
  49.  
  50.                          call readNumber
  51.                          mov  bl, al
  52.                          mov  dx, offset newLineMsg
  53.                          mov  ah, 9
  54.                          int  21h
  55.  
  56.                          cmp  bl, 0
  57.                          je   exit_program
  58.                          cmp  bl, 1
  59.                          je   sum_array
  60.                          cmp  bl, 2
  61.                          je   find_max
  62.                          cmp  bl, 3
  63.                          je   find_min
  64.                          cmp  bl, 4
  65.                          je   sort_array
  66.                          cmp  bl, 5
  67.                          je   display_array
  68.                          cmp  bl, 6
  69.                          je   input_new_array
  70.  
  71.                          mov  dx, offset invalidInputMsg
  72.                          mov  ah, 9
  73.                          int  21h
  74.                          jmp  main_loop
  75.  
  76.     sum_array:          
  77.                          call calculateSum
  78.                          jmp  main_loop
  79.  
  80.     find_max:            
  81.                          call findMaximum
  82.                          jmp  main_loop
  83.  
  84.     find_min:            
  85.                          call findMinimum
  86.                          jmp  main_loop
  87.  
  88.     sort_array:          
  89.                          call copyArray                     ; Копіюємо основний масив у sorted_array
  90.                          call sortArray                     ; Сортуємо копію
  91.                          call displaySortedArray            ; Виводимо відсортовану копію
  92.                          jmp  main_loop
  93.  
  94.     display_array:      
  95.                          call displayArray
  96.                          jmp  main_loop
  97.  
  98.     input_new_array:    
  99.                          call inputArray
  100.                          jmp  main_loop
  101.  
  102.     exit_program:        
  103.                          mov  ah, 4Ch
  104.                          int  21h
  105. main endp
  106.  
  107. inputArray proc
  108.                          push ax
  109.                          push bx
  110.                          push cx
  111.                          push dx
  112.                          push si
  113.  
  114.     input_size:          
  115.                          mov  dx, offset enterSizeMsg
  116.                          mov  ah, 9
  117.                          int  21h
  118.                          call readNumber
  119.                          cmp  ax, 2
  120.                          jl   invalid_size
  121.                          cmp  ax, 20
  122.                          jg   invalid_size
  123.                          mov  array_size, ax
  124.                          mov  dx, offset newLineMsg
  125.                          mov  ah, 9
  126.                          int  21h
  127.                          jmp  input_start
  128.  
  129.     invalid_size:        
  130.                          mov  dx, offset invalidInputMsg
  131.                          mov  ah, 9
  132.                          int  21h
  133.                          jmp  input_size
  134.  
  135.     input_start:        
  136.                          xor  cx, cx
  137.  
  138.     input_elements:      
  139.                          cmp  cx, array_size
  140.                          jae  input_done
  141.                          push cx
  142.  
  143.     element_input:      
  144.                          mov  dx, offset enterElementMsg
  145.                          mov  ah, 9
  146.                          int  21h
  147.                          mov  ax, cx
  148.                          inc  ax
  149.                          call displayNumber
  150.                          mov  dx, offset colonMsg
  151.                          mov  ah, 9
  152.                          int  21h
  153.  
  154.                          call readNumber
  155.                          cmp  dx, 1                         ; Перевірка на помилку (DX=1)
  156.                          je   range_error
  157.  
  158.                          pop  cx
  159.                          mov  si, cx
  160.                          add  si, si
  161.                          mov  [array + si], ax
  162.                          inc  cx
  163.                          jmp  input_elements
  164.  
  165.     range_error:        
  166.                          mov  dx, offset rangeErrorMsg
  167.                          mov  ah, 9
  168.                          int  21h
  169.                          pop  cx
  170.                          jmp  input_elements
  171.  
  172.     input_done:          
  173.                          pop  si
  174.                          pop  dx
  175.                          pop  cx
  176.                          pop  bx
  177.                          pop  ax
  178.                          ret
  179. inputArray endp
  180.  
  181. copyArray proc
  182.                          push cx
  183.                          push si
  184.                          mov  cx, array_size
  185.                          test cx, cx
  186.                          jz   copy_done
  187.                          xor  si, si
  188.  
  189.     copy_loop:          
  190.                          mov  ax, [array + si]
  191.                          mov  [sorted_array + si], ax
  192.                          add  si, 2
  193.                          loop copy_loop
  194.  
  195.     copy_done:          
  196.                          pop  si
  197.                          pop  cx
  198.                          ret
  199. copyArray endp
  200.  
  201. calculateSum proc
  202.                          push bx
  203.                          push cx
  204.                          push dx
  205.                          push si
  206.                          push di
  207.  
  208.                          xor  ax, ax
  209.                          xor  cx, cx
  210.  
  211.     sum_loop:            
  212.                          cmp  cx, array_size
  213.                          jae  sum_done
  214.  
  215.                          mov  si, cx
  216.                          add  si, si
  217.                          mov  bx, [array + si]
  218.                          add  ax, bx
  219.                          jo   overflow_error
  220.  
  221.                          inc  cx
  222.                          jmp  sum_loop
  223.  
  224.     overflow_error:      
  225.                          mov  dx, offset overflowMsg
  226.                          mov  ah, 9
  227.                          int  21h
  228.                          jmp  sum_exit
  229.  
  230.     sum_done:            
  231.                          push ax
  232.                          mov  dx, offset sumMsg
  233.                          mov  ah, 9
  234.                          int  21h
  235.                          pop  ax
  236.                          call displayNumber
  237.  
  238.     sum_exit:            
  239.                          pop  di
  240.                          pop  si
  241.                          pop  dx
  242.                          pop  cx
  243.                          pop  bx
  244.                          ret
  245. calculateSum endp
  246.  
  247. findMaximum proc
  248.                          push bx
  249.                          push cx
  250.                          push dx
  251.                          push si
  252.  
  253.                          cmp  array_size, 0
  254.                          je   max_empty
  255.                          mov  ax, [array]
  256.                          mov  cx, 1
  257.  
  258.     max_loop:            
  259.                          cmp  cx, array_size
  260.                          jae  max_done
  261.                          mov  si, cx
  262.                          add  si, si
  263.                          mov  bx, [array + si]
  264.                          cmp  bx, ax
  265.                          jle  max_not_greater
  266.                          mov  ax, bx
  267.  
  268.     max_not_greater:    
  269.                          inc  cx
  270.                          jmp  max_loop
  271.  
  272.     max_empty:          
  273.                          xor  ax, ax
  274.  
  275.     max_done:            
  276.                          push ax
  277.                          mov  dx, offset maxMsg
  278.                          mov  ah, 9
  279.                          int  21h
  280.                          pop  ax
  281.                          call displayNumber
  282.  
  283.                          pop  si
  284.                          pop  dx
  285.                          pop  cx
  286.                          pop  bx
  287.                          ret
  288. findMaximum endp
  289.  
  290. findMinimum proc
  291.                          push bx
  292.                          push cx
  293.                          push dx
  294.                          push si
  295.  
  296.                          cmp  array_size, 0
  297.                          je   min_empty
  298.                          mov  ax, [array]
  299.                          mov  cx, 1
  300.  
  301.     min_loop:            
  302.                          cmp  cx, array_size
  303.                          jae  min_done
  304.                          mov  si, cx
  305.                          add  si, si
  306.                          mov  bx, [array + si]
  307.                          cmp  bx, ax
  308.                          jge  min_not_less
  309.                          mov  ax, bx
  310.  
  311.     min_not_less:        
  312.                          inc  cx
  313.                          jmp  min_loop
  314.  
  315.     min_empty:          
  316.                          xor  ax, ax
  317.  
  318.     min_done:            
  319.                          push ax
  320.                          mov  dx, offset minMsg
  321.                          mov  ah, 9
  322.                          int  21h
  323.                          pop  ax
  324.                          call displayNumber
  325.  
  326.                          pop  si
  327.                          pop  dx
  328.                          pop  cx
  329.                          pop  bx
  330.                          ret
  331. findMinimum endp
  332.  
  333. sortArray proc
  334.                          push ax
  335.                          push bx
  336.                          push cx
  337.                          push dx
  338.                          push si
  339.                          push di
  340.  
  341.                          cmp  array_size, 1
  342.                          jbe  sort_done
  343.                          mov  cx, array_size
  344.                          dec  cx
  345.  
  346.     outer_loop:          
  347.                          push cx
  348.                          xor  di, di
  349.  
  350.     inner_loop:          
  351.                          mov  si, di
  352.                          inc  si
  353.                          cmp  si, array_size
  354.                          jae  inner_done
  355.  
  356.                          mov  bx, di
  357.                          add  bx, bx
  358.                          mov  ax, [sorted_array + bx]
  359.                          mov  bx, si
  360.                          add  bx, bx
  361.                          mov  dx, [sorted_array + bx]
  362.                          cmp  ax, dx
  363.                          jle  no_swap
  364.  
  365.                          mov  [sorted_array + bx], ax
  366.                          mov  bx, di
  367.                          add  bx, bx
  368.                          mov  [sorted_array + bx], dx
  369.  
  370.     no_swap:            
  371.                          inc  di
  372.                          jmp  inner_loop
  373.  
  374.     inner_done:          
  375.                          pop  cx
  376.                          loop outer_loop
  377.  
  378.     sort_done:          
  379.                          mov  dx, offset sortedMsg
  380.                          mov  ah, 9
  381.                          int  21h
  382.  
  383.                          pop  di
  384.                          pop  si
  385.                          pop  dx
  386.                          pop  cx
  387.                          pop  bx
  388.                          pop  ax
  389.                          ret
  390. sortArray endp
  391.  
  392. displaySortedArray proc
  393.                          push ax
  394.                          push bx
  395.                          push cx
  396.                          push dx
  397.                          push si
  398.  
  399.                          mov  dx, offset arrayMsg
  400.                          mov  ah, 9
  401.                          int  21h
  402.  
  403.                          xor  cx, cx
  404.  
  405.     array_display_loop_2:
  406.                          cmp  cx, array_size
  407.                          jae  display_done
  408.  
  409.                          mov  si, cx
  410.                          add  si, si
  411.                          mov  ax, [sorted_array + si]
  412.                          call displayNumber
  413.  
  414.                          mov  dx, offset spaceMsg
  415.                          mov  ah, 9
  416.                          int  21h
  417.  
  418.                          inc  cx
  419.                          jmp  array_display_loop_2
  420.  
  421.     display_done_2:      
  422.                          mov  dx, offset newLineMsg
  423.                          mov  ah, 9
  424.                          int  21h
  425.  
  426.                          pop  si
  427.                          pop  dx
  428.                          pop  cx
  429.                          pop  bx
  430.                          pop  ax
  431.                          ret
  432. displaySortedArray endp
  433.  
  434. displayArray proc
  435.                          push ax
  436.                          push bx
  437.                          push cx
  438.                          push dx
  439.                          push si
  440.  
  441.                          mov  dx, offset arrayMsg
  442.                          mov  ah, 9
  443.                          int  21h
  444.  
  445.                          xor  cx, cx
  446.  
  447.     array_display_loop:  
  448.                          cmp  cx, array_size
  449.                          jae  display_done
  450.  
  451.                          mov  si, cx
  452.                          add  si, si
  453.                          mov  ax, [array + si]
  454.                          call displayNumber
  455.  
  456.                          mov  dx, offset spaceMsg
  457.                          mov  ah, 9
  458.                          int  21h
  459.  
  460.                          inc  cx
  461.                          jmp  array_display_loop
  462.  
  463.     display_done:        
  464.                          mov  dx, offset newLineMsg
  465.                          mov  ah, 9
  466.                          int  21h
  467.  
  468.                          pop  si
  469.                          pop  dx
  470.                          pop  cx
  471.                          pop  bx
  472.                          pop  ax
  473.                          ret
  474. displayArray endp
  475.  
  476. readNumber proc
  477.                          push bx
  478.                          push cx
  479.  
  480.                          xor  bx, bx
  481.                          xor  cx, cx
  482.                          xor  dx, dx                        ; clear error flag
  483.                          xor  si, si                        ; digit count for backspace handling
  484.                          mov  ah, 1
  485.                          int  21h
  486.  
  487.                          cmp  al, '-'
  488.                          jne  positive_input
  489.                          mov  cx, 1
  490.                          jmp  next_digit
  491.  
  492.     positive_input:      
  493.                          cmp  al, '0'
  494.                          jl   invalid_char
  495.                          cmp  al, '9'
  496.                          jg   invalid_char
  497.                          sub  al, '0'
  498.                          xor  ah, ah
  499.                          mov  bx, ax
  500.  
  501.     next_digit:          
  502.                          mov  ah, 1
  503.                          int  21h
  504.                          cmp  al, 0Dh
  505.                          je   end_input
  506.                          cmp  al, 8
  507.                          jne  .check_digit
  508.                          cmp  si, 0
  509.                          je   next_digit
  510.     ; erase char on screen
  511.                          mov  dl, 8
  512.                          mov  ah, 2
  513.                          int  21h
  514.                          mov  dl, ' '
  515.                          mov  ah, 2
  516.                          int  21h
  517.                          mov  dl, 8
  518.                          mov  ah, 2
  519.                          int  21h
  520.     ; remove last digit from BX
  521.                          mov  ax, bx
  522.                          cwd
  523.                          mov  cx, 10
  524.                          idiv cx
  525.                          mov  bx, ax
  526.                          dec  si
  527.                          jmp  next_digit
  528.  
  529. .check_digit:
  530.                          cmp  al, '0'
  531.                          jl   invalid_char
  532.                          cmp  al, '9'
  533.                          jg   invalid_char
  534.                          sub  al, '0'
  535.                          xor  ah, ah
  536.                          push ax
  537.                          mov  ax, 10
  538.                          mul  bx
  539.                          jo   overflow_read
  540.                          mov  bx, ax
  541.                          pop  ax
  542.                          add  bx, ax
  543.                          jo   overflow_read
  544.                          inc  si                            ; count this digit
  545.                          jmp  next_digit
  546.  
  547.     overflow_read:      
  548.                          jmp  invalid_char
  549.     invalid_char:        
  550.                          mov  dx, 1
  551.                          xor  bx, bx
  552.                          mov  cx, 0
  553.     flush_input:        
  554.                          mov  ah, 1
  555.                          int  21h
  556.                          cmp  al, 0Dh
  557.                          jne  flush_input
  558.                          jmp  end_input
  559.  
  560.     end_input:          
  561.                          cmp  cx, 1
  562.                          jne  check_positive
  563.  
  564.                          cmp  bx, 32768
  565.                          ja   range_error_read
  566.                          neg  bx
  567.                          mov  ax, bx
  568.                          jmp  exit_read
  569.  
  570.     check_positive:      
  571.  
  572.                          cmp  bx, 32767
  573.                          ja   range_error_read
  574.                          mov  ax, bx
  575.                          jmp  exit_read
  576.  
  577.     range_error_read:    
  578.                          mov  dx, offset rangeErrorMsg
  579.                          mov  ah, 9
  580.                          int  21h
  581.                          mov  dx, 1
  582.                          xor  ax, ax
  583.  
  584.     exit_read:          
  585.                          pop  cx
  586.                          pop  bx
  587.                          ret
  588. readNumber endp
  589.  
  590. displayNumber proc
  591.                          push ax
  592.                          push bx
  593.                          push cx
  594.                          push dx
  595.  
  596.                          test ax, ax
  597.                          jns  positive_num
  598.                          push ax
  599.                          mov  dl, '-'
  600.                          mov  ah, 2
  601.                          int  21h
  602.                          pop  ax
  603.                          neg  ax
  604.  
  605.     positive_num:        
  606.                          xor  cx, cx
  607.                          mov  bx, 10
  608.  
  609.     convert_loop:        
  610.                          xor  dx, dx
  611.                          div  bx
  612.                          push dx
  613.                          inc  cx
  614.                          test ax, ax
  615.                          jnz  convert_loop
  616.  
  617.     display_loop:        
  618.                          pop  dx
  619.                          add  dl, '0'
  620.                          mov  ah, 2
  621.                          int  21h
  622.                          loop display_loop
  623.  
  624.                          pop  dx
  625.                          pop  cx
  626.                          pop  bx
  627.                          pop  ax
  628.                          ret
  629. displayNumber endp
  630.  
  631. end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement