AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Problem in Assembler: Grundrechenarten
Thema durchsuchen
Ansicht
Themen-Optionen

Problem in Assembler: Grundrechenarten

Ein Thema von der olli · begonnen am 8. Mär 2006 · letzter Beitrag vom 9. Mär 2006
Antwort Antwort
der olli

Registriert seit: 18. Mai 2004
14 Beiträge
 
#1

Problem in Assembler: Grundrechenarten

  Alt 8. Mär 2006, 19:01
Hi!

Wir programmieren in der Schule momentan Assembler in Delphi. Zu nächster Stunde sollen wir ein Programm, welches die Grundrechenarten beherrscht (- Addieren, Subtrahieren, Multiplizieren und Dividieren -), schreiben, sollen uns das Wissen allerdings selber aneignen.
Addition und Subtraktion habe ich bereits geschafft zu programmieren, allerdings hänge ich nun bei der Syntax für die Multiplikation und die Division (- es soll geprüft werden, ob durch 0 dividiert wird -) - und da wir erst letzte Stunde mit dem Thema angefangen haben, weiß ich leider nicht so recht, wie ich es richtig machen soll. Es hängt wohl irgendwie damit zusammen, dass ich mit Integer arbeite ... Ich poste einfach mal den Quellcode:
Delphi-Quellcode:
var
  Form1: TForm1;
  x, y : Integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
 x := StrToInt(InputBox('Eingabe','Erste Zahl',''));
 y := StrToInt(InputBox('Eingabe','Zweite Zahl',''));
end;

procedure TForm1.bt_beendenClick(Sender: TObject);
begin
 Form1.Close
end;

procedure TForm1.Button2Click(Sender: TObject); // Addition
var h : Integer;
begin
 h := y;
 asm
  mov EAX, x
  add h, EAX
 end;
 ShowMessage('Ergebnis: ' + IntToStr(h))
end;

procedure TForm1.Button3Click(Sender: TObject); // Subtraktion
var h, h2 : Integer;
begin
 h := y;
 h2 := x;
 asm
  mov EAX, h
  sub h2, EAX
 end;
 ShowMessage('Ergebnis: ' + IntToStr(h2))
end;

procedure TForm1.Button4Click(Sender: TObject); // Multiplikation
var h, h2 : Integer;
begin
 h := y;
 h2 := x;
 asm
  mov EAX, h
  // fmul h2, EAX
 end;
 ShowMessage('Ergebnis: ' + IntToStr(h2))
end;

procedure TForm1.Button5Click(Sender: TObject); // Division
var h, h2 : Integer;
begin
 h := y;
 h2 := x;
 asm
  mov EAX, h
  idiv h2, EAX
 end;
end;
Wie ihr seht, bin ich bei den beiden Prozeduren noch nicht allzu weit gekommen (- Fehlermeldung: Ungültige Kombination von Opcode und Operanden -) ... Ich hoffe, mir kann jemand bei der Lösung helfen!

Gruß,
Olli
  Mit Zitat antworten Zitat
Ben

Registriert seit: 16. Apr 2003
Ort: Neumünster
73 Beiträge
 
Delphi 5 Standard
 
#2

Re: Problem in Assembler: Grundrechenarten

  Alt 9. Mär 2006, 10:51
Hallo,

ich bin ganz und gar kein Assembler-Profi, allerdings kann ich dir sagen, dass fmul nur Fließkommazahlen vom Real-Typ verarbeiten kann. Eine Multiplikation in Assembler würde etwa so gehen:

Delphi-Quellcode:
var
  g,h: Real;
begin

  g := x;
  h := y;

  asm
    fld g
    fmul h
    fstp h
  end;
end;
Kurze Erklärung: die Variable g wird in den FPU-Speicher geladen und mit h multipliziert, abschließend wird h gespeichert.

Was die Division angeht, so kann ich dir nicht helfen, Google spuckt aber das hier aus.

Mit freundlichen Grüßen,
Ben
Ben Hübner
Ben-Huebner.de
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Problem in Assembler: Grundrechenarten

  Alt 9. Mär 2006, 11:07
ich denke mal es wird um die multiplikation und division von integern gehen. dabei hilft dir (oh wunder ) imul und idiv. zu beachten bei den beiden ist, dass sie nur einen integer als "parameter" bekommen, den anderen int muss man vorher in EAX (oder war's EDX ) packen, der wird dann implizit benutzt. das ergebniss steht dann in EDX:EAX (d.h. wenn das ergebniss nicht in nen Integer passt, werden die "überstehenden" bits in EDX gepackt).

das ganze bezieht sich jetzt auf vorzeichenbehaftete zahlen (wies Integer nunmal sind), wenn du mit vorzeichenlose zahlen rechnen willst, nimmst du einfach mul/div statt imul/idiv.

edit:
ich hab grad nochmal nachgeschaut, beim idiv ist es etwas anders. da ist nachher in EAX das ergebniss der division und in EDX der Rest. das ganze läuft also für einen Integer so ab:

Code:
imul Int: EDX:EAX := EAX * Int
idiv Int: EAX := EAX div Int / EDX := EAX mod Int
edit2: hier ein link zu nem Opcode-PDF: http://www.jegerlehner.ch/intel/IntelCodeTable.pdf

edit3: beim idiv ist es nochmal anders, da steht der 1. operand in EDX:EAX. also so:
Code:
idiv Int: EAX := EDX:EAX div Int / EDX := EDX:EAX mod Int
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

Re: Problem in Assembler: Grundrechenarten

  Alt 9. Mär 2006, 11:17
Delphi-Quellcode:
asm
  mov eax, 8
  mov ecx, 2

  {CDQ erweitert das EAX-Register vorzeichengerecht auf 64 Bit
  und speichert das Ergebnis im Registerpaar EDX:EAX.
  Eine vorzeichengerechte Erweiterung bedeutet,
  daß Bit 31 des EAX-Registers in alle Bits des EDX-Registers geschrieben wird.
  Mit Hilfe von CDQ kann die Division eines DWords durch ein
  anderes DWord vorbereitet werden.
  }

  cdq
  {IDIV dividiert das AX-REGISTER bzw. das Registerpaar DX:AX
  durch den Quelloperanden unter Berücksichtigung des Vorzeichens.}

  idiv ecx
  //eax ganzzahl
  //edx rest
  //
  //http://www.fh-wedel.de/~bek/asm/befehle1.html
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 02:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz