Advertisement
Guest User

Untitled

a guest
May 11th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. include console.inc
  2. .STACK 4096
  3. .DATA  
  4.         MISTAKE DB 'SOME KIND OF MISTAKE MAAAN',0
  5.         prov DB 'JUST PROVERKA MAN',0
  6.     B1 db ?
  7.         B2 db ?
  8.         B3 db ?
  9.         W1 dw ?
  10.         W2 dw ?
  11.         W3 dw ?
  12.         D1 dd ?
  13.         D2 dd ?
  14.         D3 dd ?
  15.         Q1 dq ?
  16.         Q2 dq ?
  17.         Q3 dq ?
  18.         ADDTHREE MACRO A,B,C
  19.         PUSH ESP
  20.         PUSH EAX
  21.  
  22.         IF TYPE A LE 4 AND TYPE A GE 1; помещаем в стек переменные
  23.  
  24.                 PUSH 1 ;, если они размером от byte до dword
  25.                 IF TYPE A EQ BYTE
  26.                         MOV AH, A
  27.                         MOV BYTE PTR [ESP],AH
  28.                         MOV BYTE PTR [ESP+1],0 ;очищаем "мусор"
  29.                         MOV BYTE PTR [ESP+2],0
  30.                         MOV BYTE PTR [ESP+3],0
  31.                         MOV EAX, [ESP+4]
  32.                 ENDIF
  33.                 IF TYPE A EQ WORD
  34.                         IFIDN <SP>,<A>
  35.                                 MOV AX, WORD PTR [ESP+8]
  36.                                 MOV WORD PTR [ESP],AX
  37.                                 MOV BYTE PTR [ESP+2],0
  38.                                 MOV BYTE PTR [ESP+3],0
  39.                                 MOV EAX, [ESP+4]
  40.                         ELSE
  41.                                 MOV AX,A
  42.                                 MOV WORD PTR [ESP],AX
  43.                                 MOV BYTE PTR [ESP+2],0
  44.                                 MOV BYTE PTR [ESP+3],0
  45.                                 MOV EAX,[ESP+4]
  46.                         ENDIF
  47.                                
  48.                 ENDIF
  49.                 IF TYPE A EQ DWORD
  50.                         IFIDN <ESP>,<A> ; ЕСЛИ А = ESP КАК ЭЛЕМЕНТ
  51.                                 MOV EAX,[ESP+8]
  52.                                 MOV DWORD PTR [ESP],EAX
  53.                                 MOV EAX, [ESP+4]
  54.                         ELSE
  55.                                 MOV EAX,A
  56.                                 MOV DWORD PTR [ESP],EAX
  57.                                 MOV EAX,[ESP+4]
  58.                         ENDIF
  59.                 ENDIF
  60.                
  61.  
  62.         ELSEIF TYPE A EQ 0
  63.                 PUSH A
  64.         ENDIF
  65.         outu [ESP]
  66.         newline
  67.        
  68.         IF TYPE B LE 4 AND TYPE B GE 1; помещаем в стек переменные
  69.                 PUSH 1 ;, если они размером от byte до dword
  70.                 IF TYPE B EQ BYTE
  71.                         MOV AH,B
  72.                         MOV BYTE PTR [ESP],AH
  73.                         MOV BYTE PTR [ESP+1],0 ;очищаем "мусор"
  74.                         MOV BYTE PTR [ESP+2],0
  75.                         MOV BYTE PTR [ESP+3],0
  76.                         MOV EAX,[ESP+8]
  77.                 ENDIF
  78.                 IF TYPE B EQ WORD
  79.                         IFIDN <SP>,<B>
  80.                                 outstr offset prov
  81.                                 newline
  82.                                 MOV AX, WORD PTR [ESP+12]
  83.                                 MOV WORD PTR [ESP],AX
  84.                                 MOV BYTE PTR [ESP+2],0
  85.                                 MOV BYTE PTR [ESP+3],0
  86.                                 MOV EAX, [ESP+8]
  87.                         ELSE
  88.                                 MOV AX,B
  89.                                 MOV WORD PTR [ESP],AX
  90.                                 MOV BYTE PTR [ESP+2],0
  91.                                 MOV BYTE PTR [ESP+3],0
  92.                                 MOV EAX,[ESP+8]
  93.                         ENDIF
  94.                                
  95.                 ENDIF
  96.                 IF TYPE B EQ DWORD
  97.                         IFIDN <ESP>,<B> ; ЕСЛИ А = ESP КАК ЭЛЕМЕНТ
  98.                                 MOV EAX,[ESP+12]
  99.                                 MOV DWORD PTR [ESP],EAX
  100.                                 MOV EAX, [ESP+8]
  101.                         ELSE
  102.                                 MOV EAX,A
  103.                                 MOV DWORD PTR [ESP],EAX
  104.                                 MOV EAX,[ESP+8]
  105.                         ENDIF
  106.                 ENDIF
  107.  
  108.  
  109.         ELSEIF TYPE B EQ 0
  110.                 PUSH B
  111.        
  112.         ENDIF
  113.         outu [ESP]
  114.         newline
  115.         IF TYPE C LE 4 AND TYPE C GE 1; помещаем в стек переменные
  116.                 PUSH 1 ;, если они размером от byte до dword
  117.                 IF TYPE C EQ BYTE
  118.                         MOV AH,C
  119.                         MOV BYTE PTR [ESP],AH
  120.                         MOV BYTE PTR [ESP+1],0 ;очищаем "мусор"
  121.                         MOV BYTE PTR [ESP+2],0
  122.                         MOV BYTE PTR [ESP+3],0
  123.                         MOV EAX,[ESP+12]
  124.                 ENDIF
  125.                 IF TYPE C EQ WORD
  126.                         IFIDN <SP>,<C>
  127.                                 outstr offset prov
  128.                                 newline
  129.                                 MOV AX, WORD PTR [ESP+16]
  130.                                 MOV WORD PTR [ESP],AX
  131.                                 MOV BYTE PTR [ESP+2],0
  132.                                 MOV BYTE PTR [ESP+3],0
  133.                                 MOV EAX, [ESP+12]
  134.                         ELSE
  135.                                 MOV AX,C
  136.                                 MOV WORD PTR [ESP],AX
  137.                                 MOV BYTE PTR [ESP+2],0
  138.                                 MOV BYTE PTR [ESP+3],0
  139.                                 MOV EAX,[ESP+12]
  140.                         ENDIF
  141.                                
  142.                 ENDIF
  143.                 IF TYPE C EQ DWORD
  144.                         IFIDN <ESP>,<C> ; ЕСЛИ А = ESP КАК ЭЛЕМЕНТ
  145.                                 MOV EAX,[ESP+16]
  146.                                 MOV DWORD PTR [ESP],EAX
  147.                                 MOV EAX, [ESP+12]
  148.                         ELSE
  149.                                 MOV EAX,C
  150.                                 MOV DWORD PTR [ESP],EAX
  151.                                 MOV EAX,[ESP+12]
  152.                         ENDIF
  153.                 ENDIF
  154.  
  155.  
  156.         ELSEIF TYPE C EQ 0
  157.                 PUSH C
  158.         ELSEIF TYPE C EQ 8
  159.                 PUSH DWORD PTR C
  160.                 PUSH DWORD PTR C+4
  161.         ENDIF
  162.         outu [ESP]
  163.         newline
  164.         MOV EAX,0; обнуляем наш арифмитический регистр
  165.        
  166.         IF TYPE A EQ 0
  167.                 IF TYPE B EQ 0;1-START
  168.                                 IF TYPE C EQ 0;2-START
  169.                                         OUTSTR OFFSET MISTAKE
  170.                                        
  171.                                 ELSEIF TYPE C EQ 1
  172.                                 MOV AH, BYTE PTR [ESP+4]
  173.                                 ADD BYTE PTR [ESP], AH
  174.                                 MOV AH, BYTE PTR [ESP+8]
  175.                                 ADD BYTE PTR [ESP], AH
  176.                                 MOV AH, BYTE PTR [ESP]
  177.                                 MOV C, AH
  178.                                
  179.                                 ELSEIF TYPE C EQ 2
  180.                                 MOV AX, WORD PTR [ESP+4]
  181.                                 ADD WORD PTR [ESP], AX
  182.                                 MOV AX, WORD PTR [ESP+8]
  183.                                 ADD WORD PTR [ESP], AX
  184.                                 MOV AX, WORD PTR [ESP]
  185.                                 MOV C, AX
  186.                                
  187.                                 ELSEIF TYPE C EQ 4
  188.                                 MOV EAX, [ESP+4]
  189.                                 ADD [ESP], EAX
  190.                                 MOV EAX, [ESP+8]
  191.                                 ADD [ESP], EAX
  192.                                 MOV EAX, [ESP]
  193.                                 MOV C, EAX
  194.                                
  195.                                ELSE
  196.                                MOV EAX,[ESP+4]
  197.                                ADD DWORD PTR C,EAX
  198.                                ADC DWORD PTR C+4,0
  199.                                MOV EAX, [ESP+8]
  200.                                ADD DWORD PTR C,EAX
  201.                                ADC DWORD PTR C+4,0
  202.                                
  203.                                ENDIF;2-END
  204.                  
  205.                  ELSEIF TYPE C GT TYPE B
  206.                                 OUTSTR OFFSET MISTAKE;Если b - ненулевой
  207.                  ELSEIF TYPE B EQ BYTE
  208.                                        MOV AH, byte ptr [ESP]
  209.                                        ADD byte ptr [ESP+4], AH
  210.                                        MOV AH, BYTE PTR [ESP+8]
  211.                                        ADD BYTE PTR [ESP+4], AH
  212.                                        MOV AH, BYTE PTR [ESP+4]
  213.                                        MOV B,AH
  214.                   ELSEIF TYPE B EQ WORD
  215.                                        MOV AX, WORD ptr [ESP]
  216.                                        ADD WORD ptr [ESP+4], AX
  217.                                        MOV AX, WORD PTR [ESP+8]
  218.                                        ADD WORD PTR [ESP+4], AX
  219.                                        MOV AX, WORD PTR [ESP+4]
  220.                                        MOV B,AX
  221.                   ELSEIF TYPE B EQ DWORD
  222.                                        MOV EAX, [ESP]
  223.                                        ADD [ESP+4], EAX
  224.                                        MOV EAX, [ESP+8]
  225.                                        ADD [ESP+4], EAX
  226.                                        MOV EAX, [ESP+4]
  227.                                        MOV B,EAX
  228.                   ELSEIF TYPE B EQ QWORD
  229.                         IF TYPE C EQ QWORD
  230.                                 MOV EAX,[ESP+8]
  231.                                 ADD DWORD PTR B,EAX
  232.                                 ADC DWORD PTR B+4,0
  233.                                 MOV EAX,DWORD PTR C
  234.                                 ADD DWORD PTR B,EAX
  235.                                 ADC DWORD PTR B+4,0
  236.                                 MOV EAX,DWORD PTR C+4
  237.                                 ADD DWORD PTR B,EAX
  238.                         ELSE
  239.                                 MOV EAX,[ESP+8]
  240.                                 ADD DWORD PTR B,EAX
  241.                                 ADC DWORD PTR B+4,0
  242.                                 MOV EAX,[ESP]
  243.                                 ADD DWORD PTR B,EAX
  244.                                 ADC DWORD PTR B+4,0
  245.                         ENDIF
  246.                   ENDIF        
  247.                
  248.  
  249.        
  250.         ELSEIF TYPE A EQ BYTE; случай, когда первый операнд - byte
  251.                IF TYPE B LE 1 AND TYPE C LE 1
  252.                        MOV AH, byte ptr [ESP]
  253.                        ADD byte ptr [ESP+8], AH
  254.                        MOV AH, BYTE PTR [ESP+4]
  255.                        ADD BYTE PTR [ESP+8], AH
  256.                        MOV AH, BYTE PTR [ESP+8]
  257.                        MOV A,AH
  258.                ELSE
  259.                        OUTSTR OFFSET MISTAKE
  260.                ENDIF
  261.        
  262.        
  263.  
  264.  
  265.         ELSEIF TYPE A EQ WORD
  266.  
  267.         IF TYPE B LE 2 AND TYPE C LE 2
  268.                        MOV AX, WORD ptr [ESP]
  269.                        ADD WORD ptr [ESP+8], AX
  270.                        MOV AX, WORD PTR [ESP+4]
  271.                        ADD WORD PTR [ESP+8], AX
  272.                        MOV AX, WORD PTR [ESP+8]
  273.                        MOV A,AX
  274.                        
  275.                ELSE
  276.                        OUTSTR OFFSET MISTAKE
  277.                ENDIF
  278.  
  279.         ELSEIF TYPE A EQ DWORD
  280.        
  281.         IF TYPE B LE 4 AND TYPE C LE 4
  282.                        MOV EAX,[ESP]
  283.                        ADD [ESP+8], EAX
  284.                        MOV EAX, [ESP+4]
  285.                        ADD [ESP+8], EAX
  286.                        MOV EAX,[ESP+8]
  287.                        MOV A,EAX
  288.                ELSE
  289.                        OUTSTR OFFSET MISTAKE
  290.                ENDIF
  291.         ELSEIF TYPE A EQ QWORD
  292.                 IF (TYPE B EQ 8) AND (TYPE C EQ 8) ; Type b = type c = q
  293.                         IFIDN <A>,<C>
  294.                                 PUSH DWORD PTR C
  295.                                 PUSH DWORD PTR C+4
  296.                                 MOV EAX, DWORD PTR B
  297.                                 ADD DWORD PTR A,EAX
  298.                                 ADC DWORD PTR A+4,0
  299.                                 MOV EAX, DWORD PTR B+4
  300.                                 ADD DWORD PTR A+4, EAX
  301.                                 MOV EAX, [ESP+4]
  302.                                 ADD DWORD PTR A,EAX
  303.                                 ADC DWORD PTR A+4,0
  304.                                 MOV EAX,[ESP]
  305.                                 ADD DWORD PTR A+4,EAX
  306.                                
  307.                        
  308.                         ELSE
  309.                                 MOV EAX,DWORD PTR B
  310.                                 ADD DWORD PTR A,EAX
  311.                                 ADC DWORD PTR A+4, 0
  312.                                 MOV EAX,DWORD PTR B+4
  313.                                 ADD DWORD PTR A+4,EAX
  314.                                 MOV EAX,DWORD PTR C
  315.                                 ADD DWORD PTR A,EAX
  316.                                 ADC DWORD PTR A+4,0
  317.                                 MOV EAX,DWORD PTR C+4
  318.                                 ADD DWORD PTR A+4,EAX
  319.                         ENDIF
  320.                
  321.                
  322.                 ELSEIF TYPE B NE 8 AND TYPE C EQ 8 ; type b !=q type c = q
  323.                 MOV EAX,DWORD PTR [ESP+4]
  324.                 ADD DWORD PTR A,EAX
  325.                 ADC DWORD PTR A+4,0
  326.                 MOV EAX,DWORD PTR C
  327.                 ADD DWORD PTR A,EAX
  328.                 ADC DWORD PTR A+4,0
  329.                 MOV EAX,DWORD PTR C+4
  330.                 ADD DWORD PTR A+4,EAX
  331.                
  332.                
  333.                
  334.                
  335.                 ELSEIF TYPE B EQ 8 AND TYPE C NE 8 ; type b = q type c !=q
  336.                 MOV EAX,DWORD PTR [ESP]
  337.                 ADD DWORD PTR A,EAX
  338.                 ADC DWORD PTR A+4,0
  339.                 MOV EAX,DWORD PTR B
  340.                 ADD DWORD PTR A,EAX
  341.                 ADC DWORD PTR A+4,0
  342.                 MOV EAX,DWORD PTR B+4
  343.                 ADD DWORD PTR A+4,EAX
  344.                
  345.                 ELSEIF TYPE B NE 8 AND TYPE C NE 8 ; Type b !=q type c != q
  346.                 MOV EAX,DWORD PTR [ESP]
  347.                 ADD DWORD PTR A,EAX
  348.                 ADC DWORD PTR A+4,0
  349.                 MOV EAX,DWORD PTR [ESP+4]
  350.                 ADD DWORD PTR A,EAX
  351.                 ADC DWORD PTR A+4,0
  352.                 ENDIF
  353.        
  354.        
  355.         ENDIF
  356.        
  357.        
  358.        
  359.         OUTU A
  360.         newline
  361.         OUTU B
  362.         newline
  363.         OUTU C
  364.         newline
  365.         ENDM
  366.        
  367.         .CODE
  368.         START:
  369.         ;байты
  370.         MOV byte ptr B1,5
  371.         MOV byte ptr B2,6
  372.         MOV byte ptr B3,7
  373.         ;слова
  374.         MOV word ptr W1,5
  375.         MOV word ptr W2,6
  376.         MOV word ptr W3,7
  377.         ;dword
  378.         MOV dword ptr D1,5
  379.         MOV dword ptr D2,6
  380.         MOV dword ptr D3,7
  381.         ;qword
  382.         MOV dword ptr Q1,4
  383.         MOV dword ptr Q2,4
  384.         MOV dword ptr Q3,4
  385.        
  386.         MOV dword ptr Q1+4,0
  387.         MOV dword ptr Q2+4,0
  388.         MOV dword ptr Q3+4,0
  389.         ADDTHREE Q1,Q1,Q1
  390.        
  391. exit
  392. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement