Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [ASM] Dividieren von Ganzzahlen (https://www.delphipraxis.net/78353-%5Basm%5D-dividieren-von-ganzzahlen.html)

Balu der Bär 3. Okt 2006 17:11


[ASM] Dividieren von Ganzzahlen
 
Ja, ihr hab richtig gelesen, diesmal gehts um Assembler. Meine ersten Erfahrungen (ASM betreffend) liegen ein paar Monate zurück, wegen einem Bekannten bin ich heute wieder dazu gekommen ein bisschen mehr herumzuspielen. Ich habe derzeit ein kleines Problem, und zwar mit dem Dividieren von zwei Ganzzahlen. Bei der Multiplikation mach ich des ja einfach so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 test : Integer;
begin
 test := 7;
 asm
   MOV EAX,test // <- lese test ein
   IMUL EAX, 5 // <- multipliziere mit 5
   MOV test, EAX //<- schriebe Wert zurück in test
 end;
 ShowMessage(IntToStr(test));
end;
Deshalb vermutete ich das Dividieren verläuft ähnlich, folgendes habe ich versucht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 test : Integer;
begin
 test := 20;
 asm
   MOV EAX,test // <- lese test ein
   MOV BH, 5 // <- teile BH 5 zu
   IDIV BH // <- dividiere durch 5
   MOV test, EAX //<- schriebe Wert zurück in test
 end;
 ShowMessage(IntToStr(test));
end;
Egal ob ich IDIV oder ein normales DIV nehme, als Ergebnis erhalte ich 5. 20 durch 5 ist bei mir aber 4, wieso bekomme ich dort 5 heraus? Bitte nehmt Rücksicht, bin absoluter Assembler-Anfänger. :oops: Irgendwie steh ich gerade ziemlich auf dem Schlauch, weiß jemand was da los ist? Danke euch.

3_of_8 3. Okt 2006 17:17

Re: [ASM] Dividieren von Ganzzahlen
 
Also bei mir kommt 4 raus.

Balu der Bär 3. Okt 2006 17:25

Re: [ASM] Dividieren von Ganzzahlen
 
Ja, wie ich bemerkt hatte kommt wirklich 4 raus. :wall: Der Quellcode in diesem Thread war nur ein Auszug, ich hab gerade erst gesehen ich hatte aus Versehen noch ein INC EAX weiter unten mit drin, deshalb kam eins mehr heraus. :wall:
Ich bitte um Verzeihung und glaube ich schalte den PC jetzt lieber aus. :cry:

Hawkeye219 3. Okt 2006 17:41

Re: [ASM] Dividieren von Ganzzahlen
 
Hallo Balu,

hast du einmal versucht, mit deinem Code 21 durch 5 zu teilen? Hier ist die Erklärung für das möglicherweise überraschende Ergebnis.

Gruß Hawkeye

Balu der Bär 3. Okt 2006 17:50

Re: [ASM] Dividieren von Ganzzahlen
 
Hallo Hawkeye,

jupp versucht habe ich es, es kommt ein Ergebnis raus das garantiert nicht stimmt. Ich versuch mich mal da einzulesen und eine Lösung zu finden, danke für den Link. :thumb:

Wie gesagt ich bin noch Anfänger und die Materie ist nicht sonderlich leicht verständlich. ;)

Amateurprofi 3. Okt 2006 19:36

Re: [ASM] Dividieren von Ganzzahlen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 test : Integer;
begin
 test := 20;
 asm
   MOV EAX,test // <- lese test ein
   MOV BH, 5 // <- teile BH 5 zu
   IDIV BH // <- dividiere durch 5
   MOV test, EAX //<- schriebe Wert zurück in test
 end;
 ShowMessage(IntToStr(test));
end;
Das Problem ist, daß Du durch BH dividierst.
Dann wird AX (die unteren 2 Bytes von EAX) durch BH geteilt. Der Quotient kommt in AL, der Modulo in AH.

Benutze als Divisor ECX (EBX sollte nie verändert werden) als Divisor.
Dann kommt der Quotient in EAX, der Modulo in EDX
Also
Delphi-Quellcode:
mov  eax,test
cdq
mov  ecx,5                   
idiv ecx
mov  test,eax

Balu der Bär 3. Okt 2006 20:12

Re: [ASM] Dividieren von Ganzzahlen
 
Hallo,

funktioniert gut diese Lösung, danke. :thumb:

Aber sagmal was macht denn der Befehl "cdq", von dem hab ich bis jetzt noch gar nichts gehört? :gruebel:

3_of_8 3. Okt 2006 20:19

Re: [ASM] Dividieren von Ganzzahlen
 
cdq macht folgendes:

Wenn das Vorzeichenbit von eax gesetzt ist, wird edx auf 0xFFFFFFFF gesetzt, ansonsten auf 0x00000000.

Balu der Bär 3. Okt 2006 20:29

Re: [ASM] Dividieren von Ganzzahlen
 
Aha, danke.

Gibt es eigentlich irgendwo eine Tabelle wo kurz die wichtigsten Befehle mit kurzer Beschreibung aufgelistet sind?

3_of_8 3. Okt 2006 20:31

Re: [ASM] Dividieren von Ganzzahlen
 
Du könntest dir das Prozessorhandbuch von Intel ansehen. Ansonsten einfahc mal googeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.
Seite 1 von 2  1 2      

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