Advertisement
Guest User

Untitled

a guest
Dec 20th, 2017
66
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.     jle case_2  ;если меньше или равно - это точно второй случай
  95.     cmp bx, cx  ;сравниваем y, t
  96.     jne case_1  ;если не равны - первый случай
  97.     jmp case_3  ;иначе третий случай
  98.  
  99.     case_1: ;(5x-y^2)/(7(t-y)) - первый
  100.    
  101.     xor dx, dx
  102.     push ax
  103.     mov ax, YY
  104.     mul ax
  105.     mov cx, ax
  106.     pop ax
  107.     mov bx, 5
  108.     mul bx
  109.     sub ax, cx
  110.     push ax
  111.    
  112.     mov cx, TT
  113.     mov dx, YY
  114.     sub cx, dx
  115.     mov ax, cx
  116.     mov bx, 7
  117.     mul bx
  118.     mov bx, ax
  119.     pop ax
  120.    
  121.     xor dx, dx
  122.    
  123.    
  124.     jmp rzero
  125.    
  126.    
  127.     case_2: ;(13x+7y+5t) - второй случай
  128.    
  129.     mov bx, 13
  130.     mul bx
  131.     push ax
  132.     mov ax, YY
  133.     mov bx, 7
  134.     mul bx
  135.     push ax
  136.     mov ax, TT
  137.     mov bx, 5
  138.     mul bx
  139.     pop bx
  140.     add ax, bx
  141.     pop bx
  142.     add ax, bx
  143.    
  144.     ;делить ничего не надо, так что просто печатаем и выходим из процедуры
  145.     call Print_integer
  146.     ret
  147.    
  148.     case_3: ;2xy - третий случай
  149.    
  150.     cwd
  151.     mov bx, YY
  152.     imul bx
  153.     add ax, ax
  154.    
  155.     call Print_integer
  156.     ret
  157.  
  158.     rzero:
  159.     cwd     ;расширяем ах до 4 байт (dx:ax)
  160.     idiv bx
  161.     cmp dx, 0
  162.     jne print_and_continue
  163.    
  164.     call Print_integer
  165.     ret
  166.    
  167.     print_and_continue:
  168.    
  169.     push dx
  170.     or dx, dx   ;чекаем знак остатка после деления
  171.     pop dx
  172.    
  173.     PUSH DX
  174.     PUSH BX
  175.    
  176.     push ax
  177.     jns print_value ;если знак плюс - тогда просто печатаем частное
  178.     cmp ax, 0
  179.     jne print_value ;если знак минус - то печатает дополнительный минус перед частным
  180.    
  181.     print_minus_value:
  182.     MOV AH, 02H
  183.     MOV DL, '-' ; печатаем минус
  184.     INT 21H
  185.    
  186.     print_value:
  187.     pop ax
  188.     call Print_integer
  189.     MOV AH, 02H
  190.     MOV DL, 46 ; печатаем точку
  191.     INT 21H
  192.    
  193.     POP BX
  194.     POP DX
  195.    
  196.     MOV CX, 3
  197.     divI:
  198.     mov ax,dx
  199.    
  200.     push ax
  201.     or ax, ax   ;чекаем знак остатка. Если минус - меняем знак
  202.                 ;поскольку минус уже напечатан вначале
  203.     pop ax
  204.     jns dont_neg
  205.     neg ax
  206.     dont_neg:
  207.    
  208.     mov di, 10
  209.     mul di
  210.     div bx
  211.     cmp dx, 0
  212.     jne lp_print_and_continue
  213.     CALL PRINT_INTEGER
  214.     ret
  215.     lp_print_and_continue:
  216.     PUSH DX
  217.     PUSH CX
  218.     PUSH BX
  219.    
  220.     CALL PRINT_INTEGER
  221.    
  222.     POP BX
  223.     POP CX
  224.     POP DX
  225.     LOOP DIVI
  226.     RET
  227.  
  228.  
  229. FUN_CALC ENDP
  230.  
  231. GET_INTEGER PROC
  232.  
  233.     MOV AH,0AH ;???? ??????
  234.     XOR DI,DI
  235.     MOV DX,OFFSET BUFFER
  236.     INT 21H
  237.     MOV DL,0AH ;???????????? ?????? ??????  
  238.     MOV AH,02 ;????? ?? ?????
  239.     INT 21H
  240.    
  241.     MOV SI, OFFSET BUFFER+1
  242.     CMP BYTE PTR [SI], 0
  243.     JZ ERG11
  244.  
  245.     MOV SI, OFFSET BUFFER+1
  246.     CMP BYTE PTR [SI], 1
  247.     JNZ CON
  248.  
  249.     MOV SI,OFFSET BUFFER+2
  250.     MOV CL,[SI]
  251.     CMP CL,'0'
  252.     JZ CON
  253.     JL ERG1
  254.        
  255.  
  256.     CON:
  257.     MOV SI,OFFSET BUFFER+2
  258.     CMP BYTE PTR [SI],"+"
  259.     JZ P1
  260.     CMP BYTE PTR [SI],"-"
  261.     JNZ P2
  262.     MOV DI,1
  263.     P1:  
  264.     INC SI    
  265.     P2:
  266.     XOR AX,AX
  267.     MOV BX,10  
  268.     P3:
  269.     MOV CL,[SI]
  270.     CMP CL,0DH  
  271.     JZ ENDIN
  272.    
  273.  
  274.     CMP CL,'0'  
  275.     JL ERG1
  276.     CMP CL,'9'
  277.     JA ERG2
  278.  
  279.     SUB CL,'0'
  280.     MUL BX  
  281.     JC ERG3
  282.     ADD AX,CX
  283.     JC ERG4
  284.     CMP AX, -32768
  285.     JA ERG5
  286.     CMP DI, 1
  287.     JE CONT
  288.     CMP AX, 32767
  289.     JA ERG
  290.    
  291.     CONT:
  292.     INC SI    
  293.     JMP P3  
  294.  
  295.     ERG:  
  296.     MOV DX, OFFSET ERROR6
  297.     MOV AH,09
  298.     INT 21H
  299.     MOV DI,2
  300.     RET
  301.    
  302.  
  303.     ERG1:  
  304.     MOV DX, OFFSET ERROR1
  305.     MOV AH,09
  306.     INT 21H
  307.     MOV DI,2
  308.     RET
  309.  
  310.     ERG11:  
  311.     MOV DX, OFFSET ERROR11
  312.     MOV AH,09
  313.     INT 21H
  314.     MOV DI,2
  315.     RET
  316.  
  317.     ERG2:  
  318.     MOV DX, OFFSET ERROR2
  319.     MOV AH,09
  320.     INT 21H
  321.     MOV DI,2
  322.     RET
  323.  
  324.     ERG3:  
  325.     MOV DX, OFFSET ERROR3
  326.     MOV AH,09
  327.     INT 21H
  328.     MOV DI,2
  329.     RET
  330.  
  331.  
  332.     ERG4:  
  333.     MOV DX, OFFSET ERROR4
  334.     MOV AH,09
  335.     INT 21H
  336.     MOV DI,2
  337.     RET
  338.  
  339.     ERG5:  
  340.     MOV DX, OFFSET ERROR5
  341.     MOV AH,09
  342.     INT 21H
  343.     MOV DI,2
  344.     RET
  345.  
  346.     ENDIN:
  347.     CMP DI,1
  348.     JZ P4
  349.     ret
  350.    
  351.     P4:
  352.     NEG AX
  353.     RET
  354.  
  355. GET_INTEGER ENDP
  356.  
  357. PRINT_INTEGER PROC
  358.    
  359.     MOV BX, AX
  360.     OR BX, BX
  361.     JNS ML
  362.     MOV AL, '-'
  363.     INT 29H
  364.     NEG BX
  365.     ML:
  366.     MOV AX,BX
  367.     XOR CX,CX
  368.     MOV BX,10
  369.     M2:
  370.     XOR DX,DX
  371.     DIV BX
  372.     ADD DL,'0'
  373.     PUSH DX
  374.     INC CX
  375.     TEST AX,AX
  376.     JNZ M2
  377.     M3:
  378.     POP AX
  379.     INT 29H
  380.     LOOP M3
  381.    
  382.     RET
  383.  
  384. PRINT_INTEGER ENDP
  385.  
  386. CODE ENDS
  387. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement