Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .stack 200h
- .data
- enterNstr db 'Enter N:', 0Dh, 0Ah, '$'
- enterMstr db 0Dh, 0Ah, 'Enter M:', 0Dh, 0Ah, '$'
- enterAstr db 0Dh, 0Ah, 'Enter A:', 0Dh, 0Ah, '$'
- N dw 0
- M dw 0
- A dw 0
- array dw 1000 dup (0)
- inputmatrix db 0Dh, 0Ah, 'Enter matrix element:', 0Dh, 0Ah, '$'
- originalmatrix db 0Dh, 0Ah, 'Original matrix:', 0Dh, 0Ah, '$'
- resultmatrix db 0Dh, 0Ah, 'Result matrix:', 0Dh, 0Ah, '$'
- errorstr db 0Dh, 0Ah, "Incorrect input!", 0Dh, 0Ah, '$'
- errordimstr db 0Dh, 0Ah, "Incorrect dimension!", 0Dh, 0Ah, '$'
- .code
- ; -----------------------------------------------
- ; начало проги, тут все понятно
- start:
- mov ax, @data
- mov ds, ax
- mov es, ax
- call Main
- mov ah, 01h
- int 21h
- mov ah, 4Ch
- int 21h
- ; -----------------------------------------------------------------------------
- ; читаем введенные символы
- Read proc
- push dx
- push bx
- push cx
- mov ah, 09h
- int 21h
- startin:
- mov cx, 0
- mov bx, 0
- startloop:
- mov ah, 01h ; читаем очередной символ
- int 21h
- cmp al, 13
- jnz checkdel ; если не ентер, проверяем , не нажали ли бэкспэйс
- jmp returnvalue ; закончили ввод - нажали ентер
- checkdel:
- ; комменты к обработке бэкспэйса есть в 4 лабе
- cmp al, 8
- jnz checksymbol
- mov dl, ' '
- mov ah, 02h
- int 21h
- cmp cl, 0
- jz startloop
- dec cl
- mov dl, 8
- mov ah, 02h
- int 21h
- cmp cl, 0
- jz startin
- mov ax, bx
- cwd
- mov bx, 10
- idiv bx
- mov bx, ax
- jmp startloop
- checksymbol:
- ; проверяем введенный символ
- cmp al, '-' ; смотрим, не минус ли мы ввели
- jnz checkvalue
- cmp cl, 0 ; если минус, смотрим, а не только ли минус мы ввели
- jnz errormessage ; если да, то ацтой
- mov ch, 1
- inc cl
- jmp startloop
- checkvalue:
- ; проверяем, является ли введенный символ числом
- cmp al, '0'
- jl errormessage
- cmp al, '9'
- jg errormessage
- setvalue:
- ; получаем само число из символа: типа символы '9' - '0' = 9 - типа число, например
- inc cl
- sub al, '0'
- mov ah, 0
- cmp bx, 0
- jnz addvalue
- mov bx, ax
- cmp ch, 0
- jz startloop
- neg bx
- jmp startloop
- addvalue:
- push ax
- mov ax, bx
- xor dx, dx
- mov bx, 10
- imul bx
- mov bx, ax
- pop ax
- cmp ch, 0
- jz checkres
- sub bx, ax
- sbb dx, 0
- cmp dx, 0FFFFh
- jnz toerror
- test bx, 8000h
- jz toerror
- jmp startloop
- checkres:
- add bx, ax
- adc dx, 0
- cmp dx, 0000h
- jnz toerror
- test bx, 8000h
- jnz toerror
- jmp startloop
- toerror:
- jmp errormessage
- returnvalue:
- mov ax, bx ; введенное число типа в ах должно лежать
- cmp cl, 0
- jz toerror
- cmp bx, 0
- jnz restreg
- cmp ch, 0
- jnz toerror
- restreg:
- pop cx
- pop bx
- pop dx
- ret
- Read endp
- ; -----------------------------------------------
- errormessage:
- mov dx, offset errorstr
- mov ah, 09h
- int 21h
- mov ah, 01h
- int 21h
- mov ah, 4Ch
- int 21h
- ; -----------------------------------------------
- ; вывод такой же как и в прошлых лабах
- Write proc
- push ax
- push bx
- push cx
- push dx
- mov cx, 0
- test ax, 8000h
- jz Positive
- push ax
- mov dl, '-'
- mov ah, 02h
- int 21h
- pop ax
- neg ax
- Positive:
- loop1:
- mov dx, 0
- mov bx, 10
- div bx
- push dx
- inc cx
- cmp ax, 0
- jnz loop1
- loop2:
- pop dx
- add dl, '0'
- mov ah, 02h
- int 21h
- dec cx
- jnz loop2
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- Write endp
- ; -----------------------------------------------
- ; вводим элементы матрицы
- EnterMatrix proc
- push ax
- push cx
- push dx
- push di
- mov dx, offset inputmatrix
- mov di, offset array
- mov cx, M
- ; тут типа цикл по столбцам и строкам
- rows:
- push cx
- mov cx, N
- columns:
- call Read
- stosw
- loop columns
- pop cx
- loop rows
- mov dx, offset originalmatrix
- mov ah, 09h
- int 21h
- call ShowMatrix ; рисуем матрицу красиво так
- pop di
- pop dx
- pop cx
- pop ax
- ret
- EnterMatrix endp
- ; -----------------------------------------------
- ; прост вывод элементов матрицы в виде матрицы на экран
- ShowMatrix proc
- push ax
- push cx
- push si
- mov si, offset array
- mov cx, M
- external:
- push cx
- mov cx, N
- internal:
- lodsw
- call Write
- mov dl, ' '
- mov ah, 02h
- int 21h
- loop internal
- mov dl, 0Dh
- mov ah, 02h
- int 21h
- mov dl, 0Ah
- mov ah, 02h
- int 21h
- pop cx
- loop external
- pop si
- pop cx
- pop ax
- ret
- ShowMatrix endp
- ; -----------------------------------------------
- ; тут кароче бегаем по матрице и сравниваем каждый элемент с введенным числом А, и если элемент матрицы мень чем А, то мы его зануляем
- Task proc
- push ax
- push bx
- push cx
- push si
- push di
- xor ax, ax
- mov si, offset array
- mov di, offset array
- mov bx, 0
- mov cx, M
- outcycle:
- push cx
- mov cx, N
- incycle:
- lodsw ; типа читаем
- cmp ax, A ; типа чекаем
- jle svcycle
- mov ax, 0
- svcycle:
- stosw ; типа записываем ноль если че
- loop incycle
- pop cx
- loop outcycle
- pop di
- pop si
- pop cx
- pop bx
- pop ax
- ret
- Task endp
- ; -----------------------------------------------
- Main proc
- push ax
- push bx
- push dx
- ; читаем N
- mov dx, offset enterNstr
- call Read
- mov N, ax
- ; читаем M
- mov dx, offset enterMstr
- call Read
- mov M, ax
- mul N ; M x N
- cmp dx, 0 ; если в dx что-то есть, то значит размер слишком большой
- jnz dimensionerror
- cmp ax, 0 ; если M x N = 0, то значит тоже неправильная размерность
- jz dimensionerror
- cmp ax, 1000 ; тоже слишком много
- ja dimensionerror
- startenter:
- call EnterMatrix ; вводим матрицу
- mov dx, offset enterAstr
- ;mov ah, 09h
- ;int 21h
- call Read
- mov A, ax
- call Task
- mov dx, offset resultmatrix
- mov ah, 09h
- int 21h
- call ShowMatrix
- pop dx
- pop bx
- pop ax
- ret
- Main endp
- ; -----------------------------------------------
- dimensionerror:
- mov dx, offset errordimstr
- mov ah, 09h
- int 21h
- mov ah, 01h
- int 21h
- mov ah, 4Ch
- int 21h
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement