Press enter to see results or esc to cancel.

Identifiers In Assembler Instructions

This function checks if identifier in instruction is valid and returns its data. Identifier can be a local lable starting with the @ sign or any other declared Turbo Pascal identifier.

Function IsValidAsmIdentifier (P: Pointer; Var Tok: TToken; Var IdentifierData: Pointer; Var IdentifierPointer: Word): Boolean;
Var RecordTypeDefinition: PRecordTypeDefinition absolute P;
    VariableIdentifierData: PVariableIdentifierData absolute IdentifierData;
    NewIdentifier: PIdentifier;
begin
  If CurrentIdentifier [1] = '@' then
    begin
      If IsIdentifierInSymbolTable (@SpecialAsmIdentifiers, Tok, IdentifierData, IdentifierPointer) then
        IsValidAsmIdentifier := True else
          If IsIdentifierInSymbolTable (Ptr (SymbolTable [stMain].Segment, TemporaryAssemblerStatementIdentifierTable),
                                 Tok, IdentifierData, IdentifierPointer) then
            IsValidAsmIdentifier := True else
              begin
                IdentifierData := StoreCurrentIdentifierToSymbolTable (Ptr (SymbolTable [stMain].Segment,
                                    TemporaryAssemblerStatementIdentifierTable), 2, NewIdentifier);
                NewIdentifier^.Token := Token_LabelIdentifier;
                IdentifierPointer := Ofs (NewIdentifier^);
                Tok := Token_LabelIdentifier;
                IsValidAsmIdentifier := True;
              end;
      Exit;
    end;
  If P = nil then IsValidAsmIdentifier := FindCurrentIdentifier (Tok, IdentifierPointer, IdentifierData) else
    If Ofs (P^) = 0 then
      begin
        If FindIdentifierInUnit (P, Tok, IdentifierPointer, IdentifierData) then IsValidAsmIdentifier := True else
          IsValidAsmIdentifier := FindCurrentIdentifier (Tok, IdentifierPointer, IdentifierData);
      end else
        begin
          If IsCurrentIdentifierDeclaredAsMemberInRecordOrObject (RecordTypeDefinition,
                                                                  VariableIdentifierData,
                                                                  Tok,
                                                                  IdentifierPointer) then
            IsValidAsmIdentifier := True else
              IsValidAsmIdentifier := FindCurrentIdentifier (Tok, IdentifierPointer, IdentifierData);
        end;
end;