Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [Delphi/Assembly] Delen van 2 Integers (https://forum.scholieren.com/showthread.php?t=1485639)

12Trix 11-10-2006 11:27

[Delphi/Assembly] Delen van 2 Integers
 
Hoe deel je 2 (32-bit) Integers m.b.v. assembly in Delphi?

Het getal wat gedeeld moet worden zit in EDX:EAX. Het getal waardoor gedeeld wordt is 32-bits. En het antwoord (zonder rest) komt in AX. De rest komt in DX te staan.

Code:

function TForm1.AsmDivI(p1: Integer; p2: Integer): Integer;
var v: Integer;
begin
  asm
      mov EDX, &p1
      mov EAX, 0
      mov EBX, &p2
      idiv EBX
      mov &v, AX
  end;
  AsmDivI := v;
end;

Ik heb zoiets als bovenstaande maar dat werkt niet. Maak ik van "v" een Word dan doet ie het wel natuurlijk, maar dan geeft ie een Integer overflow.

Dus, hoe verdeel ik de 32-bits Integer over de EDX:EAX. En ik geef nu alleen het antwoord terug, maar ik moet ook de rest teruggeven. Hoe doe ik dat? Kan ik AX en DX op een bepaalde manier in "v" zetten? En hoe doe ik dat dan?

ILUsion 11-10-2006 13:47

Kan je dit niet evengoed in Object Pascal zelf doen met behulp van de div- en mod-operatoren? Je zal die beide registers wel kunnen uitlezen me wat assembler.

12Trix 11-10-2006 15:58

Citaat:

ILUsion schreef op 11-10-2006 @ 14:47 :
Kan je dit niet evengoed in Object Pascal zelf doen met behulp van de div- en mod-operatoren? Je zal die beide registers wel kunnen uitlezen me wat assembler.
Jawel, maar de bedoeling is om het in assembly in Delphi te doen. Met Byte's lukt het wel. Maar met Integer's niet. Ik heb al wat rond zitten surfen op internet, maar heb niets gevonden.

eddie 11-10-2006 16:53

Citaat:

IDIV - Signed Integer Division

Usage: IDIV src
Modifies flags: (AF,CF,OF,PF,SF,ZF undefined)

Signed binary division of accumulator by source.
If source is a byte value, AX is divided by "src" and the quotient is stored in AL and the remainder in AH.
If source is a word value, DX:AX is divided by "src", and the quotient is stored in AL and the remainder in DX.
http://mvmpc9.ciw.uni-karlsruhe.de/p...HELPPC/ASM.TXT

12Trix 11-10-2006 18:16

IDIV src

src is geen word maar een dword (32-bits Integer), dacht ik.
src is geen word maar een dubbele dword (32-bits Integer).

Ik heb mijn info over IDIV van:
ftp://download.intel.com/design/pent...als/253666.htm

Maar ik moet in Delphi een Integer verdelen in 2 words. Ik vroeg me af hoe ik dat zou moeten doen in assembly in Delphi.

Maar ik denk dat ik iets met PTR ga proberen.

Maar als iemand een methode kent die gebruikelijk is, als PTR methode niet gebruikelijk is.

eddie 11-10-2006 20:49

Citaat:

12Trix schreef op 11-10-2006 @ 19:16 :
IDIV src

src is geen word maar een dword (32-bits Integer), dacht ik.

Ik heb mijn info over IDIV van:
ftp://download.intel.com/design/pent...als/253666.htm

Maar ik moet in Delphi een Integer verdelen in 2 words. Ik vroeg me af hoe ik dat zou moeten doen in assembly in Delphi.

Maar ik denk dat ik iets met PTR ga proberen.

Maar als iemand een methode kent die gebruikelijk is, als PTR methode niet gebruikelijk is.

Wellicht dat Delphi geen goede mapping kan maken van integer naar word? Probeer het anders eerst eens zonder parameters en variabelen:

Code:

mov AX, 11
idiv 2
;AL -> 0101b (5)
;AH -> 0001b (1)

Pagina's 493 t/m 496 van de PDF.

12Trix 11-10-2006 21:39

Citaat:

eddie schreef op 11-10-2006 @ 21:49 :
Wellicht dat Delphi geen goede mapping kan maken van integer naar word? Probeer het anders eerst eens zonder parameters en variabelen:

Code:

mov AX, 11
idiv 2
;AL -> 0101b (5)
;AH -> 0001b (1)

Pagina's 493 t/m 496 van de PDF.

AX is 16-bits. Ik moet in EAX en EDX de high en low 16-bits stukjes van de 32-bits Integer zetten.

Ik sprak geloof ik over 1 dword:
Citaat:

src is geen word maar een dword (32-bits Integer), dacht ik.
Maar ik bedoelde 2 dword's, want een dword is twee bytes, dus 16-bits. En er gaan natuurlijk 2 * 16 bits in een 32 bits Integer. Mijn fout.

Ik moet dus zelf de mapping maken van Integer's naar DWord's voor Delphi. Ik zal die mapping nog proberen d.m.v. iets als:
Code:

mov EAX, WORD PTR [&v]
mov EDX, WORD PTR [&v + 2]

Voor Byte is het wel gelukt omdat ik de Byte niet in twee registers hoefde op te splitsen.

Ik zou het eerst inderdaad eens zonder parameters kunnen proberen.

12Trix 11-10-2006 21:57

Mijn God, ben ik trouwens even blij dat ik binnenkort wat geheugen erbij krijg.

Zaken als NetBeans en Eclipse vergallen mijn leven op dit moment. Delphi gaat nog wel.


Alle tijden zijn GMT +1. Het is nu 10:33.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.