Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- STSEG SEGMENT PARA STACK "STACK"
- DB 128 DUP ("STACK")
- STSEG ENDS
- DATA SEGMENT
- YY dw 1 dup('&'),'$'
- TT dw 1 dup('&'),'$'
- BUFFER DB 7, '?', 6 DUP('?'), '$'
- ERROR DB 'ERROR$'
- ERROR1 DB 'ERROR CMP 0$'
- HELLO1 DB 'ENTER NUMBER Y (-32768...32767): $'
- HELLO2 DB 'ENTER NUMBER T (-32768...32767): $'
- HELLO3 DB 'ENTER NUMBER X (-32768...32767): $'
- ERROR11 DB 'ERROR 0 SYMBOLS$'
- ERROR2 DB 'ERROR CMP 9$'
- ERROR3 DB 'ERROR MULL$'
- ERROR4 DB 'ERROR ADD$'
- ERROR5 DB 'ERROR 8000H$'
- ERROR6 DB 'ERROR CMP 32767$'
- ERROR12345 DB 'ERROR FINAL$'
- MESSAGE2 DB 'PRESS TO SHOW NUMBER..', 0DH, 0AH, '$'
- DATA ENDS
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA, SS: STSEG
- ORG 100H
- START:
- PUSH DS;
- XOR AX,AX;
- PUSH AX;
- MOV AX,DATA
- MOV DS,AX
- LEA DX,HELLO1
- MOV AH, 9
- INT 21H
- CALL GET_INTEGER
- CMP DI,2
- JZ ER
- mov YY, ax
- LEA DX,HELLO2
- MOV AH, 9
- INT 21H
- CALL GET_INTEGER
- CMP DI,2
- JZ ER
- mov TT, ax
- LEA DX,HELLO3
- MOV AH, 9
- INT 21H
- CALL GET_INTEGER
- CMP DI,2
- JZ ER
- PUSH AX
- lea DX, MESSAGE2
- MOV AH, 9
- INT 21H
- MOV AH, 10H
- INT 16H
- POP AX
- CALL FUN_CALC
- MOV AH, 10H
- INT 16H
- MOV AH, 4CH
- INT 21H
- ER:
- MOV AH, 10H
- INT 16H
- MOV AH, 4CH
- INT 21H
- ERG12341:
- MOV DX, OFFSET ERROR12345
- MOV AH,09
- INT 21H
- RET
- FUN_CALC PROC
- mov cx, YY ;перемещаем в СХ значение у
- mov bx, TT ;перемещаем в BX значение Т
- cmp ax, cx ;сравниваем x, y
- jle case_2 ;если меньше или равно - это точно второй случай
- cmp bx, cx ;сравниваем y, t
- jne case_1 ;если не равны - первый случай
- jmp case_3 ;иначе третий случай
- case_1: ;(5x-y^2)/(7(t-y)) - первый
- xor dx, dx
- push ax
- mov ax, YY
- mul ax
- mov cx, ax
- pop ax
- mov bx, 5
- mul bx
- sub ax, cx
- push ax
- mov cx, TT
- mov dx, YY
- sub cx, dx
- mov ax, cx
- mov bx, 7
- mul bx
- mov bx, ax
- pop ax
- xor dx, dx
- jmp rzero
- case_2: ;(13x+7y+5t) - второй случай
- mov bx, 13
- mul bx
- push ax
- mov ax, YY
- mov bx, 7
- mul bx
- push ax
- mov ax, TT
- mov bx, 5
- mul bx
- pop bx
- add ax, bx
- pop bx
- add ax, bx
- ;делить ничего не надо, так что просто печатаем и выходим из процедуры
- call Print_integer
- ret
- case_3: ;2xy - третий случай
- cwd
- mov bx, YY
- imul bx
- add ax, ax
- call Print_integer
- ret
- rzero:
- cwd ;расширяем ах до 4 байт (dx:ax)
- idiv bx
- cmp dx, 0
- jne print_and_continue
- call Print_integer
- ret
- print_and_continue:
- push dx
- or dx, dx ;чекаем знак остатка после деления
- pop dx
- PUSH DX
- PUSH BX
- push ax
- jns print_value ;если знак плюс - тогда просто печатаем частное
- cmp ax, 0
- jne print_value ;если знак минус - то печатает дополнительный минус перед частным
- print_minus_value:
- MOV AH, 02H
- MOV DL, '-' ; печатаем минус
- INT 21H
- print_value:
- pop ax
- call Print_integer
- MOV AH, 02H
- MOV DL, 46 ; печатаем точку
- INT 21H
- POP BX
- POP DX
- MOV CX, 3
- divI:
- mov ax,dx
- push ax
- or ax, ax ;чекаем знак остатка. Если минус - меняем знак
- ;поскольку минус уже напечатан вначале
- pop ax
- jns dont_neg
- neg ax
- dont_neg:
- mov di, 10
- mul di
- div bx
- cmp dx, 0
- jne lp_print_and_continue
- CALL PRINT_INTEGER
- ret
- lp_print_and_continue:
- PUSH DX
- PUSH CX
- PUSH BX
- CALL PRINT_INTEGER
- POP BX
- POP CX
- POP DX
- LOOP DIVI
- RET
- FUN_CALC ENDP
- GET_INTEGER PROC
- MOV AH,0AH ;???? ??????
- XOR DI,DI
- MOV DX,OFFSET BUFFER
- INT 21H
- MOV DL,0AH ;???????????? ?????? ??????
- MOV AH,02 ;????? ?? ?????
- INT 21H
- MOV SI, OFFSET BUFFER+1
- CMP BYTE PTR [SI], 0
- JZ ERG11
- MOV SI, OFFSET BUFFER+1
- CMP BYTE PTR [SI], 1
- JNZ CON
- MOV SI,OFFSET BUFFER+2
- MOV CL,[SI]
- CMP CL,'0'
- JZ CON
- JL ERG1
- CON:
- MOV SI,OFFSET BUFFER+2
- CMP BYTE PTR [SI],"+"
- JZ P1
- CMP BYTE PTR [SI],"-"
- JNZ P2
- MOV DI,1
- P1:
- INC SI
- P2:
- XOR AX,AX
- MOV BX,10
- P3:
- MOV CL,[SI]
- CMP CL,0DH
- JZ ENDIN
- CMP CL,'0'
- JL ERG1
- CMP CL,'9'
- JA ERG2
- SUB CL,'0'
- MUL BX
- JC ERG3
- ADD AX,CX
- JC ERG4
- CMP AX, -32768
- JA ERG5
- CMP DI, 1
- JE CONT
- CMP AX, 32767
- JA ERG
- CONT:
- INC SI
- JMP P3
- ERG:
- MOV DX, OFFSET ERROR6
- MOV AH,09
- INT 21H
- MOV DI,2
- RET
- ERG1:
- MOV DX, OFFSET ERROR1
- MOV AH,09
- INT 21H
- MOV DI,2
- RET
- ERG11:
- MOV DX, OFFSET ERROR11
- MOV AH,09
- INT 21H
- MOV DI,2
- RET
- ERG2:
- MOV DX, OFFSET ERROR2
- MOV AH,09
- INT 21H
- MOV DI,2
- RET
- ERG3:
- MOV DX, OFFSET ERROR3
- MOV AH,09
- INT 21H
- MOV DI,2
- RET
- ERG4:
- MOV DX, OFFSET ERROR4
- MOV AH,09
- INT 21H
- MOV DI,2
- RET
- ERG5:
- MOV DX, OFFSET ERROR5
- MOV AH,09
- INT 21H
- MOV DI,2
- RET
- ENDIN:
- CMP DI,1
- JZ P4
- ret
- P4:
- NEG AX
- RET
- GET_INTEGER ENDP
- PRINT_INTEGER PROC
- MOV BX, AX
- OR BX, BX
- JNS ML
- MOV AL, '-'
- INT 29H
- NEG BX
- ML:
- MOV AX,BX
- XOR CX,CX
- MOV BX,10
- M2:
- XOR DX,DX
- DIV BX
- ADD DL,'0'
- PUSH DX
- INC CX
- TEST AX,AX
- JNZ M2
- M3:
- POP AX
- INT 29H
- LOOP M3
- RET
- PRINT_INTEGER ENDP
- CODE ENDS
- END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement