Advertisement
Guest User

Untitled

a guest
Dec 20th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. STSEG SEGMENT PARA STACK "STACK"
  2. DB 128 DUP ("STACK")
  3. STSEG ENDS
  4.  
  5. DATA SEGMENT
  6.     YY dw 1 dup('&'),'$'
  7.     TT dw 1 dup('&'),'$'
  8.     BUFFER DB 7, '?', 6 DUP('?'), '$'
  9.     ERROR DB 'ERROR$'
  10.     ERROR1 DB 'ERROR CMP 0$'
  11.     HELLO1 DB 'ENTER NUMBER Y (-32768...32767): $'
  12.     HELLO2 DB 'ENTER NUMBER T (-32768...32767): $'
  13.     HELLO3 DB 'ENTER NUMBER X (-32768...32767): $'
  14.     ERROR11 DB 'ERROR 0 SYMBOLS$'
  15.     ERROR2 DB 'ERROR CMP 9$'
  16.     ERROR3 DB 'ERROR MULL$'
  17.     ERROR4 DB 'ERROR ADD$'
  18.     ERROR5 DB 'ERROR 8000H$'
  19.     ERROR6 DB 'ERROR CMP 32767$'
  20.     ERROR12345 DB 'ERROR FINAL$'
  21.    
  22.     MESSAGE2 DB 'PRESS TO SHOW NUMBER..', 0DH, 0AH, '$'
  23. DATA ENDS
  24. CODE SEGMENT
  25.     ASSUME CS:CODE, DS:DATA, SS: STSEG
  26.     ORG 100H
  27.     START:
  28.     PUSH DS;
  29.     XOR AX,AX;
  30.     PUSH AX;
  31.     MOV AX,DATA
  32.     MOV DS,AX
  33.    
  34.     LEA DX,HELLO1
  35.     MOV AH, 9
  36.     INT 21H
  37.    
  38.  
  39.     CALL GET_INTEGER
  40.     CMP DI,2
  41.     JZ ER
  42.     mov YY, ax
  43.  
  44.     LEA DX,HELLO2
  45.     MOV AH, 9
  46.     INT 21H
  47.  
  48.     CALL GET_INTEGER
  49.     CMP DI,2
  50.     JZ ER
  51.     mov TT, ax
  52.  
  53.     LEA DX,HELLO3
  54.     MOV AH, 9
  55.     INT 21H
  56.  
  57.     CALL GET_INTEGER
  58.     CMP DI,2
  59.     JZ ER
  60.    
  61.     PUSH AX
  62.     lea DX, MESSAGE2
  63.     MOV AH, 9
  64.     INT 21H
  65.     MOV AH, 10H
  66.     INT 16H
  67.     POP AX
  68.  
  69.     CALL FUN_CALC
  70.    
  71.  
  72.     MOV AH, 10H
  73.     INT 16H
  74.     MOV AH, 4CH
  75.     INT 21H
  76.    
  77.     ER:
  78.     MOV AH, 10H
  79.     INT 16H
  80.     MOV AH, 4CH
  81.     INT 21H
  82.         ERG12341:
  83.     MOV DX, OFFSET ERROR12345
  84.     MOV AH,09
  85.     INT 21H
  86.     RET
  87.  
  88. FUN_CALC PROC
  89.  
  90.     mov cx, YY  ;перемещаем в СХ значение у
  91.     mov bx, TT  ;перемещаем в BX значение Т
  92.    
  93.     cmp ax, cx  ;сравниваем x, y
  94.     cmp bx, cx  ;сравниваем y, t
  95.     jne case_1  ;если не равны - то это первый случай
  96.     cmp ax, cx  ;сравниваем x, y
  97.     jle case_2  ;если меньше или равно - второй случай
  98.     jmp case_3  ;иначе это третий случай
  99.  
  100.     case_1: ;(5x-y^2)/(7(t-y)) - первый случай
  101.    
  102.     ;этот блок считает выражение в числителе
  103.     xor dx, dx
  104.     push ax
  105.     mov ax, YY
  106.     mul ax
  107.     mov cx, ax
  108.     pop ax
  109.     mov bx, 5
  110.     mul bx
  111.     sub ax, cx
  112.     push ax
  113.    
  114.     ;этот блок считает выражение в знаменателе
  115.     mov cx, TT
  116.     mov dx, YY
  117.     sub cx, dx
  118.     mov ax, cx
  119.     mov bx, 7
  120.     mul bx
  121.     mov bx, ax
  122.     pop ax
  123.    
  124.     xor dx, dx
  125.    
  126.     ;к этому моменту у нас в bx находится делитель, в ax - делимое
  127.     ;прыгаем к метке, которая найдет часное.
  128.     jmp rzero
  129.    
  130.    
  131.     case_2: ;(13x+7y+5t) - второй случай
  132.    
  133.     ;этот блок считает выражение
  134.     mov bx, 13
  135.     mul bx
  136.     push ax
  137.     mov ax, YY
  138.     mov bx, 7
  139.     mul bx
  140.     push ax
  141.     mov ax, TT
  142.     mov bx, 5
  143.     mul bx
  144.     pop bx
  145.     add ax, bx
  146.     pop bx
  147.     add ax, bx
  148.    
  149.     ;в этом случае нам делить ничего не нужно, поэтому просто выводим
  150.     ;число и выходим из процедуры
  151.     call Print_integer
  152.     ret
  153.    
  154.     case_3: ;2xy - третий случай
  155.    
  156.     ;этот блок считает выражение
  157.     cwd
  158.     mov bx, YY
  159.     imul bx
  160.     add ax, ax
  161.    
  162.     ;в этом случае нам делить ничего не нужно, поэтому просто выводим
  163.     ;число и выходим из процедуры
  164.     call Print_integer
  165.     ret
  166.  
  167.     rzero:
  168.     cwd ;расширяем число в ax до четырех байт. Теперь оно находится в двух
  169.         ;регистрах dx:ax
  170.     idiv bx ;деление с учетом знака. Остаток записывается в dx
  171.     cmp dx, 0   ;смотрим на остаток. Если он не ноль - то будем выводить
  172.                 ;числа после запятой
  173.     jne print_and_continue
  174.    
  175.     ;если остаток 0, то выводим результат деления и выходим из процедуры
  176.     call Print_integer
  177.     ret
  178.    
  179.     print_and_continue:
  180.    
  181.     PUSH DX
  182.     PUSH BX
  183.     call Print_integer  ;печатаем целую часть
  184.     MOV AH, 02H
  185.     MOV DL, 46
  186.     INT 21H ;печатаем точку
  187.     POP BX
  188.     POP DX
  189.    
  190.     MOV CX, 3   ;счетчик цикла. Будем выводить до 3 знаков после запятой
  191.     divI:
  192.     mov ax,dx   ;перемещаем в ах остаток от деления
  193.     mov di, 10  ;записываем 10
  194.     mul di      ;умножаем остаток на 10
  195.     div bx      ;делим его на старое делимое, что бы найти первое число
  196.                 ;после запятой
  197.     cmp dx, 0   ;смотрим на новый остаток. Если его нет - то печатаем часное
  198.                 ;и выходим из процедуры
  199.     jne lp_print_and_continue
  200.     CALL PRINT_INTEGER
  201.     ret
  202.     lp_print_and_continue:;иначе продолжим цикл
  203.     PUSH DX
  204.     PUSH CX
  205.     PUSH BX
  206.    
  207.     CALL PRINT_INTEGER  ;выводим часное
  208.    
  209.     POP BX
  210.     POP CX
  211.     POP DX
  212.     LOOP DIVI   ;повторяем процедуру еще 2 раза.
  213.     RET
  214.  
  215.  
  216. FUN_CALC ENDP
  217.  
  218. GET_INTEGER PROC
  219.  
  220.     MOV AH,0AH ;???? ??????
  221.     XOR DI,DI
  222.     MOV DX,OFFSET BUFFER
  223.     INT 21H
  224.     MOV DL,0AH ;???????????? ?????? ??????  
  225.     MOV AH,02 ;????? ?? ?????
  226.     INT 21H
  227.    
  228.     MOV SI, OFFSET BUFFER+1
  229.     CMP BYTE PTR [SI], 0
  230.     JZ ERG11
  231.  
  232.     MOV SI, OFFSET BUFFER+1
  233.     CMP BYTE PTR [SI], 1
  234.     JNZ CON
  235.  
  236.     MOV SI,OFFSET BUFFER+2
  237.     MOV CL,[SI]
  238.     CMP CL,'0'
  239.     JZ CON
  240.     JL ERG1
  241.        
  242.  
  243.     CON:
  244.     MOV SI,OFFSET BUFFER+2
  245.     CMP BYTE PTR [SI],"+"
  246.     JZ P1
  247.     CMP BYTE PTR [SI],"-"
  248.     JNZ P2
  249.     MOV DI,1
  250.     P1:  
  251.     INC SI    
  252.     P2:
  253.     XOR AX,AX
  254.     MOV BX,10  
  255.     P3:
  256.     MOV CL,[SI]
  257.     CMP CL,0DH  
  258.     JZ ENDIN
  259.    
  260.  
  261.     CMP CL,'0'  
  262.     JL ERG1
  263.     CMP CL,'9'
  264.     JA ERG2
  265.  
  266.     SUB CL,'0'
  267.     MUL BX  
  268.     JC ERG3
  269.     ADD AX,CX
  270.     JC ERG4
  271.     CMP AX, -32768
  272.     JA ERG5
  273.     CMP DI, 1
  274.     JE CONT
  275.     CMP AX, 32767
  276.     JA ERG
  277.    
  278.     CONT:
  279.     INC SI    
  280.     JMP P3  
  281.  
  282.     ERG:  
  283.     MOV DX, OFFSET ERROR6
  284.     MOV AH,09
  285.     INT 21H
  286.     MOV DI,2
  287.     RET
  288.    
  289.  
  290.     ERG1:  
  291.     MOV DX, OFFSET ERROR1
  292.     MOV AH,09
  293.     INT 21H
  294.     MOV DI,2
  295.     RET
  296.  
  297.     ERG11:  
  298.     MOV DX, OFFSET ERROR11
  299.     MOV AH,09
  300.     INT 21H
  301.     MOV DI,2
  302.     RET
  303.  
  304.     ERG2:  
  305.     MOV DX, OFFSET ERROR2
  306.     MOV AH,09
  307.     INT 21H
  308.     MOV DI,2
  309.     RET
  310.  
  311.     ERG3:  
  312.     MOV DX, OFFSET ERROR3
  313.     MOV AH,09
  314.     INT 21H
  315.     MOV DI,2
  316.     RET
  317.  
  318.  
  319.     ERG4:  
  320.     MOV DX, OFFSET ERROR4
  321.     MOV AH,09
  322.     INT 21H
  323.     MOV DI,2
  324.     RET
  325.  
  326.     ERG5:  
  327.     MOV DX, OFFSET ERROR5
  328.     MOV AH,09
  329.     INT 21H
  330.     MOV DI,2
  331.     RET
  332.  
  333.     ENDIN:
  334.     CMP DI,1
  335.     JZ P4
  336.     ret
  337.    
  338.     P4:
  339.     NEG AX
  340.     RET
  341.  
  342. GET_INTEGER ENDP
  343.  
  344. PRINT_INTEGER PROC
  345.    
  346.     MOV BX, AX
  347.     OR BX, BX
  348.     JNS ML
  349.     MOV AL, '-'
  350.     INT 29H
  351.     NEG BX
  352.     ML:
  353.     MOV AX,BX
  354.     XOR CX,CX
  355.     MOV BX,10
  356.     M2:
  357.     XOR DX,DX
  358.     DIV BX
  359.     ADD DL,'0'
  360.     PUSH DX
  361.     INC CX
  362.     TEST AX,AX
  363.     JNZ M2
  364.     M3:
  365.     POP AX
  366.     INT 29H
  367.     LOOP M3
  368.    
  369.     RET
  370.  
  371. PRINT_INTEGER ENDP
  372.  
  373. CODE ENDS
  374. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement