AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

assembler Sprungbefehle

Ein Thema von JJFCNC · begonnen am 19. Mai 2021
Antwort Antwort
JJFCNC

Registriert seit: 2. Feb 2021
3 Beiträge
 
Delphi 10.4 Sydney
 
#1

assembler Sprungbefehle

  Alt 19. Mai 2021, 15:27
Hi Guy's

wer kann helfen, bei "JL @ELSE_b" wird falsch ausgwertet, warum ?

thanks.

Delphi-Quellcode:
procedure TFanucForm.NC_programm;
const
  hundert: double = 100;
  halbieren_asm: double = 2;
var
  nZaehler : integer;
  int : ^integer;
  liste : TStringList;
  D_Ist : double;
  D_von : double;
  D_bis : double;
  AP : double;
  ersteRate : double;
  Rate : double;
  H : double;
  apX : double;
  apMin : double;
  Summe : double;
  ergebnis_asm: double;
begin
  int := @nZaehler;
  Abbruch := false;
  nZaehler := 0;
  H := 0;
  apX := 0;
  D_Ist := 0;
  Summe := 0;

  try
    D_von := StrToFloat(EditTextToString(MinEdit).Replace(#46, #44));
    D_bis := StrToFloat(EditTextToString(MaxEdit).Replace(#46, #44));
    AP := StrToFloat(EditTextToString(APEdit).Replace(#46, #44));
    ersteRate := StrToFloat(EditTextToString(ersteRateEdit).Replace(#46, #44));
    ersteRate := ersteRate / hundert;
    Rate := StrToFloat(EditTextToString(RateEdit).Replace(#46, #44));
    Rate := Rate / hundert;
    apMin := StrToFloat(EditTextToString(APMinEdit).Replace(#46, #44));
  except
    exit;
  end;

  if not((D_bis > 0) or (D_von > 0))
  then
    exit
  else if (D_von = D_bis)
  then
    exit
  else if not(AP > 0)
  then
    begin
      ShowMessage('Schnitttiefe <ap> kann nicht berechnet werden.');
      exit;
    end
  else if not(apMin > 0)
  then
    begin
      ShowMessage('mind. Schnitttiefe <apMin> kann nicht berechnet werden.');
      exit;
    end
  else if (AP < apMin)
  then
    begin
      ShowMessage('Schnitttiefe <ap> kleiner als mind. Schnitttiefe <apMin>.');
      exit;
    end
  else if not(Rate > 0)
  then
    begin
      ShowMessage('Zustellung Rate <%> kann nicht berechnet werden.');
      exit;
    end
  else if not(ersteRate > 0)
  then
    begin
      ShowMessage('1. Zustellung Rate <&> kann nicht berechnet werden.');
      exit;
    end;

  if (D_bis > D_von)
  then
    bearbeitung.innen := true;

  if (D_von > D_bis)
  then
    bearbeitung.aussen := true;

  liste := TStringList.Create;

  SetLength(
    data1,
    3);

  repeat
    case (bearbeitung.innen) of
      true:
        begin
          case (int^) of
            0:
              begin
                asm
                  INC nZaehler
                  JMP @START
                @START:
                  FLD D_bis // ST(0) = D_bis
                  FSUB D_von // ST(0) = ST(0) - D_von
                  FDIV halbieren_asm // ST(0) = ST(0) / 2
                  FSTP H // ST(0) zurückschreiben auf Variable: H
                  FLD AP
                  FMUL ersteRate
                  FSTP apX
                  FLD apX
                  FMUL halbieren_asm
                  FADD D_von
                  FSTP D_Ist
                  FLD Summe
                  FADD apX
                  FSTP Summe
                end;

                { Inc(nZaehler);

                  H    := (D_bis - D_von) / 2;
                  apX  := AP * (ersteRate / hundert);
                  D_Ist := D_von + (2 * apX);
                  Summe := Summe + apX; }


                data1[0] := int^;
                data1[1] := apX;
                data1[2] := D_Ist;

                liste.ADD(SetStringFormat(data1));
              end;
          else
            begin
              asm
                INC nZaehler
                JMP @START
              @START:
                FLD apX
                FMUL Rate
                FCOM apMin // vergleiche, ST(0) : apMin
                JG @ELSE_a // wenn größer, springe
                FLD apMin
                FSTP apX
                JMP @END_a
              @ELSE_a:
                FLD apX
                FMUL Rate
                FSTP apX
                JMP @END_a
              @END_a:
                FLD Summe
                FADD apX
                FCOM H
                JL @ELSE_b // wenn kleiner, springe: Abfrage wird falsch ausgewertet !?!
                FLD H
                FSUB Summe
                FSTP apX
                JMP @END_b
              @ELSE_b:
                JMP @END_b
              @END_b:
                FLD apX
                FMUL halbieren_asm
                FADD D_Ist
                FSTP D_Ist
                FLD Summe
                FADD apX
                FSTP Summe
              end;

              { if ((apX * (Rate / hundert)) < apMin)
                then
                begin
                apX := apMin;
                end
                else
                begin
                apX := apX * (Rate / hundert);
                end;

                if ((Summe + apX) > H)
                then
                apX := H - Summe;

                D_Ist := D_Ist + (2 * apX);
                Summe := Summe + apX; }


              data1[0] := int^;
              data1[1] := apX;
              data1[2] := D_Ist;

              liste.ADD(SetStringFormat(data1));
            end;
          end;
        end;
    end;

    case (bearbeitung.aussen) of
      true:
        begin
          case (int^) of
            0:
              begin
                INC(nZaehler);
                H := (D_von - D_bis) / 2;
                apX := AP * (ersteRate / hundert);
                D_Ist := D_von - (2 * apX);
                Summe := Summe + apX;

                data1[0] := int^;
                data1[1] := apX;
                data1[2] := D_Ist;

                liste.ADD(SetStringFormat(data1));
              end;
          else
            begin
              INC(nZaehler);
              if ((apX * (Rate / hundert)) < apMin)
              then
                begin
                  apX := apMin;
                end
              else
                begin
                  apX := apX * (Rate / hundert);
                end;
              if ((Summe + apX) > H)
              then
                apX := H - Summe;
              D_Ist := D_Ist - (2 * apX);
              Summe := Summe + apX;

              data1[0] := int^;
              data1[1] := apX;
              data1[2] := D_Ist;

              liste.ADD(SetStringFormat(data1));
            end;
          end;
        end;
    end;
  until (Summe >= H);

  FProgressBarMax := int^;

  DataProgressBarComponent(
    true,
    clRed,
    FProgressBarMax);

  SetFormControl(true);

  for nZaehler := 1 to (liste.Count) do
    begin
      BerechnungProgressBar.Position := int^;

      self.Caption := String.Format('%s [%d %%]',
        [FFormCaption, ProzentProgressbar(nZaehler, FProgressBarMax)]);

      BerechnungListBox.AddItem(
        liste[int^ - 1],
        BerechnungListBox);

      WriteZählerEdit(int^.ToString);

      if (THoistThread(DataFanucThread).Terminated)
      then
        begin
          AbbruchRoutine(Abbruch);
          break;
        end
      else
        begin
          BerechnungListBox.Perform(
            WM_VSCROLL,
            SB_BOTTOM,
            0); // Botschaft direkt an die Fensterprozedur des Steuerelements senden
          Application.ProcessMessages;
        end;
    end;

  if not(Abbruch)
  then
    begin
      SetFormControl(false);
      DataProgressBarComponent(false);
    end;

  liste.Free;

  SetLength(
    data1,
    0);
end;
Andreas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 07:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf