Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .stack 100h
- .data
- welcomeMsg db 'Program for array operations (up to 20 elements)', 0Dh, 0Ah, '$'
- enterSizeMsg db 'Enter array size (2-20): $'
- enterElementMsg db 'Enter element $'
- colonMsg db ': $'
- newLineMsg db 0Dh, 0Ah, '$'
- menuMsg db 0Dh, 0Ah, 'Menu:', 0Dh, 0Ah
- db '1. Sum of array elements', 0Dh, 0Ah
- db '2. Find maximum element', 0Dh, 0Ah
- db '3. Find minimum element', 0Dh, 0Ah
- db '4. Sort array', 0Dh, 0Ah
- db '5. Display array', 0Dh, 0Ah
- db '6. Input new array', 0Dh, 0Ah
- db '0. Exit', 0Dh, 0Ah
- db 'Enter your choice: $'
- sumMsg db 0Dh, 0Ah, 'Sum of array elements: $'
- maxMsg db 0Dh, 0Ah, 'Maximum element: $'
- minMsg db 0Dh, 0Ah, 'Minimum element: $'
- sortedMsg db 0Dh, 0Ah, 'Array has been sorted:', 0Dh, 0Ah, '$'
- arrayMsg db 0Dh, 0Ah, 'Current array: $'
- invalidInputMsg db 0Dh, 0Ah, 'Invalid input! Try again.', 0Dh, 0Ah, '$'
- overflowMsg db 0Dh, 0Ah, 'Overflow error! Sum exceeds 16-bit range.', 0Dh, 0Ah, '$'
- rangeErrorMsg db 0Dh, 0Ah, 'Value out of range (-32767..32767)! Try again.', 0Dh, 0Ah, '$'
- spaceMsg db ' $'
- array dw 20 dup(?)
- sorted_array dw 20 dup(?)
- array_size dw ?
- .code
- main proc
- mov ax, @data
- mov ds, ax
- mov es, ax
- mov dx, offset welcomeMsg
- mov ah, 9
- int 21h
- call inputArray
- main_loop:
- mov dx, offset menuMsg
- mov ah, 9
- int 21h
- call readNumber
- mov bl, al
- mov dx, offset newLineMsg
- mov ah, 9
- int 21h
- cmp bl, 0
- je exit_program
- cmp bl, 1
- je sum_array
- cmp bl, 2
- je find_max
- cmp bl, 3
- je find_min
- cmp bl, 4
- je sort_array
- cmp bl, 5
- je display_array
- cmp bl, 6
- je input_new_array
- mov dx, offset invalidInputMsg
- mov ah, 9
- int 21h
- jmp main_loop
- sum_array:
- call calculateSum
- jmp main_loop
- find_max:
- call findMaximum
- jmp main_loop
- find_min:
- call findMinimum
- jmp main_loop
- sort_array:
- call copyArray ; Копіюємо основний масив у sorted_array
- call sortArray ; Сортуємо копію
- call displaySortedArray ; Виводимо відсортовану копію
- jmp main_loop
- display_array:
- call displayArray
- jmp main_loop
- input_new_array:
- call inputArray
- jmp main_loop
- exit_program:
- mov ah, 4Ch
- int 21h
- main endp
- inputArray proc
- push ax
- push bx
- push cx
- push dx
- push si
- input_size:
- mov dx, offset enterSizeMsg
- mov ah, 9
- int 21h
- call readNumber
- cmp ax, 2
- jl invalid_size
- cmp ax, 20
- jg invalid_size
- mov array_size, ax
- mov dx, offset newLineMsg
- mov ah, 9
- int 21h
- jmp input_start
- invalid_size:
- mov dx, offset invalidInputMsg
- mov ah, 9
- int 21h
- jmp input_size
- input_start:
- xor cx, cx
- input_elements:
- cmp cx, array_size
- jae input_done
- push cx
- element_input:
- mov dx, offset enterElementMsg
- mov ah, 9
- int 21h
- mov ax, cx
- inc ax
- call displayNumber
- mov dx, offset colonMsg
- mov ah, 9
- int 21h
- call readNumber
- cmp dx, 1 ; Перевірка на помилку (DX=1)
- je range_error
- pop cx
- mov si, cx
- add si, si
- mov [array + si], ax
- inc cx
- jmp input_elements
- range_error:
- mov dx, offset rangeErrorMsg
- mov ah, 9
- int 21h
- pop cx
- jmp input_elements
- input_done:
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- inputArray endp
- copyArray proc
- push cx
- push si
- mov cx, array_size
- test cx, cx
- jz copy_done
- xor si, si
- copy_loop:
- mov ax, [array + si]
- mov [sorted_array + si], ax
- add si, 2
- loop copy_loop
- copy_done:
- pop si
- pop cx
- ret
- copyArray endp
- calculateSum proc
- push bx
- push cx
- push dx
- push si
- push di
- xor ax, ax
- xor cx, cx
- sum_loop:
- cmp cx, array_size
- jae sum_done
- mov si, cx
- add si, si
- mov bx, [array + si]
- add ax, bx
- jo overflow_error
- inc cx
- jmp sum_loop
- overflow_error:
- mov dx, offset overflowMsg
- mov ah, 9
- int 21h
- jmp sum_exit
- sum_done:
- push ax
- mov dx, offset sumMsg
- mov ah, 9
- int 21h
- pop ax
- call displayNumber
- sum_exit:
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- ret
- calculateSum endp
- findMaximum proc
- push bx
- push cx
- push dx
- push si
- cmp array_size, 0
- je max_empty
- mov ax, [array]
- mov cx, 1
- max_loop:
- cmp cx, array_size
- jae max_done
- mov si, cx
- add si, si
- mov bx, [array + si]
- cmp bx, ax
- jle max_not_greater
- mov ax, bx
- max_not_greater:
- inc cx
- jmp max_loop
- max_empty:
- xor ax, ax
- max_done:
- push ax
- mov dx, offset maxMsg
- mov ah, 9
- int 21h
- pop ax
- call displayNumber
- pop si
- pop dx
- pop cx
- pop bx
- ret
- findMaximum endp
- findMinimum proc
- push bx
- push cx
- push dx
- push si
- cmp array_size, 0
- je min_empty
- mov ax, [array]
- mov cx, 1
- min_loop:
- cmp cx, array_size
- jae min_done
- mov si, cx
- add si, si
- mov bx, [array + si]
- cmp bx, ax
- jge min_not_less
- mov ax, bx
- min_not_less:
- inc cx
- jmp min_loop
- min_empty:
- xor ax, ax
- min_done:
- push ax
- mov dx, offset minMsg
- mov ah, 9
- int 21h
- pop ax
- call displayNumber
- pop si
- pop dx
- pop cx
- pop bx
- ret
- findMinimum endp
- sortArray proc
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- cmp array_size, 1
- jbe sort_done
- mov cx, array_size
- dec cx
- outer_loop:
- push cx
- xor di, di
- inner_loop:
- mov si, di
- inc si
- cmp si, array_size
- jae inner_done
- mov bx, di
- add bx, bx
- mov ax, [sorted_array + bx]
- mov bx, si
- add bx, bx
- mov dx, [sorted_array + bx]
- cmp ax, dx
- jle no_swap
- mov [sorted_array + bx], ax
- mov bx, di
- add bx, bx
- mov [sorted_array + bx], dx
- no_swap:
- inc di
- jmp inner_loop
- inner_done:
- pop cx
- loop outer_loop
- sort_done:
- mov dx, offset sortedMsg
- mov ah, 9
- int 21h
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- sortArray endp
- displaySortedArray proc
- push ax
- push bx
- push cx
- push dx
- push si
- mov dx, offset arrayMsg
- mov ah, 9
- int 21h
- xor cx, cx
- array_display_loop_2:
- cmp cx, array_size
- jae display_done
- mov si, cx
- add si, si
- mov ax, [sorted_array + si]
- call displayNumber
- mov dx, offset spaceMsg
- mov ah, 9
- int 21h
- inc cx
- jmp array_display_loop_2
- display_done_2:
- mov dx, offset newLineMsg
- mov ah, 9
- int 21h
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- displaySortedArray endp
- displayArray proc
- push ax
- push bx
- push cx
- push dx
- push si
- mov dx, offset arrayMsg
- mov ah, 9
- int 21h
- xor cx, cx
- array_display_loop:
- cmp cx, array_size
- jae display_done
- mov si, cx
- add si, si
- mov ax, [array + si]
- call displayNumber
- mov dx, offset spaceMsg
- mov ah, 9
- int 21h
- inc cx
- jmp array_display_loop
- display_done:
- mov dx, offset newLineMsg
- mov ah, 9
- int 21h
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- displayArray endp
- readNumber proc
- push bx
- push cx
- xor bx, bx
- xor cx, cx
- xor dx, dx ; clear error flag
- xor si, si ; digit count for backspace handling
- mov ah, 1
- int 21h
- cmp al, '-'
- jne positive_input
- mov cx, 1
- jmp next_digit
- positive_input:
- cmp al, '0'
- jl invalid_char
- cmp al, '9'
- jg invalid_char
- sub al, '0'
- xor ah, ah
- mov bx, ax
- next_digit:
- mov ah, 1
- int 21h
- cmp al, 0Dh
- je end_input
- cmp al, 8
- jne .check_digit
- cmp si, 0
- je next_digit
- ; erase char on screen
- mov dl, 8
- mov ah, 2
- int 21h
- mov dl, ' '
- mov ah, 2
- int 21h
- mov dl, 8
- mov ah, 2
- int 21h
- ; remove last digit from BX
- mov ax, bx
- cwd
- mov cx, 10
- idiv cx
- mov bx, ax
- dec si
- jmp next_digit
- .check_digit:
- cmp al, '0'
- jl invalid_char
- cmp al, '9'
- jg invalid_char
- sub al, '0'
- xor ah, ah
- push ax
- mov ax, 10
- mul bx
- jo overflow_read
- mov bx, ax
- pop ax
- add bx, ax
- jo overflow_read
- inc si ; count this digit
- jmp next_digit
- overflow_read:
- jmp invalid_char
- invalid_char:
- mov dx, 1
- xor bx, bx
- mov cx, 0
- flush_input:
- mov ah, 1
- int 21h
- cmp al, 0Dh
- jne flush_input
- jmp end_input
- end_input:
- cmp cx, 1
- jne check_positive
- cmp bx, 32768
- ja range_error_read
- neg bx
- mov ax, bx
- jmp exit_read
- check_positive:
- cmp bx, 32767
- ja range_error_read
- mov ax, bx
- jmp exit_read
- range_error_read:
- mov dx, offset rangeErrorMsg
- mov ah, 9
- int 21h
- mov dx, 1
- xor ax, ax
- exit_read:
- pop cx
- pop bx
- ret
- readNumber endp
- displayNumber proc
- push ax
- push bx
- push cx
- push dx
- test ax, ax
- jns positive_num
- push ax
- mov dl, '-'
- mov ah, 2
- int 21h
- pop ax
- neg ax
- positive_num:
- xor cx, cx
- mov bx, 10
- convert_loop:
- xor dx, dx
- div bx
- push dx
- inc cx
- test ax, ax
- jnz convert_loop
- display_loop:
- pop dx
- add dl, '0'
- mov ah, 2
- int 21h
- loop display_loop
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- displayNumber endp
- end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement