Subversion Repositories Kolibri OS

Rev

Rev 2287 | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. ; flat assembler core
  3. ; Copyright (c) 1999-2012, Tomasz Grysztar.
  4. ; All rights reserved.
  5.  
  6. calculate_expression:
  7.         mov     [current_offset],edi
  8.         mov     [value_undefined],0
  9.         cmp     byte [esi],0
  10.         je      get_string_value
  11.         cmp     byte [esi],'.'
  12.         je      convert_fp
  13.       calculation_loop:
  14.         lods    byte [esi]
  15.         cmp     al,1
  16.         je      get_byte_number
  17.         cmp     al,2
  18.         je      get_word_number
  19.         cmp     al,4
  20.         je      get_dword_number
  21.         cmp     al,8
  22.         je      get_qword_number
  23.         cmp     al,0Fh
  24.         je      value_out_of_range
  25.         cmp     al,10h
  26.         je      get_register
  27.         cmp     al,11h
  28.         je      get_label
  29.         cmp     al,')'
  30.         je      expression_calculated
  31.         cmp     al,']'
  32.         je      expression_calculated
  33.         cmp     al,'!'
  34.         je      invalid_expression
  35.         sub     edi,14h
  36.         mov     ebx,edi
  37.         sub     ebx,14h
  38.         cmp     al,0E0h
  39.         je      calculate_rva
  40.         cmp     al,0E1h
  41.         je      calculate_plt
  42.         cmp     al,0D0h
  43.         je      calculate_not
  44.         cmp     al,083h
  45.         je      calculate_neg
  46.         mov     dx,[ebx+8]
  47.         or      dx,[edi+8]
  48.         cmp     al,80h
  49.         je      calculate_add
  50.         cmp     al,81h
  51.         je      calculate_sub
  52.         mov     ah,[ebx+12]
  53.         or      ah,[edi+12]
  54.         jz      absolute_values_calculation
  55.         cmp     [error_line],0
  56.         jne     absolute_values_calculation
  57.         mov     eax,[current_line]
  58.         mov     [error_line],eax
  59.         mov     [error],invalid_use_of_symbol
  60.       absolute_values_calculation:
  61.         cmp     al,90h
  62.         je      calculate_mul
  63.         cmp     al,91h
  64.         je      calculate_div
  65.         or      dx,dx
  66.         jnz     invalid_expression
  67.         cmp     al,0A0h
  68.         je      calculate_mod
  69.         cmp     al,0B0h
  70.         je      calculate_and
  71.         cmp     al,0B1h
  72.         je      calculate_or
  73.         cmp     al,0B2h
  74.         je      calculate_xor
  75.         cmp     al,0C0h
  76.         je      calculate_shl
  77.         cmp     al,0C1h
  78.         je      calculate_shr
  79.         jmp     invalid_expression
  80.       expression_calculated:
  81.         sub     edi,14h
  82.         cmp     [value_undefined],0
  83.         je      expression_value_ok
  84.         xor     eax,eax
  85.         mov     [edi],eax
  86.         mov     [edi+4],eax
  87.         mov     [edi+12],al
  88.       expression_value_ok:
  89.         ret
  90.       get_byte_number:
  91.         xor     eax,eax
  92.         lods    byte [esi]
  93.         stos    dword [edi]
  94.         xor     al,al
  95.         stos    dword [edi]
  96.       got_number:
  97.         mov     word [edi-8+8],0
  98.         mov     byte [edi-8+12],0
  99.         mov     dword [edi-8+16],0
  100.         add     edi,0Ch
  101.         jmp     calculation_loop
  102.       get_word_number:
  103.         xor     eax,eax
  104.         lods    word [esi]
  105.         stos    dword [edi]
  106.         xor     ax,ax
  107.         stos    dword [edi]
  108.         jmp     got_number
  109.       get_dword_number:
  110.         movs    dword [edi],[esi]
  111.         xor     eax,eax
  112.         stos    dword [edi]
  113.         jmp     got_number
  114.       get_qword_number:
  115.         movs    dword [edi],[esi]
  116.         movs    dword [edi],[esi]
  117.         jmp     got_number
  118.       get_register:
  119.         mov     byte [edi+9],0
  120.         mov     byte [edi+12],0
  121.         lods    byte [esi]
  122.         mov     [edi+8],al
  123.         mov     byte [edi+10],1
  124.         xor     eax,eax
  125.         mov     [edi+16],eax
  126.         stos    dword [edi]
  127.         stos    dword [edi]
  128.         add     edi,0Ch
  129.         jmp     calculation_loop
  130.       get_label:
  131.         xor     eax,eax
  132.         mov     [edi+8],eax
  133.         mov     [edi+12],al
  134.         mov     [edi+20],eax
  135.         lods    dword [esi]
  136.         cmp     eax,0Fh
  137.         jb      predefined_label
  138.         je      reserved_word_used_as_symbol
  139.         mov     ebx,eax
  140.         mov     ax,[current_pass]
  141.         mov     [ebx+18],ax
  142.         or      byte [ebx+8],8
  143.         test    byte [ebx+8],1
  144.         jz      label_undefined
  145.         cmp     ax,[ebx+16]
  146.         je      label_defined
  147.         test    byte [ebx+8],4
  148.         jnz     label_out_of_scope
  149.         test    byte [ebx+9],1
  150.         jz      label_defined
  151.         mov     eax,[ebx]
  152.         sub     eax,dword [adjustment]
  153.         stos    dword [edi]
  154.         mov     eax,[ebx+4]
  155.         sbb     eax,dword [adjustment+4]
  156.         stos    dword [edi]
  157.         mov     eax,dword [adjustment]
  158.         or      eax,dword [adjustment+4]
  159.         jz      got_label
  160.         or      [next_pass_needed],-1
  161.         jmp     got_label
  162.       label_defined:
  163.         mov     eax,[ebx]
  164.         stos    dword [edi]
  165.         mov     eax,[ebx+4]
  166.         stos    dword [edi]
  167.       got_label:
  168.         mov     al,[ebx+11]
  169.         mov     [edi-8+12],al
  170.         mov     eax,[ebx+12]
  171.         mov     [edi-8+8],eax
  172.         mov     eax,[ebx+20]
  173.         mov     [edi-8+16],eax
  174.         add     edi,0Ch
  175.         mov     al,[ebx+10]
  176.         or      al,al
  177.         jz      calculation_loop
  178.         cmp     [size_override],-1
  179.         je      calculation_loop
  180.         cmp     [size_override],0
  181.         je      check_size
  182.         cmp     [operand_size],0
  183.         jne     calculation_loop
  184.         mov     [operand_size],al
  185.         jmp     calculation_loop
  186.       check_size:
  187.         xchg    [operand_size],al
  188.         or      al,al
  189.         jz      calculation_loop
  190.         cmp     al,[operand_size]
  191.         jne     operand_sizes_do_not_match
  192.         jmp     calculation_loop
  193.       current_offset_label:
  194.         mov     eax,[current_offset]
  195.       make_current_offset_label:
  196.         xor     edx,edx
  197.         sub     eax,dword [org_origin]
  198.         sbb     edx,dword [org_origin+4]
  199.         stos    dword [edi]
  200.         mov     eax,edx
  201.         stos    dword [edi]
  202.         mov     eax,[org_registers]
  203.         stos    dword [edi]
  204.         mov     al,[labels_type]
  205.         mov     [edi-12+12],al
  206.         mov     eax,[org_symbol]
  207.         mov     [edi-12+16],eax
  208.         add     edi,8
  209.         jmp     calculation_loop
  210.       org_origin_label:
  211.         mov     eax,[org_start]
  212.         jmp     make_current_offset_label
  213.       counter_label:
  214.         mov     eax,[counter]
  215.       make_dword_label_value:
  216.         stos    dword [edi]
  217.         xor     eax,eax
  218.         stos    dword [edi]
  219.         add     edi,0Ch
  220.         jmp     calculation_loop
  221.       timestamp_label:
  222.         call    make_timestamp
  223.       make_qword_label_value:
  224.         stos    dword [edi]
  225.         mov     eax,edx
  226.         stos    dword [edi]
  227.         add     edi,0Ch
  228.         jmp     calculation_loop
  229.       predefined_label:
  230.         or      eax,eax
  231.         jz      current_offset_label
  232.         cmp     eax,1
  233.         je      counter_label
  234.         cmp     eax,2
  235.         je      timestamp_label
  236.         cmp     eax,3
  237.         je      org_origin_label
  238.         mov     edx,invalid_value
  239.         jmp     error_undefined
  240.       label_out_of_scope:
  241.         mov     edx,symbol_out_of_scope
  242.         cmp     [error_line],0
  243.         jne     error_undefined
  244.         mov     [error_info],ebx
  245.         jmp     error_undefined
  246.       label_undefined:
  247.         mov     edx,undefined_symbol
  248.         cmp     [error_line],0
  249.         jne     error_undefined
  250.         mov     [error_info],ebx
  251.       error_undefined:
  252.         cmp     [current_pass],1
  253.         ja      undefined_value
  254.       force_next_pass:
  255.         or      [next_pass_needed],-1
  256.       undefined_value:
  257.         mov     byte [edi+12],0
  258.         or      [value_undefined],-1
  259.         xor     eax,eax
  260.         stos    dword [edi]
  261.         stos    dword [edi]
  262.         add     edi,0Ch
  263.         cmp     [error_line],0
  264.         jne     calculation_loop
  265.         mov     eax,[current_line]
  266.         mov     [error_line],eax
  267.         mov     [error],edx
  268.         jmp     calculation_loop
  269.       calculate_add:
  270.         mov     ecx,[ebx+16]
  271.         cmp     byte [edi+12],0
  272.         je      add_values
  273.         mov     ecx,[edi+16]
  274.         cmp     byte [ebx+12],0
  275.         je      add_values
  276.         cmp     [error_line],0
  277.         jne     add_values
  278.         mov     eax,[current_line]
  279.         mov     [error_line],eax
  280.         mov     [error],invalid_use_of_symbol
  281.       add_values:
  282.         mov     al,[edi+12]
  283.         or      [ebx+12],al
  284.         mov     [ebx+16],ecx
  285.         mov     eax,[edi]
  286.         add     [ebx],eax
  287.         mov     eax,[edi+4]
  288.         adc     [ebx+4],eax
  289.         or      dx,dx
  290.         jz      calculation_loop
  291.         push    esi
  292.         mov     esi,ebx
  293.         lea     ebx,[edi+10]
  294.         mov     cl,[edi+8]
  295.         call    add_register
  296.         lea     ebx,[edi+11]
  297.         mov     cl,[edi+9]
  298.         call    add_register
  299.         pop     esi
  300.         jmp     calculation_loop
  301.       add_register:
  302.         or      cl,cl
  303.         jz      add_register_done
  304.       add_register_start:
  305.         cmp     [esi+8],cl
  306.         jne     add_in_second_slot
  307.         mov     al,[ebx]
  308.         add     [esi+10],al
  309.         jnz     add_register_done
  310.         mov     byte [esi+8],0
  311.         ret
  312.       add_in_second_slot:
  313.         cmp     [esi+9],cl
  314.         jne     create_in_first_slot
  315.         mov     al,[ebx]
  316.         add     [esi+11],al
  317.         jnz     add_register_done
  318.         mov     byte [esi+9],0
  319.         ret
  320.       create_in_first_slot:
  321.         cmp     byte [esi+8],0
  322.         jne     create_in_second_slot
  323.         mov     [esi+8],cl
  324.         mov     al,[ebx]
  325.         mov     [esi+10],al
  326.         ret
  327.       create_in_second_slot:
  328.         cmp     byte [esi+9],0
  329.         jne     invalid_expression
  330.         mov     [esi+9],cl
  331.         mov     al,[ebx]
  332.         mov     [esi+11],al
  333.       add_register_done:
  334.         ret
  335.       calculate_sub:
  336.         xor     ah,ah
  337.         mov     ah,[ebx+12]
  338.         mov     al,[edi+12]
  339.         or      al,al
  340.         jz      sub_values
  341.         cmp     al,ah
  342.         jne     invalid_sub
  343.         xor     ah,ah
  344.         mov     ecx,[edi+16]
  345.         cmp     ecx,[ebx+16]
  346.         jne     invalid_sub
  347.       sub_values:
  348.         mov     [ebx+12],ah
  349.         mov     eax,[edi]
  350.         sub     [ebx],eax
  351.         mov     eax,[edi+4]
  352.         sbb     [ebx+4],eax
  353.         or      dx,dx
  354.         jz      calculation_loop
  355.         push    esi
  356.         mov     esi,ebx
  357.         lea     ebx,[edi+10]
  358.         mov     cl,[edi+8]
  359.         call    sub_register
  360.         lea     ebx,[edi+11]
  361.         mov     cl,[edi+9]
  362.         call    sub_register
  363.         pop     esi
  364.         jmp     calculation_loop
  365.       invalid_sub:
  366.         cmp     [error_line],0
  367.         jne     sub_values
  368.         mov     eax,[current_line]
  369.         mov     [error_line],eax
  370.         mov     [error],invalid_use_of_symbol
  371.         jmp     sub_values
  372.       sub_register:
  373.         or      cl,cl
  374.         jz      add_register_done
  375.         neg     byte [ebx]
  376.         jmp     add_register_start
  377.       calculate_mul:
  378.         or      dx,dx
  379.         jz      mul_start
  380.         cmp     word [ebx+8],0
  381.         jne     mul_start
  382.         mov     eax,[ebx]
  383.         xchg    eax,[edi]
  384.         mov     [ebx],eax
  385.         mov     eax,[ebx+4]
  386.         xchg    eax,[edi+4]
  387.         mov     [ebx+4],eax
  388.         mov     eax,[ebx+8]
  389.         xchg    eax,[edi+8]
  390.         mov     [ebx+8],eax
  391.         mov     eax,[ebx+12]
  392.         xchg    eax,[edi+12]
  393.         mov     [ebx+12],eax
  394.       mul_start:
  395.         push    esi edx
  396.         mov     esi,ebx
  397.         xor     bl,bl
  398.         bt      dword [esi+4],31
  399.         jnc     mul_first_sign_ok
  400.         not     dword [esi]
  401.         not     dword [esi+4]
  402.         add     dword [esi],1
  403.         adc     dword [esi+4],0
  404.         not     bl
  405.       mul_first_sign_ok:
  406.         bt      dword [edi+4],31
  407.         jnc     mul_second_sign_ok
  408.         not     dword [edi]
  409.         not     dword [edi+4]
  410.         add     dword [edi],1
  411.         adc     dword [edi+4],0
  412.         not     bl
  413.       mul_second_sign_ok:
  414.         cmp     dword [esi+4],0
  415.         jz      mul_numbers
  416.         cmp     dword [edi+4],0
  417.         jnz     value_out_of_range
  418.       mul_numbers:
  419.         mov     eax,[esi+4]
  420.         mul     dword [edi]
  421.         or      edx,edx
  422.         jnz     value_out_of_range
  423.         mov     ecx,eax
  424.         mov     eax,[esi]
  425.         mul     dword [edi+4]
  426.         or      edx,edx
  427.         jnz     value_out_of_range
  428.         add     ecx,eax
  429.         jc      value_out_of_range
  430.         mov     eax,[esi]
  431.         mul     dword [edi]
  432.         add     edx,ecx
  433.         jc      value_out_of_range
  434.         test    edx,1 shl 31
  435.         jnz     value_out_of_range
  436.         mov     [esi],eax
  437.         mov     [esi+4],edx
  438.         or      bl,bl
  439.         jz      mul_ok
  440.         not     dword [esi]
  441.         not     dword [esi+4]
  442.         add     dword [esi],1
  443.         adc     dword [esi+4],0
  444.       mul_ok:
  445.         pop     edx
  446.         or      dx,dx
  447.         jz      mul_calculated
  448.         cmp     word [edi+8],0
  449.         jne     invalid_value
  450.         cmp     byte [esi+8],0
  451.         je      mul_first_register_ok
  452.         mov     al,[edi]
  453.         cbw
  454.         cwde
  455.         cdq
  456.         cmp     edx,[edi+4]
  457.         jne     value_out_of_range
  458.         cmp     eax,[edi]
  459.         jne     value_out_of_range
  460.         imul    byte [esi+10]
  461.         mov     dl,ah
  462.         cbw
  463.         cmp     ah,dl
  464.         jne     value_out_of_range
  465.         mov     [esi+10],al
  466.         or      al,al
  467.         jnz     mul_first_register_ok
  468.         mov     [esi+8],al
  469.       mul_first_register_ok:
  470.         cmp     byte [esi+9],0
  471.         je      mul_calculated
  472.         mov     al,[edi]
  473.         cbw
  474.         cwde
  475.         cdq
  476.         cmp     edx,[edi+4]
  477.         jne     value_out_of_range
  478.         cmp     eax,[edi]
  479.         jne     value_out_of_range
  480.         imul    byte [esi+11]
  481.         mov     dl,ah
  482.         cbw
  483.         cmp     ah,dl
  484.         jne     value_out_of_range
  485.         mov     [esi+11],al
  486.         or      al,al
  487.         jnz     mul_calculated
  488.         mov     [esi+9],al
  489.       mul_calculated:
  490.         pop     esi
  491.         jmp     calculation_loop
  492.       calculate_div:
  493.         push    esi edx
  494.         mov     esi,ebx
  495.         call    div_64
  496.         pop     edx
  497.         or      dx,dx
  498.         jz      div_calculated
  499.         cmp     byte [esi+8],0
  500.         je      div_first_register_ok
  501.         mov     al,[edi]
  502.         cbw
  503.         cwde
  504.         cdq
  505.         cmp     edx,[edi+4]
  506.         jne     value_out_of_range
  507.         cmp     eax,[edi]
  508.         jne     value_out_of_range
  509.         or      al,al
  510.         jz      value_out_of_range
  511.         mov     al,[esi+10]
  512.         cbw
  513.         idiv    byte [edi]
  514.         or      ah,ah
  515.         jnz     invalid_use_of_symbol
  516.         mov     [esi+10],al
  517.       div_first_register_ok:
  518.         cmp     byte [esi+9],0
  519.         je      div_calculated
  520.         mov     al,[edi]
  521.         cbw
  522.         cwde
  523.         cdq
  524.         cmp     edx,[edi+4]
  525.         jne     value_out_of_range
  526.         cmp     eax,[edi]
  527.         jne     value_out_of_range
  528.         or      al,al
  529.         jz      value_out_of_range
  530.         mov     al,[esi+11]
  531.         cbw
  532.         idiv    byte [edi]
  533.         or      ah,ah
  534.         jnz     invalid_use_of_symbol
  535.         mov     [esi+11],al
  536.       div_calculated:
  537.         pop     esi
  538.         jmp     calculation_loop
  539.       calculate_mod:
  540.         push    esi
  541.         mov     esi,ebx
  542.         call    div_64
  543.         mov     [esi],eax
  544.         mov     [esi+4],edx
  545.         pop     esi
  546.         jmp     calculation_loop
  547.       calculate_and:
  548.         mov     eax,[edi]
  549.         and     [ebx],eax
  550.         mov     eax,[edi+4]
  551.         and     [ebx+4],eax
  552.         jmp     calculation_loop
  553.       calculate_or:
  554.         mov     eax,[edi]
  555.         or      [ebx],eax
  556.         mov     eax,[edi+4]
  557.         or      [ebx+4],eax
  558.         jmp     calculation_loop
  559.       calculate_xor:
  560.         mov     eax,[edi]
  561.         xor     [ebx],eax
  562.         mov     edx,[edi+4]
  563.         xor     [ebx+4],edx
  564.         cmp     [value_size],1
  565.         je      xor_byte
  566.         cmp     [value_size],2
  567.         je      xor_word
  568.         cmp     [value_size],4
  569.         je      xor_dword
  570.         cmp     [value_size],6
  571.         je      xor_pword
  572.       xor_calculated:
  573.         jmp     calculation_loop
  574.       prepare_xor_check:
  575.         cmp     edx,-1
  576.         je      xor_check_ready
  577.         xor     edx,[ebx+4]
  578.         xor     eax,[ebx]
  579.         cmp     edx,-1
  580.       xor_check_ready:
  581.         ret
  582.       xor_byte:
  583.         call    prepare_xor_check
  584.         jne     xor_calculated
  585.         xor     edx,[ebx+4]
  586.         jnz     xor_calculated
  587.         cmp     eax,0FFFFFF80h
  588.         jb      xor_calculated
  589.         xor     eax,[ebx]
  590.         cmp     eax,0FFh
  591.         ja      xor_calculated
  592.         mov     [ebx+4],edx
  593.         and     dword [ebx],0FFh
  594.         jmp     xor_calculated
  595.       xor_word:
  596.         call    prepare_xor_check
  597.         jne     xor_calculated
  598.         xor     edx,[ebx+4]
  599.         jnz     xor_calculated
  600.         cmp     eax,0FFFF8000h
  601.         jb      xor_calculated
  602.         xor     eax,[ebx]
  603.         cmp     eax,0FFFFh
  604.         ja      xor_calculated
  605.         mov     [ebx+4],edx
  606.         and     dword [ebx],0FFFFh
  607.         jmp     xor_calculated
  608.       xor_dword:
  609.         call    prepare_xor_check
  610.         jne     xor_calculated
  611.         xor     edx,[ebx+4]
  612.         jnz     xor_calculated
  613.         cmp     eax,80000000h
  614.         jb      xor_calculated
  615.         mov     [ebx+4],edx
  616.         jmp     xor_calculated
  617.       xor_pword:
  618.         cmp     edx,0FFFF8000h
  619.         jae     xor_pword_check
  620.         xor     edx,[ebx+4]
  621.         xor     eax,[ebx]
  622.         cmp     edx,0FFFF8000h
  623.         jb      xor_calculated
  624.       xor_pword_check:
  625.         xor     edx,[ebx+4]
  626.         cmp     edx,0FFFFh
  627.         ja      xor_calculated
  628.         and     dword [ebx+4],0FFFFh
  629.         jmp     xor_calculated
  630.       shr_negative:
  631.         not     dword [edi]
  632.         not     dword [edi+4]
  633.         add     dword [edi],1
  634.         adc     dword [edi+4],0
  635.       calculate_shl:
  636.         mov     eax,dword [edi+4]
  637.         bt      eax,31
  638.         jc      shl_negative
  639.         or      eax,eax
  640.         jnz     zero_value
  641.         mov     ecx,[edi]
  642.         cmp     ecx,64
  643.         jae     zero_value
  644.         mov     edx,[ebx+4]
  645.         mov     eax,[ebx]
  646.         cmp     ecx,32
  647.         jae     shl_high
  648.         shld    edx,eax,cl
  649.         shl     eax,cl
  650.         mov     [ebx],eax
  651.         mov     [ebx+4],edx
  652.         jmp     calculation_loop
  653.       shl_high:
  654.         sub     cl,32
  655.         shl     eax,cl
  656.         mov     [ebx+4],eax
  657.         mov     dword [ebx],0
  658.         jmp     calculation_loop
  659.       shl_negative:
  660.         not     dword [edi]
  661.         not     dword [edi+4]
  662.         add     dword [edi],1
  663.         adc     dword [edi+4],0
  664.       calculate_shr:
  665.         mov     eax,dword [edi+4]
  666.         bt      eax,31
  667.         jc      shr_negative
  668.         or      eax,eax
  669.         jnz     zero_value
  670.         mov     ecx,[edi]
  671.         cmp     ecx,64
  672.         jae     zero_value
  673.         mov     edx,[ebx+4]
  674.         mov     eax,[ebx]
  675.         cmp     ecx,32
  676.         jae     shr_high
  677.         cmp     [value_size],1
  678.         je      shr_byte
  679.         cmp     [value_size],2
  680.         je      shr_word
  681.         cmp     [value_size],4
  682.         je      shr_dword
  683.         cmp     [value_size],6
  684.         je      shr_pword
  685.       shr_regular:
  686.         shrd    eax,edx,cl
  687.         shr     edx,cl
  688.         mov     [ebx],eax
  689.         mov     [ebx+4],edx
  690.         jmp     calculation_loop
  691.       shr_byte:
  692.         cmp     edx,-1
  693.         jne     shr_regular
  694.         cmp     eax,0FFFFFF80h
  695.         jb      shr_regular
  696.         and     eax,0FFh
  697.         xor     edx,edx
  698.         jmp     shr_regular
  699.       shr_word:
  700.         cmp     edx,-1
  701.         jne     shr_regular
  702.         cmp     eax,0FFFF8000h
  703.         jb      shr_regular
  704.         and     eax,0FFFFh
  705.         xor     edx,edx
  706.         jmp     shr_regular
  707.       shr_dword:
  708.         cmp     edx,-1
  709.         jne     shr_regular
  710.         cmp     eax,80000000h
  711.         jb      shr_regular
  712.         xor     edx,edx
  713.         jmp     shr_regular
  714.       shr_pword:
  715.         cmp     edx,0FFFF8000h
  716.         jb      shr_regular
  717.         and     edx,0FFFFh
  718.         jmp     shr_regular
  719.       shr_high:
  720.         sub     cl,32
  721.         cmp     [value_size],1
  722.         je      shr_byte_32plus
  723.         cmp     [value_size],2
  724.         je      shr_word_32plus
  725.         cmp     [value_size],4
  726.         je      shr_dword_32plus
  727.         cmp     [value_size],6
  728.         je      shr_pword_32plus
  729.       shr_32plus:
  730.         shr     edx,cl
  731.         mov     [ebx],edx
  732.         mov     dword [ebx+4],0
  733.         jmp     calculation_loop
  734.       shr_byte_32plus:
  735.         cmp     edx,-1
  736.         jne     shr_32plus
  737.         cmp     eax,-80h
  738.         jb      shr_32plus
  739.         jmp     zero_value
  740.       shr_word_32plus:
  741.         cmp     edx,-1
  742.         jne     shr_32plus
  743.         cmp     eax,-8000h
  744.         jb      shr_32plus
  745.         jmp     zero_value
  746.       shr_dword_32plus:
  747.         cmp     edx,-1
  748.         jne     shr_32plus
  749.         cmp     eax,-80000000h
  750.         jb      shr_32plus
  751.         jmp     zero_value
  752.       shr_pword_32plus:
  753.         cmp     edx,-8000h
  754.         jb      shr_32plus
  755.         and     edx,0FFFFh
  756.         jmp     shr_32plus
  757.       zero_value:
  758.         mov     dword [ebx],0
  759.         mov     dword [ebx+4],0
  760.         jmp     calculation_loop
  761.       calculate_not:
  762.         cmp     word [edi+8],0
  763.         jne     invalid_expression
  764.         cmp     byte [edi+12],0
  765.         je      not_ok
  766.         cmp     [error_line],0
  767.         jne     not_ok
  768.         mov     eax,[current_line]
  769.         mov     [error_line],eax
  770.         mov     [error],invalid_use_of_symbol
  771.       not_ok:
  772.         cmp     [value_size],1
  773.         je      not_byte
  774.         cmp     [value_size],2
  775.         je      not_word
  776.         cmp     [value_size],4
  777.         je      not_dword
  778.         cmp     [value_size],6
  779.         je      not_pword
  780.       not_qword:
  781.         not     dword [edi]
  782.         not     dword [edi+4]
  783.         add     edi,14h
  784.         jmp     calculation_loop
  785.       not_byte:
  786.         cmp     dword [edi+4],0
  787.         jne     not_qword
  788.         cmp     word [edi+2],0
  789.         jne     not_qword
  790.         cmp     byte [edi+1],0
  791.         jne     not_qword
  792.         not     byte [edi]
  793.         add     edi,14h
  794.         jmp     calculation_loop
  795.       not_word:
  796.         cmp     dword [edi+4],0
  797.         jne     not_qword
  798.         cmp     word [edi+2],0
  799.         jne     not_qword
  800.         not     word [edi]
  801.         add     edi,14h
  802.         jmp     calculation_loop
  803.       not_dword:
  804.         cmp     dword [edi+4],0
  805.         jne     not_qword
  806.         not     dword [edi]
  807.         add     edi,14h
  808.         jmp     calculation_loop
  809.       not_pword:
  810.         cmp     word [edi+6],0
  811.         jne     not_qword
  812.         not     dword [edi]
  813.         not     word [edi+4]
  814.         add     edi,14h
  815.         jmp     calculation_loop
  816.       calculate_neg:
  817.         cmp     word [edi+8],0
  818.         jne     invalid_expression
  819.         cmp     byte [edi+12],0
  820.         je      neg_ok
  821.         cmp     [error_line],0
  822.         jne     neg_ok
  823.         mov     eax,[current_line]
  824.         mov     [error_line],eax
  825.         mov     [error],invalid_use_of_symbol
  826.       neg_ok:
  827.         mov     eax,[edi]
  828.         mov     edx,[edi+4]
  829.         mov     dword [edi],0
  830.         mov     dword [edi+4],0
  831.         sub     [edi],eax
  832.         sbb     [edi+4],edx
  833.         add     edi,14h
  834.         jmp     calculation_loop
  835.       calculate_rva:
  836.         cmp     word [edi+8],0
  837.         jne     invalid_expression
  838.         cmp     [output_format],5
  839.         je      calculate_gotoff
  840.         cmp     [output_format],4
  841.         je      calculate_coff_rva
  842.         cmp     [output_format],3
  843.         jne     invalid_expression
  844.         test    [format_flags],8
  845.         jnz     pe64_rva
  846.         mov     al,2
  847.         bt      [resolver_flags],0
  848.         jc      rva_type_ok
  849.         xor     al,al
  850.       rva_type_ok:
  851.         cmp     byte [edi+12],al
  852.         je      rva_ok
  853.         cmp     [error_line],0
  854.         jne     rva_ok
  855.         mov     eax,[current_line]
  856.         mov     [error_line],eax
  857.         mov     [error],invalid_use_of_symbol
  858.       rva_ok:
  859.         mov     byte [edi+12],0
  860.         mov     eax,[code_start]
  861.         mov     eax,[eax+34h]
  862.         cdq
  863.         sub     [edi],eax
  864.         sbb     [edi+4],edx
  865.         add     edi,14h
  866.         jmp     calculation_loop
  867.       pe64_rva:
  868.         mov     al,4
  869.         bt      [resolver_flags],0
  870.         jc      pe64_rva_type_ok
  871.         xor     al,al
  872.       pe64_rva_type_ok:
  873.         cmp     byte [edi+12],al
  874.         je      pe64_rva_ok
  875.         cmp     [error_line],0
  876.         jne     pe64_rva_ok
  877.         mov     eax,[current_line]
  878.         mov     [error_line],eax
  879.         mov     [error],invalid_use_of_symbol
  880.       pe64_rva_ok:
  881.         mov     byte [edi+12],0
  882.         mov     eax,[code_start]
  883.         mov     edx,[eax+34h]
  884.         mov     eax,[eax+30h]
  885.         sub     [edi],eax
  886.         sbb     [edi+4],edx
  887.         add     edi,14h
  888.         jmp     calculation_loop
  889.       calculate_gotoff:
  890.         test    [format_flags],8+1
  891.         jnz     invalid_expression
  892.       calculate_coff_rva:
  893.         mov     dl,5
  894.         cmp     byte [edi+12],2
  895.         je      change_value_type
  896.       incorrect_change_of_value_type:
  897.         cmp     [error_line],0
  898.         jne     change_value_type
  899.         mov     eax,[current_line]
  900.         mov     [error_line],eax
  901.         mov     [error],invalid_use_of_symbol
  902.       change_value_type:
  903.         mov     byte [edi+12],dl
  904.         add     edi,14h
  905.         jmp     calculation_loop
  906.       calculate_plt:
  907.         cmp     word [edi+8],0
  908.         jne     invalid_expression
  909.         cmp     [output_format],5
  910.         jne     invalid_expression
  911.         test    [format_flags],1
  912.         jnz     invalid_expression
  913.         mov     dl,6
  914.         mov     dh,2
  915.         test    [format_flags],8
  916.         jz      check_value_for_plt
  917.         mov     dh,4
  918.       check_value_for_plt:
  919.         mov     eax,[edi]
  920.         or      eax,[edi+4]
  921.         jnz     incorrect_change_of_value_type
  922.         cmp     byte [edi+12],dh
  923.         jne     incorrect_change_of_value_type
  924.         mov     eax,[edi+16]
  925.         cmp     byte [eax],80h
  926.         jne     incorrect_change_of_value_type
  927.         jmp     change_value_type
  928.       div_64:
  929.         xor     ebx,ebx
  930.         cmp     dword [edi],0
  931.         jne     divider_ok
  932.         cmp     dword [edi+4],0
  933.         jne     divider_ok
  934.         cmp     [next_pass_needed],0
  935.         je      value_out_of_range
  936.         jmp     div_done
  937.       divider_ok:
  938.         bt      dword [esi+4],31
  939.         jnc     div_first_sign_ok
  940.         not     dword [esi]
  941.         not     dword [esi+4]
  942.         add     dword [esi],1
  943.         adc     dword [esi+4],0
  944.         not     bx
  945.       div_first_sign_ok:
  946.         bt      dword [edi+4],31
  947.         jnc     div_second_sign_ok
  948.         not     dword [edi]
  949.         not     dword [edi+4]
  950.         add     dword [edi],1
  951.         adc     dword [edi+4],0
  952.         not     bl
  953.       div_second_sign_ok:
  954.         cmp     dword [edi+4],0
  955.         jne     div_high
  956.         mov     ecx,[edi]
  957.         mov     eax,[esi+4]
  958.         xor     edx,edx
  959.         div     ecx
  960.         mov     [esi+4],eax
  961.         mov     eax,[esi]
  962.         div     ecx
  963.         mov     [esi],eax
  964.         mov     eax,edx
  965.         xor     edx,edx
  966.         jmp     div_done
  967.       div_high:
  968.         mov     eax,[esi+4]
  969.         xor     edx,edx
  970.         div     dword [edi+4]
  971.         mov     ebx,[esi]
  972.         mov     [esi],eax
  973.         mov     dword [esi+4],0
  974.         mov     ecx,edx
  975.         mul     dword [edi]
  976.       div_high_loop:
  977.         cmp     ecx,edx
  978.         ja      div_high_done
  979.         jb      div_high_large_correction
  980.         cmp     ebx,eax
  981.         jae     div_high_done
  982.       div_high_correction:
  983.         dec     dword [esi]
  984.         sub     eax,[edi]
  985.         sbb     edx,[edi+4]
  986.         jnc     div_high_loop
  987.       div_high_done:
  988.         sub     ebx,eax
  989.         sbb     ecx,edx
  990.         mov     edx,ecx
  991.         mov     eax,ebx
  992.         ret
  993.       div_high_large_correction:
  994.         push    eax edx
  995.         mov     eax,edx
  996.         sub     eax,ecx
  997.         xor     edx,edx
  998.         div     dword [edi+4]
  999.         shr     eax,1
  1000.         jz      div_high_small_correction
  1001.         sub     [esi],eax
  1002.         push    eax
  1003.         mul     dword [edi+4]
  1004.         sub     dword [esp+4],eax
  1005.         pop     eax
  1006.         mul     dword [edi]
  1007.         sub     dword [esp+4],eax
  1008.         sbb     dword [esp],edx
  1009.         pop     edx eax
  1010.         jmp     div_high_loop
  1011.       div_high_small_correction:
  1012.         pop     edx eax
  1013.         jmp     div_high_correction
  1014.       div_done:
  1015.         or      bh,bh
  1016.         jz      remainder_ok
  1017.         not     eax
  1018.         not     edx
  1019.         add     eax,1
  1020.         adc     edx,0
  1021.       remainder_ok:
  1022.         or      bl,bl
  1023.         jz      div_ok
  1024.         not     dword [esi]
  1025.         not     dword [esi+4]
  1026.         add     dword [esi],1
  1027.         adc     dword [esi+4],0
  1028.       div_ok:
  1029.         ret
  1030.       convert_fp:
  1031.         inc     esi
  1032.         mov     word [edi+8],0
  1033.         mov     byte [edi+12],0
  1034.         mov     al,[value_size]
  1035.         cmp     al,2
  1036.         je      convert_fp_word
  1037.         cmp     al,4
  1038.         je      convert_fp_dword
  1039.         cmp     al,8
  1040.         je      convert_fp_qword
  1041.         jmp     invalid_value
  1042.       convert_fp_word:
  1043.         xor     eax,eax
  1044.         cmp     word [esi+8],8000h
  1045.         je      fp_word_store
  1046.         mov     bx,[esi+8]
  1047.         mov     ax,[esi+6]
  1048.         shl     ax,1
  1049.         shr     ax,6
  1050.         jnc     fp_word_ok
  1051.         inc     ax
  1052.         bt      ax,10
  1053.         jnc     fp_word_ok
  1054.         and     ax,1 shl 10 - 1
  1055.         inc     bx
  1056.         shr     ax,1
  1057.       fp_word_ok:
  1058.         add     bx,0Fh
  1059.         cmp     bx,01Fh
  1060.         jge     value_out_of_range
  1061.         cmp     bx,0
  1062.         jg      fp_word_exp_ok
  1063.         or      ax,1 shl 10
  1064.         mov     cx,bx
  1065.         neg     cx
  1066.         inc     cx
  1067.         cmp     cx,10
  1068.         ja      value_out_of_range
  1069.         xor     bx,bx
  1070.         shr     ax,cl
  1071.         jnc     fp_word_exp_ok
  1072.         inc     ax
  1073.         test    ax,1 shl 10
  1074.         jz      fp_word_exp_ok
  1075.         and     ax,1 shl 10 - 1
  1076.         inc     bx
  1077.       fp_word_exp_ok:
  1078.         shl     bx,10
  1079.         or      ax,bx
  1080.       fp_word_store:
  1081.         mov     bl,[esi+11]
  1082.         shl     bx,15
  1083.         or      ax,bx
  1084.         mov     [edi],eax
  1085.         xor     eax,eax
  1086.         mov     [edi+4],eax
  1087.         add     esi,13
  1088.         ret
  1089.       convert_fp_dword:
  1090.         xor     eax,eax
  1091.         cmp     word [esi+8],8000h
  1092.         je      fp_dword_store
  1093.         mov     bx,[esi+8]
  1094.         mov     eax,[esi+4]
  1095.         shl     eax,1
  1096.         shr     eax,9
  1097.         jnc     fp_dword_ok
  1098.         inc     eax
  1099.         bt      eax,23
  1100.         jnc     fp_dword_ok
  1101.         and     eax,1 shl 23 - 1
  1102.         inc     bx
  1103.         shr     eax,1
  1104.       fp_dword_ok:
  1105.         add     bx,7Fh
  1106.         cmp     bx,0FFh
  1107.         jge     value_out_of_range
  1108.         cmp     bx,0
  1109.         jg      fp_dword_exp_ok
  1110.         or      eax,1 shl 23
  1111.         mov     cx,bx
  1112.         neg     cx
  1113.         inc     cx
  1114.         cmp     cx,23
  1115.         ja      value_out_of_range
  1116.         xor     bx,bx
  1117.         shr     eax,cl
  1118.         jnc     fp_dword_exp_ok
  1119.         inc     eax
  1120.         test    eax,1 shl 23
  1121.         jz      fp_dword_exp_ok
  1122.         and     eax,1 shl 23 - 1
  1123.         inc     bx
  1124.       fp_dword_exp_ok:
  1125.         shl     ebx,23
  1126.         or      eax,ebx
  1127.       fp_dword_store:
  1128.         mov     bl,[esi+11]
  1129.         shl     ebx,31
  1130.         or      eax,ebx
  1131.         mov     [edi],eax
  1132.         xor     eax,eax
  1133.         mov     [edi+4],eax
  1134.         add     esi,13
  1135.         ret
  1136.       convert_fp_qword:
  1137.         xor     eax,eax
  1138.         xor     edx,edx
  1139.         cmp     word [esi+8],8000h
  1140.         je      fp_qword_store
  1141.         mov     bx,[esi+8]
  1142.         mov     eax,[esi]
  1143.         mov     edx,[esi+4]
  1144.         add     eax,eax
  1145.         adc     edx,edx
  1146.         mov     ecx,edx
  1147.         shr     edx,12
  1148.         shrd    eax,ecx,12
  1149.         jnc     fp_qword_ok
  1150.         add     eax,1
  1151.         adc     edx,0
  1152.         bt      edx,20
  1153.         jnc     fp_qword_ok
  1154.         and     edx,1 shl 20 - 1
  1155.         inc     bx
  1156.         shr     edx,1
  1157.         rcr     eax,1
  1158.       fp_qword_ok:
  1159.         add     bx,3FFh
  1160.         cmp     bx,7FFh
  1161.         jge     value_out_of_range
  1162.         cmp     bx,0
  1163.         jg      fp_qword_exp_ok
  1164.         or      edx,1 shl 20
  1165.         mov     cx,bx
  1166.         neg     cx
  1167.         inc     cx
  1168.         cmp     cx,52
  1169.         ja      value_out_of_range
  1170.         cmp     cx,32
  1171.         jbe     fp_qword_small_shift
  1172.         sub     cx,32
  1173.         mov     eax,edx
  1174.         xor     edx,edx
  1175.         shr     eax,cl
  1176.         jmp     fp_qword_shift_done
  1177.       fp_qword_small_shift:
  1178.         mov     ebx,edx
  1179.         shr     edx,cl
  1180.         shrd    eax,ebx,cl
  1181.       fp_qword_shift_done:
  1182.         mov     bx,0
  1183.         jnc     fp_qword_exp_ok
  1184.         add     eax,1
  1185.         adc     edx,0
  1186.         test    edx,1 shl 20
  1187.         jz      fp_qword_exp_ok
  1188.         and     edx,1 shl 20 - 1
  1189.         inc     bx
  1190.       fp_qword_exp_ok:
  1191.         shl     ebx,20
  1192.         or      edx,ebx
  1193.       fp_qword_store:
  1194.         mov     bl,[esi+11]
  1195.         shl     ebx,31
  1196.         or      edx,ebx
  1197.         mov     [edi],eax
  1198.         mov     [edi+4],edx
  1199.         add     esi,13
  1200.         ret
  1201.       get_string_value:
  1202.         inc     esi
  1203.         lods    dword [esi]
  1204.         mov     ecx,eax
  1205.         cmp     ecx,8
  1206.         ja      value_out_of_range
  1207.         mov     edx,edi
  1208.         xor     eax,eax
  1209.         stos    dword [edi]
  1210.         stos    dword [edi]
  1211.         mov     edi,edx
  1212.         rep     movs byte [edi],[esi]
  1213.         mov     edi,edx
  1214.         inc     esi
  1215.         mov     word [edi+8],0
  1216.         mov     byte [edi+12],0
  1217.         ret
  1218.  
  1219. get_byte_value:
  1220.         mov     [value_size],1
  1221.         mov     [size_override],-1
  1222.         call    calculate_expression
  1223.         mov     eax,[edi+16]
  1224.         mov     [symbol_identifier],eax
  1225.         mov     [value_type],0
  1226.         cmp     word [edi+8],0
  1227.         jne     invalid_value
  1228.         cmp     byte [edi+12],0
  1229.         je      check_byte_value
  1230.         cmp     [error_line],0
  1231.         jne     check_byte_value
  1232.         mov     eax,[current_line]
  1233.         mov     [error_line],eax
  1234.         mov     [error],invalid_use_of_symbol
  1235.       check_byte_value:
  1236.         mov     eax,[edi]
  1237.         mov     edx,[edi+4]
  1238.         or      edx,edx
  1239.         jz      byte_positive
  1240.         cmp     edx,-1
  1241.         jne     range_exceeded
  1242.         cmp     eax,-80h
  1243.         jb      range_exceeded
  1244.         ret
  1245.       byte_positive:
  1246.         cmp     eax,100h
  1247.         jae     range_exceeded
  1248.       return_byte_value:
  1249.         ret
  1250.       range_exceeded:
  1251.         xor     eax,eax
  1252.         xor     edx,edx
  1253.         cmp     [error_line],0
  1254.         jne     return_byte_value
  1255.         mov     ecx,[current_line]
  1256.         mov     [error_line],ecx
  1257.         mov     [error],value_out_of_range
  1258.         ret
  1259. get_word_value:
  1260.         mov     [value_size],2
  1261.         mov     [size_override],-1
  1262.         call    calculate_expression
  1263.         cmp     word [edi+8],0
  1264.         jne     invalid_value
  1265.         mov     eax,[edi+16]
  1266.         mov     [symbol_identifier],eax
  1267.         mov     al,[edi+12]
  1268.         mov     [value_type],al
  1269.         cmp     al,2
  1270.         jb      check_word_value
  1271.         cmp     [error_line],0
  1272.         jne     check_word_value
  1273.         mov     eax,[current_line]
  1274.         mov     [error_line],eax
  1275.         mov     [error],invalid_use_of_symbol
  1276.       check_word_value:
  1277.         mov     eax,[edi]
  1278.         mov     edx,[edi+4]
  1279.         or      edx,edx
  1280.         jz      word_positive
  1281.         cmp     edx,-1
  1282.         jne     range_exceeded
  1283.         cmp     eax,-8000h
  1284.         jb      range_exceeded
  1285.         ret
  1286.       word_positive:
  1287.         cmp     eax,10000h
  1288.         jae     range_exceeded
  1289.         ret
  1290. get_dword_value:
  1291.         mov     [value_size],4
  1292.         mov     [size_override],-1
  1293.         call    calculate_expression
  1294.         cmp     word [edi+8],0
  1295.         jne     invalid_value
  1296.         mov     eax,[edi+16]
  1297.         mov     [symbol_identifier],eax
  1298.         mov     al,[edi+12]
  1299.         mov     [value_type],al
  1300.         cmp     al,4
  1301.         jne     check_dword_value
  1302.         mov     [value_type],2
  1303.         mov     eax,[edi]
  1304.         cdq
  1305.         cmp     edx,[edi+4]
  1306.         jne     range_exceeded
  1307.         ret
  1308.       check_dword_value:
  1309.         mov     eax,[edi]
  1310.         mov     edx,[edi+4]
  1311.         or      edx,edx
  1312.         jz      dword_positive
  1313.         cmp     edx,-1
  1314.         jne     range_exceeded
  1315.         bt      eax,31
  1316.         jnc     range_exceeded
  1317.       dword_positive:
  1318.         ret
  1319. get_pword_value:
  1320.         mov     [value_size],6
  1321.         mov     [size_override],-1
  1322.         call    calculate_expression
  1323.         mov     eax,[edi+16]
  1324.         mov     [symbol_identifier],eax
  1325.         cmp     word [edi+8],0
  1326.         jne     invalid_value
  1327.         mov     al,[edi+12]
  1328.         mov     [value_type],al
  1329.         cmp     al,4
  1330.         jne     check_pword_value
  1331.         cmp     [error_line],0
  1332.         jne     check_pword_value
  1333.         mov     eax,[current_line]
  1334.         mov     [error_line],eax
  1335.         mov     [error],invalid_use_of_symbol
  1336.       check_pword_value:
  1337.         mov     eax,[edi]
  1338.         mov     edx,[edi+4]
  1339.         cmp     edx,10000h
  1340.         jge     range_exceeded
  1341.         cmp     edx,-8000h
  1342.         jl      range_exceeded
  1343.         ret
  1344. get_qword_value:
  1345.         mov     [value_size],8
  1346.         mov     [size_override],-1
  1347.         call    calculate_expression
  1348.         cmp     word [edi+8],0
  1349.         jne     invalid_value
  1350.         mov     eax,[edi+16]
  1351.         mov     [symbol_identifier],eax
  1352.         mov     al,[edi+12]
  1353.         mov     [value_type],al
  1354.       check_qword_value:
  1355.         mov     eax,[edi]
  1356.         mov     edx,[edi+4]
  1357.         ret
  1358. get_count_value:
  1359.         mov     [value_size],8
  1360.         mov     [size_override],-1
  1361.         call    calculate_expression
  1362.         cmp     word [edi+8],0
  1363.         jne     invalid_value
  1364.         mov     al,[edi+12]
  1365.         or      al,al
  1366.         jz      check_count_value
  1367.         cmp     [error_line],0
  1368.         jne     check_count_value
  1369.         mov     eax,[current_line]
  1370.         mov     [error_line],eax
  1371.         mov     [error],invalid_use_of_symbol
  1372.       check_count_value:
  1373.         mov     eax,[edi]
  1374.         mov     edx,[edi+4]
  1375.         or      edx,edx
  1376.         jnz     invalid_count_value
  1377.         ret
  1378.       invalid_count_value:
  1379.         cmp     [error_line],0
  1380.         jne     zero_count
  1381.         mov     eax,[current_line]
  1382.         mov     [error_line],eax
  1383.         mov     [error],invalid_value
  1384.       zero_count:
  1385.         xor     eax,eax
  1386.         ret
  1387. get_value:
  1388.         mov     [operand_size],0
  1389.         lods    byte [esi]
  1390.         call    get_size_operator
  1391.         cmp     al,'('
  1392.         jne     invalid_value
  1393.         mov     al,[operand_size]
  1394.         cmp     al,1
  1395.         je      value_byte
  1396.         cmp     al,2
  1397.         je      value_word
  1398.         cmp     al,4
  1399.         je      value_dword
  1400.         cmp     al,6
  1401.         je      value_pword
  1402.         cmp     al,8
  1403.         je      value_qword
  1404.         or      al,al
  1405.         jnz     invalid_value
  1406.       value_qword:
  1407.         call    get_qword_value
  1408.         ret
  1409.       value_pword:
  1410.         call    get_pword_value
  1411.         movzx   edx,dx
  1412.         ret
  1413.       value_dword:
  1414.         call    get_dword_value
  1415.         xor     edx,edx
  1416.         ret
  1417.       value_word:
  1418.         call    get_word_value
  1419.         xor     edx,edx
  1420.         movzx   eax,ax
  1421.         ret
  1422.       value_byte:
  1423.         call    get_byte_value
  1424.         xor     edx,edx
  1425.         movzx   eax,al
  1426.         ret
  1427. get_address_word_value:
  1428.         mov     [address_size],2
  1429.         mov     [value_size],2
  1430.         jmp     calculate_address
  1431. get_address_dword_value:
  1432.         mov     [address_size],4
  1433.         mov     [value_size],4
  1434.         jmp     calculate_address
  1435. get_address_qword_value:
  1436.         mov     [address_size],8
  1437.         mov     [value_size],8
  1438.         jmp     calculate_address
  1439. get_address_value:
  1440.         mov     [address_size],0
  1441.         mov     [value_size],8
  1442.       calculate_address:
  1443.         cmp     byte [esi],'.'
  1444.         je      invalid_address
  1445.         call    calculate_expression
  1446.         mov     eax,[edi+16]
  1447.         mov     [address_symbol],eax
  1448.         mov     al,[edi+12]
  1449.         mov     [value_type],al
  1450.         cmp     al,6
  1451.         je      special_address_type_32bit
  1452.         cmp     al,5
  1453.         je      special_address_type_32bit
  1454.         ja      invalid_use_of_symbol
  1455.         test    al,1
  1456.         jnz     invalid_use_of_symbol
  1457.         or      al,al
  1458.         jz      address_size_ok
  1459.         shl     al,5
  1460.         jmp     address_symbol_ok
  1461.       special_address_type_32bit:
  1462.         mov     al,40h
  1463.       address_symbol_ok:
  1464.         mov     ah,[address_size]
  1465.         or      [address_size],al
  1466.         shr     al,4
  1467.         or      ah,ah
  1468.         jz      address_size_ok
  1469.         cmp     al,ah
  1470.         je      address_size_ok
  1471.         cmp     ax,0804h
  1472.         jne     address_sizes_do_not_agree
  1473.         cmp     [value_type],2
  1474.         ja      value_type_correction_ok
  1475.         mov     [value_type],2
  1476.       value_type_correction_ok:
  1477.         mov     eax,[edi]
  1478.         cdq
  1479.         cmp     edx,[edi+4]
  1480.         je      address_size_ok
  1481.         cmp     [error_line],0
  1482.         jne     address_size_ok
  1483.         mov     ecx,[current_line]
  1484.         mov     [error_line],ecx
  1485.         mov     [error],value_out_of_range
  1486.       address_size_ok:
  1487.         xor     ebx,ebx
  1488.         xor     ecx,ecx
  1489.         mov     cl,[value_type]
  1490.         shl     ecx,16
  1491.         mov     ch,[address_size]
  1492.         cmp     word [edi+8],0
  1493.         je      check_immediate_address
  1494.         mov     al,[edi+8]
  1495.         mov     dl,[edi+10]
  1496.         call    get_address_register
  1497.         mov     al,[edi+9]
  1498.         mov     dl,[edi+11]
  1499.         call    get_address_register
  1500.         mov     ax,bx
  1501.         shr     ah,4
  1502.         shr     al,4
  1503.         or      bh,bh
  1504.         jz      check_address_registers
  1505.         or      bl,bl
  1506.         jz      check_address_registers
  1507.         cmp     al,ah
  1508.         jne     invalid_address
  1509.       check_address_registers:
  1510.         or      al,ah
  1511.         mov     ah,[address_size]
  1512.         and     ah,0Fh
  1513.         jz      address_registers_sizes_ok
  1514.         cmp     al,ah
  1515.         jne     address_sizes_do_not_match
  1516.       address_registers_sizes_ok:
  1517.         cmp     al,4
  1518.         je      sib_allowed
  1519.         cmp     al,8
  1520.         je      sib_allowed
  1521.         cmp     al,0Fh
  1522.         je      check_ip_relative_address
  1523.         or      cl,cl
  1524.         jz      check_word_value
  1525.         cmp     cl,1
  1526.         je      check_word_value
  1527.         jmp     invalid_address
  1528.       address_sizes_do_not_match:
  1529.         cmp     al,0Fh
  1530.         jne     invalid_address
  1531.         mov     al,bh
  1532.         and     al,0Fh
  1533.         cmp     al,ah
  1534.         jne     invalid_address
  1535.       check_ip_relative_address:
  1536.         cmp     bh,0F4h
  1537.         je      check_dword_value
  1538.         cmp     bh,0F8h
  1539.         jne     invalid_address
  1540.         mov     eax,[edi]
  1541.         cdq
  1542.         cmp     edx,[edi+4]
  1543.         jne     range_exceeded
  1544.         ret
  1545.       get_address_register:
  1546.         or      al,al
  1547.         jz      address_register_ok
  1548.         cmp     dl,1
  1549.         jne     scaled_register
  1550.         or      bh,bh
  1551.         jnz     scaled_register
  1552.         mov     bh,al
  1553.       address_register_ok:
  1554.         ret
  1555.       scaled_register:
  1556.         or      bl,bl
  1557.         jnz     invalid_address
  1558.         mov     bl,al
  1559.         mov     cl,dl
  1560.         jmp     address_register_ok
  1561.       sib_allowed:
  1562.         or      bh,bh
  1563.         jnz     check_index_with_base
  1564.         cmp     cl,3
  1565.         je      special_index_scale
  1566.         cmp     cl,5
  1567.         je      special_index_scale
  1568.         cmp     cl,9
  1569.         je      special_index_scale
  1570.         cmp     cl,2
  1571.         jne     check_index_scale
  1572.         cmp     bl,45h
  1573.         jne     special_index_scale
  1574.         cmp     [code_type],64
  1575.         je      special_index_scale
  1576.         cmp     [segment_register],4
  1577.         jne     special_index_scale
  1578.         cmp     [value_type],0
  1579.         jne     check_index_scale
  1580.         mov     al,[edi]
  1581.         cbw
  1582.         cwde
  1583.         cmp     eax,[edi]
  1584.         jne     check_index_scale
  1585.         cdq
  1586.         cmp     edx,[edi+4]
  1587.         jne     check_immediate_address
  1588.       special_index_scale:
  1589.         mov     bh,bl
  1590.         dec     cl
  1591.       check_immediate_address:
  1592.         mov     al,[address_size]
  1593.         and     al,0Fh
  1594.         cmp     al,2
  1595.         je      check_word_value
  1596.         cmp     al,4
  1597.         je      check_dword_value
  1598.         cmp     al,8
  1599.         je      check_qword_value
  1600.         or      al,al
  1601.         jnz     invalid_value
  1602.         cmp     [code_type],64
  1603.         jne     check_dword_value
  1604.         jmp     check_qword_value
  1605.       check_index_with_base:
  1606.         cmp     cl,1
  1607.         jne     check_index_scale
  1608.         cmp     bl,44h
  1609.         je      swap_base_with_index
  1610.         cmp     bl,84h
  1611.         je      swap_base_with_index
  1612.         cmp     [code_type],64
  1613.         je      check_for_rbp_base
  1614.         cmp     bl,45h
  1615.         jne     check_for_ebp_base
  1616.         cmp     [segment_register],3
  1617.         je      swap_base_with_index
  1618.         jmp     check_immediate_address
  1619.       check_for_ebp_base:
  1620.         cmp     bh,45h
  1621.         jne     check_immediate_address
  1622.         cmp     [segment_register],4
  1623.         jne     check_immediate_address
  1624.       swap_base_with_index:
  1625.         xchg    bl,bh
  1626.         jmp     check_immediate_address
  1627.       check_for_rbp_base:
  1628.         cmp     bh,45h
  1629.         je      swap_base_with_index
  1630.         cmp     bh,85h
  1631.         je      swap_base_with_index
  1632.         jmp     check_immediate_address
  1633.       check_index_scale:
  1634.         test    cl,not 1111b
  1635.         jnz     invalid_address
  1636.         mov     al,cl
  1637.         dec     al
  1638.         and     al,cl
  1639.         jz      check_immediate_address
  1640.         jmp     invalid_address
  1641. calculate_relative_offset:
  1642.         cmp     [value_undefined],0
  1643.         jne     relative_offset_ok
  1644.         test    bh,bh
  1645.         setne   ch
  1646.         cmp     bx,word [org_registers]
  1647.         je      origin_registers_ok
  1648.         xchg    bh,bl
  1649.         xchg    ch,cl
  1650.         cmp     bx,word [org_registers]
  1651.         jne     invalid_value
  1652.       origin_registers_ok:
  1653.         cmp     cx,word [org_registers+2]
  1654.         jne     invalid_value
  1655.         add     eax,dword [org_origin]
  1656.         adc     edx,dword [org_origin+4]
  1657.         sub     eax,edi
  1658.         sbb     edx,0
  1659.         mov     bl,[value_type]
  1660.         or      bl,bl
  1661.         je      relative_offset_ok
  1662.         test    bl,1
  1663.         jnz     invalid_use_of_symbol
  1664.         mov     ecx,[address_symbol]
  1665.         mov     [symbol_identifier],ecx
  1666.         cmp     bl,6
  1667.         je      plt_relative_offset
  1668.         cmp     bl,[labels_type]
  1669.         jne     invalid_use_of_symbol
  1670.         mov     [value_type],0
  1671.         cmp     ecx,[org_symbol]
  1672.         je      relative_offset_ok
  1673.         mov     [value_type],3
  1674.       relative_offset_ok:
  1675.         ret
  1676.       plt_relative_offset:
  1677.         mov     [value_type],7
  1678.         ret
  1679.  
  1680. calculate_logical_expression:
  1681.         xor     al,al
  1682.   calculate_embedded_logical_expression:
  1683.         mov     [logical_value_wrapping],al
  1684.         call    get_logical_value
  1685.       logical_loop:
  1686.         cmp     byte [esi],'|'
  1687.         je      logical_or
  1688.         cmp     byte [esi],'&'
  1689.         je      logical_and
  1690.         ret
  1691.       logical_or:
  1692.         inc     esi
  1693.         or      al,al
  1694.         jnz     logical_value_already_determined
  1695.         push    eax
  1696.         call    get_logical_value
  1697.         pop     ebx
  1698.         or      al,bl
  1699.         jmp     logical_loop
  1700.       logical_and:
  1701.         inc     esi
  1702.         or      al,al
  1703.         jz      logical_value_already_determined
  1704.         push    eax
  1705.         call    get_logical_value
  1706.         pop     ebx
  1707.         and     al,bl
  1708.         jmp     logical_loop
  1709.       logical_value_already_determined:
  1710.         push    eax
  1711.         call    skip_logical_value
  1712.         jc      invalid_expression
  1713.         pop     eax
  1714.         jmp     logical_loop
  1715.   get_logical_value:
  1716.         xor     al,al
  1717.       check_for_negation:
  1718.         cmp     byte [esi],'~'
  1719.         jne     negation_ok
  1720.         inc     esi
  1721.         xor     al,-1
  1722.         jmp     check_for_negation
  1723.       negation_ok:
  1724.         push    eax
  1725.         mov     al,[esi]
  1726.         cmp     al,'{'
  1727.         je      logical_expression
  1728.         cmp     al,0FFh
  1729.         je      invalid_expression
  1730.         cmp     al,88h
  1731.         je      check_for_defined
  1732.         cmp     al,89h
  1733.         je      check_for_used
  1734.         cmp     al,'0'
  1735.         je      given_false
  1736.         cmp     al,'1'
  1737.         je      given_true
  1738.         call    get_value
  1739.         mov     bl,[value_type]
  1740.         push    eax edx ebx
  1741.         mov     al,[esi]
  1742.         or      al,al
  1743.         jz      logical_number
  1744.         cmp     al,0Fh
  1745.         je      logical_number
  1746.         cmp     al,'}'
  1747.         je      logical_number
  1748.         cmp     al,'&'
  1749.         je      logical_number
  1750.         cmp     al,'|'
  1751.         je      logical_number
  1752.         inc     esi
  1753.         mov     [compare_type],al
  1754.         call    get_value
  1755.         pop     ebx
  1756.         cmp     [next_pass_needed],0
  1757.         jne     values_ok
  1758.         cmp     bl,[value_type]
  1759.         jne     invalid_use_of_symbol
  1760.       values_ok:
  1761.         pop     ecx ebx
  1762.         cmp     [compare_type],'='
  1763.         je      check_equal
  1764.         cmp     [compare_type],'>'
  1765.         je      check_greater
  1766.         cmp     [compare_type],'<'
  1767.         je      check_less
  1768.         cmp     [compare_type],0F1h
  1769.         je      check_not_equal
  1770.         cmp     [compare_type],0F2h
  1771.         je      check_not_less
  1772.         cmp     [compare_type],0F3h
  1773.         je      check_not_greater
  1774.         jmp     invalid_expression
  1775.       check_equal:
  1776.         cmp     eax,ebx
  1777.         jne     return_false
  1778.         cmp     edx,ecx
  1779.         jne     return_false
  1780.         jmp     return_true
  1781.       check_greater:
  1782.         cmp     edx,ecx
  1783.         jl      return_true
  1784.         jg      return_false
  1785.         cmp     eax,ebx
  1786.         jb      return_true
  1787.         jae     return_false
  1788.       check_less:
  1789.         cmp     edx,ecx
  1790.         jl      return_false
  1791.         jg      return_true
  1792.         cmp     eax,ebx
  1793.         jbe     return_false
  1794.         ja      return_true
  1795.       check_not_less:
  1796.         cmp     edx,ecx
  1797.         jl      return_true
  1798.         jg      return_false
  1799.         cmp     eax,ebx
  1800.         jbe     return_true
  1801.         ja      return_false
  1802.       check_not_greater:
  1803.         cmp     edx,ecx
  1804.         jl      return_false
  1805.         jg      return_true
  1806.         cmp     eax,ebx
  1807.         jb      return_false
  1808.         jae     return_true
  1809.       check_not_equal:
  1810.         cmp     eax,ebx
  1811.         jne     return_true
  1812.         cmp     edx,ecx
  1813.         jne     return_true
  1814.         jmp     return_false
  1815.       logical_number:
  1816.         pop     ebx edx eax
  1817.         or      bl,bl
  1818.         jnz     invalid_expression
  1819.         or      eax,edx
  1820.         jnz     return_true
  1821.         jmp     return_false
  1822.       check_for_defined:
  1823.         or      bl,-1
  1824.         lods    word [esi]
  1825.         cmp     ah,'('
  1826.         jne     invalid_expression
  1827.       check_expression:
  1828.         lods    byte [esi]
  1829.         or      al,al
  1830.         jz      defined_string
  1831.         cmp     al,'.'
  1832.         je      defined_fp_value
  1833.         cmp     al,')'
  1834.         je      expression_checked
  1835.         cmp     al,'!'
  1836.         je      invalid_expression
  1837.         cmp     al,0Fh
  1838.         je      check_expression
  1839.         cmp     al,10h
  1840.         je      defined_register
  1841.         cmp     al,11h
  1842.         je      check_if_symbol_defined
  1843.         cmp     al,80h
  1844.         jae     check_expression
  1845.         movzx   eax,al
  1846.         add     esi,eax
  1847.         jmp     check_expression
  1848.       defined_register:
  1849.         inc     esi
  1850.         jmp     check_expression
  1851.       defined_fp_value:
  1852.         add     esi,12
  1853.         jmp     expression_checked
  1854.       defined_string:
  1855.         lods    dword [esi]
  1856.         add     esi,eax
  1857.         inc     esi
  1858.         jmp     expression_checked
  1859.       check_if_symbol_defined:
  1860.         lods    dword [esi]
  1861.         cmp     eax,-1
  1862.         je      invalid_expression
  1863.         cmp     eax,0Fh
  1864.         jb      check_expression
  1865.         je      reserved_word_used_as_symbol
  1866.         test    byte [eax+8],4
  1867.         jnz     no_prediction
  1868.         test    byte [eax+8],1
  1869.         jz      symbol_predicted_undefined
  1870.         mov     cx,[current_pass]
  1871.         sub     cx,[eax+16]
  1872.         jz      check_expression
  1873.         cmp     cx,1
  1874.         ja      symbol_predicted_undefined
  1875.         or      byte [eax+8],40h+80h
  1876.         jmp     check_expression
  1877.       no_prediction:
  1878.         test    byte [eax+8],1
  1879.         jz      symbol_undefined
  1880.         mov     cx,[current_pass]
  1881.         sub     cx,[eax+16]
  1882.         jz      check_expression
  1883.         jmp     symbol_undefined
  1884.       symbol_predicted_undefined:
  1885.         or      byte [eax+8],40h
  1886.         and     byte [eax+8],not 80h
  1887.       symbol_undefined:
  1888.         xor     bl,bl
  1889.         jmp     check_expression
  1890.       expression_checked:
  1891.         mov     al,bl
  1892.         jmp     logical_value_ok
  1893.       check_for_used:
  1894.         lods    word [esi]
  1895.         cmp     ah,2
  1896.         jne     invalid_expression
  1897.         lods    dword [esi]
  1898.         cmp     eax,0Fh
  1899.         jb      invalid_use_of_symbol
  1900.         je      reserved_word_used_as_symbol
  1901.         inc     esi
  1902.         test    byte [eax+8],8
  1903.         jz      not_used
  1904.         mov     cx,[current_pass]
  1905.         sub     cx,[eax+18]
  1906.         jz      return_true
  1907.         cmp     cx,1
  1908.         ja      not_used
  1909.         or      byte [eax+8],10h+20h
  1910.         jmp     return_true
  1911.       not_used:
  1912.         or      byte [eax+8],10h
  1913.         and     byte [eax+8],not 20h
  1914.         jmp     return_false
  1915.       given_false:
  1916.         inc     esi
  1917.       return_false:
  1918.         xor     al,al
  1919.         jmp     logical_value_ok
  1920.       given_true:
  1921.         inc     esi
  1922.       return_true:
  1923.         or      al,-1
  1924.         jmp     logical_value_ok
  1925.       logical_expression:
  1926.         lods    byte [esi]
  1927.         mov     dl,[logical_value_wrapping]
  1928.         push    edx
  1929.         call    calculate_embedded_logical_expression
  1930.         pop     edx
  1931.         mov     [logical_value_wrapping],dl
  1932.         push    eax
  1933.         lods    byte [esi]
  1934.         cmp     al,'}'
  1935.         jne     invalid_expression
  1936.         pop     eax
  1937.       logical_value_ok:
  1938.         pop     ebx
  1939.         xor     al,bl
  1940.         ret
  1941.  
  1942. skip_symbol:
  1943.         lods    byte [esi]
  1944.         or      al,al
  1945.         jz      nothing_to_skip
  1946.         cmp     al,0Fh
  1947.         je      nothing_to_skip
  1948.         cmp     al,1
  1949.         je      skip_instruction
  1950.         cmp     al,2
  1951.         je      skip_label
  1952.         cmp     al,3
  1953.         je      skip_label
  1954.         cmp     al,20h
  1955.         jb      skip_assembler_symbol
  1956.         cmp     al,'('
  1957.         je      skip_expression
  1958.         cmp     al,'['
  1959.         je      skip_address
  1960.       skip_done:
  1961.         clc
  1962.         ret
  1963.       skip_label:
  1964.         add     esi,2
  1965.       skip_instruction:
  1966.         add     esi,2
  1967.       skip_assembler_symbol:
  1968.         inc     esi
  1969.         jmp     skip_done
  1970.       skip_address:
  1971.         mov     al,[esi]
  1972.         and     al,11110000b
  1973.         cmp     al,60h
  1974.         jb      skip_expression
  1975.         cmp     al,70h
  1976.         ja      skip_expression
  1977.         inc     esi
  1978.         jmp     skip_address
  1979.       skip_expression:
  1980.         lods    byte [esi]
  1981.         or      al,al
  1982.         jz      skip_string
  1983.         cmp     al,'.'
  1984.         je      skip_fp_value
  1985.         cmp     al,')'
  1986.         je      skip_done
  1987.         cmp     al,']'
  1988.         je      skip_done
  1989.         cmp     al,'!'
  1990.         je      skip_expression
  1991.         cmp     al,0Fh
  1992.         je      skip_expression
  1993.         cmp     al,10h
  1994.         je      skip_register
  1995.         cmp     al,11h
  1996.         je      skip_label_value
  1997.         cmp     al,80h
  1998.         jae     skip_expression
  1999.         movzx   eax,al
  2000.         add     esi,eax
  2001.         jmp     skip_expression
  2002.       skip_label_value:
  2003.         add     esi,3
  2004.       skip_register:
  2005.         inc     esi
  2006.         jmp     skip_expression
  2007.       skip_fp_value:
  2008.         add     esi,12
  2009.         jmp     skip_done
  2010.       skip_string:
  2011.         lods    dword [esi]
  2012.         add     esi,eax
  2013.         inc     esi
  2014.         jmp     skip_done
  2015.       nothing_to_skip:
  2016.         dec     esi
  2017.         stc
  2018.         ret
  2019.