Advertisement
Guest User

Untitled

a guest
May 14th, 2019
95
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.     B1 DB ?
  5.     B2 DB ?
  6.     B3 DB ?
  7.     W1 DW ?
  8.     W2 DW ?
  9.     W3 DW ?
  10.     D1 DD ?
  11.     D2 DD ?
  12.     D3 DD ?
  13.     Q1 DQ 2
  14.     Q2 DQ 2
  15.     Q3 DQ 2
  16.     H1 DQ ?
  17.     MISTAKE DB "MISTAKE", 0
  18. .CODE
  19. ADDTHREE MACRO A, B, C
  20.     IF ('&A&' NE 'EAX') AND ('&B&' NE 'EAX') AND ('&C&' NE 'EAX') AND ('&A&' NE 'AX') AND ('&B&' NE 'AX') AND ('&C&' NE 'AX') AND ('&A&' NE 'AH') AND ('&B&' NE 'AH') AND ('&C&' NE 'AH') AND ('&A&' NE 'AL') AND ('&B&' NE 'AL') AND ('&C&' NE 'AL')
  21.         IF TYPE A EQ 0
  22.             IF TYPE B EQ 0
  23.                 IF TYPE C EQ 0
  24.                     OUTSTR OFFSET MISTAKE ;все константы
  25.                 ELSE (TYPE C EQ 1) OR (TYPE C EQ 2) OR (TYPE C EQ 4);все константы, кроме C
  26.                     ADD C, A
  27.                     ADD C, B
  28.                 ENDIF
  29.             ELSEIF TYPE B LT TYPE C ; если размер B меньше, чем LT
  30.                 OUTSTR OFFSET MISTAKE
  31.             ELSEIF TYPE B EQ 1 ; A=0,B=1,C=1/0
  32.                 MOV AL, C
  33.                 ADD B, A
  34.                 ADD B, C
  35.             ELSEIF TYPE B EQ 2; A=0,B=2
  36.                 IF TYPE C EQ 1; A=0,B=2,C1
  37.                     MOVZX AX, C
  38.                 ELSE
  39.                     MOV AX, C
  40.                 ENDIF
  41.                 ADD B,A
  42.                 ADD B,AX
  43.             ELSEIF TYPE B EQ 4
  44.                 IF (TYPE C EQ 0) OR (TYPE C EQ 4)
  45.                     MOV EAX, C
  46.                 ELSE
  47.                     MOVZX EAX, C
  48.                 ENDIF
  49.                 ADD B, A
  50.                 ADD B, EAX
  51.             ENDIF
  52.         ELSEIF (TYPE A LT TYPE B) OR (TYPE A LT TYPE C) ; если A<B или A<C (как типы)
  53.             OUTSTR OFFSET MISTAKE
  54.         ELSEIF TYPE A EQ 1; если A - byte -> B and C - byte or const
  55.             MOV AL, B
  56.             ADD AL, C
  57.             ADD A, AL
  58.         ELSEIF TYPE A EQ 2 ; A - word
  59.             IF TYPE B EQ 1
  60.                 MOVZX AX, B
  61.             ELSE
  62.                 MOV AX, B
  63.             ENDIF
  64.             IF TYPE C EQ 1 ; c - byte
  65.                 ADD AL, C
  66.                 ADC AH, 0
  67.             ELSE           ; c - word
  68.                 ADD AX, C
  69.             ENDIF
  70.             ADD A, AX
  71.         ELSE TYPE A EQ 4
  72.             IF (TYPE B EQ 4) OR (TYPE B EQ 0)
  73.                 MOV EAX, B
  74.             ELSE
  75.                 MOVZX EAX, B
  76.             ENDIF
  77.             IF (TYPE C EQ 4) OR (TYPE C EQ 0)
  78.                 ADD EAX, C
  79.             ELSEIF TYPE C EQ 1;c=1
  80.                 ADD AL, C
  81.                 ADC AH, 0
  82.                 JNC M3
  83.                 ADD EAX, 65536
  84.                 M3:
  85.             ELSE; c=2
  86.                 ADD AX, C
  87.                 JNC M4
  88.                 ADD EAX, 65536
  89.                 M4:
  90.             ENDIF
  91.             ADD A, EAX
  92.  
  93.         ENDIF
  94.     ELSEIF ('&A&' NE 'EBX') AND ('&B&' NE 'EBX') AND ('&C&' NE 'EBX') AND ('&A&' NE 'BX') AND ('&B&' NE 'BX') AND ('&C&' NE 'BX') AND ('&A&' NE 'BH') AND ('&B&' NE 'BH') AND ('&C&' NE 'BH') AND ('&A&' NE 'BL') AND ('&B&' NE 'BL') AND ('&C&' NE 'BL')  
  95.         IF TYPE A EQ 0
  96.             IF TYPE B EQ 0
  97.                 IF TYPE C EQ 0
  98.                     OUTSTR OFFSET MISTAKE ;все константы
  99.                 ELSE (TYPE C EQ 1) OR (TYPE C EQ 2) OR (TYPE C EQ 4);все константы, кроме C
  100.                     ADD C, A
  101.                     ADD C, B
  102.                 ENDIF
  103.             ELSEIF TYPE B LT TYPE C ; если размер B меньше, чем LT
  104.                 OUTSTR OFFSET MISTAKE
  105.             ELSEIF TYPE B EQ 1 ; A=0,B=1,C=1/0
  106.                 MOV BL, C
  107.                 ADD B, A
  108.                 ADD B, C
  109.             ELSEIF TYPE B EQ 2; A=0,B=2
  110.                 IF TYPE C EQ 1; A=0,B=2,C1
  111.                     MOVZX BX, C
  112.                 ELSE
  113.                     MOV BX, C
  114.                 ENDIF
  115.                 ADD B,A
  116.                 ADD B,BX
  117.             ELSEIF TYPE B EQ 4
  118.                 IF (TYPE C EQ 0) OR (TYPE C EQ 4)
  119.                     MOV EBX, C
  120.                 ELSE
  121.                     MOVZX EBX, C
  122.                 ENDIF
  123.                 ADD B, A
  124.                 ADD B, EBX
  125.             ENDIF
  126.         ELSEIF (TYPE A LT TYPE B) OR (TYPE A LT TYPE C) ; если A<B или A<C (как типы)
  127.             OUTSTR OFFSET MISTAKE
  128.         ELSEIF TYPE A EQ 1; если A - byte -> B and C - byte or const
  129.             MOV BL, B
  130.             ADD BL, C
  131.             ADD A, BL
  132.         ELSEIF TYPE A EQ 2 ; A - word
  133.             IF TYPE B EQ 1
  134.                 MOVZX BX, B
  135.             ELSE
  136.                 MOV BX, B
  137.             ENDIF
  138.             IF TYPE C EQ 1 ; c - byte
  139.                 ADD BL, C
  140.                 ADC BH, 0
  141.             ELSE           ; c - word
  142.                 ADD BX, C
  143.             ENDIF
  144.             ADD A, BX
  145.         ELSE TYPE A EQ 4
  146.             IF (TYPE B EQ 4) OR (TYPE B EQ 0)
  147.                 MOV EBX, B
  148.             ELSE
  149.                 MOVZX EBX, B
  150.             ENDIF
  151.             IF (TYPE C EQ 4) OR (TYPE C EQ 0)
  152.                 ADD EBX, C
  153.             ELSEIF TYPE C EQ 1;c=1
  154.                 ADD BL, C
  155.                 ADC BH, 0
  156.                 JNC M3
  157.                 ADD EBX, 65536
  158.                 M3:
  159.             ELSE; c=2
  160.                 ADD BX, C
  161.                 JNC M4
  162.                 ADD EBX, 65536
  163.                 M4:
  164.             ENDIF
  165.             ADD A, EBX
  166.  
  167.         ENDIF
  168.     ELSEIF ('&A&' NE 'ECX') AND ('&B&' NE 'ECX') AND ('&C&' NE 'ECX') AND ('&A&' NE 'CX') AND ('&B&' NE 'CX') AND ('&C&' NE 'CX') AND ('&A&' NE 'CH') AND ('&B&' NE 'CH') AND ('&C&' NE 'CH') AND ('&A&' NE 'CL') AND ('&B&' NE 'CL') AND ('&C&' NE 'CL')
  169.         IF TYPE A EQ 0
  170.             IF TYPE B EQ 0
  171.                 IF TYPE C EQ 0
  172.                     OUTSTR OFFSET MISTAKE ;все константы
  173.                 ELSE (TYPE C EQ 1) OR (TYPE C EQ 2) OR (TYPE C EQ 4);все константы, кроме C
  174.                     ADD C, A
  175.                     ADD C, B
  176.                 ENDIF
  177.             ELSEIF TYPE B LT TYPE C ; если размер B меньше, чем LT
  178.                 OUTSTR OFFSET MISTAKE
  179.             ELSEIF TYPE B EQ 1 ; A=0,B=1,C=1/0
  180.                 MOV CL, C
  181.                 ADD B, A
  182.                 ADD B, C
  183.             ELSEIF TYPE B EQ 2; A=0,B=2
  184.                 IF TYPE C EQ 1; A=0,B=2,C1
  185.                     MOVZX CX, C
  186.                 ELSE
  187.                     MOV CX, C
  188.                 ENDIF
  189.                 ADD B,A
  190.                 ADD B,CX
  191.             ELSEIF TYPE B EQ 4
  192.                 IF (TYPE C EQ 0) OR (TYPE C EQ 4)
  193.                     MOV ECX, C
  194.                 ELSE
  195.                     MOVZX ECX, C
  196.                 ENDIF
  197.                 ADD B, A
  198.                 ADD B, ECX
  199.             ENDIF
  200.         ELSEIF (TYPE A LT TYPE B) OR (TYPE A LT TYPE C) ; если A<B или A<C (как типы)
  201.             OUTSTR OFFSET MISTAKE
  202.         ELSEIF TYPE A EQ 1; если A - byte -> B and C - byte or const
  203.             MOV CL, B
  204.             ADD CL, C
  205.             ADD A, CL
  206.         ELSEIF TYPE A EQ 2 ; A - word
  207.             IF TYPE B EQ 1
  208.                 MOVZX CX, B
  209.             ELSE
  210.                 MOV CX, B
  211.             ENDIF
  212.             IF TYPE C EQ 1 ; c - byte
  213.                 ADD CL, C
  214.                 ADC CH, 0
  215.             ELSE           ; c - word
  216.                 ADD CX, C
  217.             ENDIF
  218.             ADD A, CX
  219.         ELSE TYPE A EQ 4
  220.             IF (TYPE B EQ 4) OR (TYPE B EQ 0)
  221.                 MOV ECX, B
  222.             ELSE
  223.                 MOVZX ECX, B
  224.             ENDIF
  225.             IF (TYPE C EQ 4) OR (TYPE C EQ 0)
  226.                 ADD ECX, C
  227.             ELSEIF TYPE C EQ 1;c=1
  228.                 ADD CL, C
  229.                 ADC CH, 0
  230.                 JNC M3
  231.                 ADD ECX, 65536
  232.                 M3:
  233.             ELSE; c=2
  234.                 ADD CX, C
  235.                 JNC M4
  236.                 ADD ECX, 65536
  237.                 M4:
  238.             ENDIF
  239.             ADD A, ECX
  240.  
  241.         ENDIF
  242. ELSEIF ('&A&' NE 'EDX') AND ('&B&' NE 'EDX') AND ('&C&' NE 'EDX') AND ('&A&' NE 'DX') AND ('&B&' NE 'DX') AND ('&C&' NE 'DX') AND ('&A&' NE 'DH') AND ('&B&' NE 'DH') AND ('&C&' NE 'DH') AND ('&A&' NE 'DL') AND ('&B&' NE 'DL') AND ('&C&' NE 'DL')
  243.         IF TYPE A EQ 0
  244.             IF TYPE B EQ 0
  245.                 IF TYPE C EQ 0
  246.                     OUTSTR OFFSET MISTAKE ;все константы
  247.                 ELSE (TYPE C EQ 1) OR (TYPE C EQ 2) OR (TYPE C EQ 4);все константы, кроме C
  248.                     ADD C, A
  249.                     ADD C, B
  250.                 ENDIF
  251.             ELSEIF TYPE B LT TYPE C ; если размер B меньше, чем LT
  252.                 OUTSTR OFFSET MISTAKE
  253.             ELSEIF TYPE B EQ 1 ; A=0,B=1,C=1/0
  254.                 MOV DL, C
  255.                 ADD B, A
  256.                 ADD B, C
  257.             ELSEIF TYPE B EQ 2; A=0,B=2
  258.                 IF TYPE C EQ 1; A=0,B=2,C1
  259.                     MOVZX DX, C
  260.                 ELSE
  261.                     MOV DX, C
  262.                 ENDIF
  263.                 ADD B,A
  264.                 ADD B,DX
  265.             ELSEIF TYPE B EQ 4
  266.                 IF (TYPE C EQ 0) OR (TYPE C EQ 4)
  267.                     MOV EDX, C
  268.                 ELSE
  269.                     MOVZX EDX, C
  270.                 ENDIF
  271.                 ADD B, A
  272.                 ADD B, EDX
  273.             ENDIF
  274.         ELSEIF (TYPE A LT TYPE B) OR (TYPE A LT TYPE C) ; если A<B или A<C (как типы)
  275.             OUTSTR OFFSET MISTAKE
  276.         ELSEIF TYPE A EQ 1; если A - byte -> B and C - byte or const
  277.             MOV DL, B
  278.             ADD DL, C
  279.             ADD A, DL
  280.         ELSEIF TYPE A EQ 2 ; A - word
  281.             IF TYPE B EQ 1
  282.                 MOVZX DX, B
  283.             ELSE
  284.                 MOV DX, B
  285.             ENDIF
  286.             IF TYPE C EQ 1 ; c - byte
  287.                 ADD DL, C
  288.                 ADC DH, 0
  289.             ELSE           ; c - word
  290.                 ADD DX, C
  291.             ENDIF
  292.             ADD A, DX
  293.         ELSE TYPE A EQ 4
  294.             IF (TYPE B EQ 4) OR (TYPE B EQ 0)
  295.                 MOV EDX, B
  296.             ELSE
  297.                 MOVZX EDX, B
  298.             ENDIF
  299.             IF (TYPE C EQ 4) OR (TYPE C EQ 0)
  300.                 ADD EDX, C
  301.             ELSEIF TYPE C EQ 1;c=1
  302.                 ADD DL, C
  303.                 ADC DH, 0
  304.                 JNC M3
  305.                 ADD EDX, 65536
  306.                 M3:
  307.             ELSE; c=2
  308.                 ADD DX, C
  309.                 JNC M4
  310.                 ADD EDX, 65536
  311.                 M4:
  312.             ENDIF
  313.             ADD A, EDX
  314.  
  315.         ENDIF
  316.     ENDIF
  317. ENDM
  318. START:
  319.     MOV AX,3
  320.     MOV BX,4
  321.     MOV CX,5
  322.     ADDTHREE AX, 5, 5
  323.     OUTU AX
  324.     EXIT
  325.     END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement