Subversion Repositories Kolibri OS

Rev

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