"Fossies" - the Fresh Open Source Software Archive

Member "fasm/source/exprcalc.inc" (21 Feb 2022, 40736 Bytes) of package /linux/misc/fasm-1.73.30.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) fasm source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the latest Fossies "Diffs" side-by-side code changes report for "exprcalc.inc": 1.73.29_vs_1.73.30.

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