Avatar billede coltau Juniormester
16. september 2002 - 18:46 Der er 11 kommentarer og
1 løsning

Aflæs stackpointer

Er det mig der sover eller hva' ?

function GetStackAdr: LongInt;
var
  iSP, iSS: Integer;
begin
  asm
    MOV iSP, SP
    MOV iSS, SS
  end;
  Result := LongInt(iSS) * 16 + LongInt(iSP);
end;

Den skal returnere stackadressen i et 16-bits Delphiprogram.

Jeg har lidt stackproblemer i øjeblikket og anvender ovenstående function - men jeg får af og til nogle underlige resultater.
Avatar billede dkn Nybegynder
16. september 2002 - 21:16 #1
måske noget du kunne bruge:
http://www.undu.com/Articles/010327a.html
Avatar billede coltau Juniormester
16. september 2002 - 22:43 #2
UseStack er interessant - men desværre.
Mit problem er sådan set om jeg aflæser stacken korrekt. ?
Avatar billede doc404 Novice
16. september 2002 - 23:22 #3
Av..good ol' days

Blot for måske at kunne hjælpe : Hvilken Delphi version taler vi om?
Avatar billede coltau Juniormester
16. september 2002 - 23:25 #4
Den 16-bits Delphi findes kun i en version. Delphi 1.
Avatar billede doc404 Novice
16. september 2002 - 23:36 #5
Godt...skulle blot sikre mig vi ikke var ude i seriøse misforståelser ;-)

Din funktion giver ikke SP der, hvor du kalder GetStackAdr - men SP inden i GetStackAdr - den vil (hvis jeg ellers husker korrekt være 6 under).

Du burde kunne nøjes med at kigge på SP, da dit SS altid vil være det samme. Jeg *TROR* dine underlige resultater skyldes din udregning fordi fortegnet går galt.

Men efter som du kun har et stacksegment, så prøv at droppe funktionen og istedet bruge en in-line lidt som denne

procedure WhatEver...
var
  MySP : integer;
begin
  ..
  ..
  asm
    mov MySP,SP
  end
  ..
end

Tilgiv fejl & mangler, men det er godt nok et stykke tid siden jeg har rodet med delphi 1
Avatar billede doc404 Novice
16. september 2002 - 23:42 #6
kan dit problem ikke skyldes at du bruger for meget stack? Igen, efter min lousy'e hukommelse har du vist kun 16K som standard. Men du kan ændre det med $M directivet
Avatar billede loke-liscom Nybegynder
17. september 2002 - 10:16 #7
Det er da klart, en funktion ligger kun et sted, når du kalder den laver den et jmp til funktionens område. Detfor får du hele tiden det samme resultat. det er korrekt at du bliver nød til at bruge in-line for at få det til at virke.

//klaus
Avatar billede loke-liscom Nybegynder
17. september 2002 - 10:17 #8
ups, detfor = derfor
Avatar billede loke-liscom Nybegynder
25. september 2002 - 13:23 #9
Hmmm.. hvad så nu?????
Avatar billede coltau Juniormester
25. september 2002 - 19:12 #10
--> loke-liscom Selvom det er en function der aflæser stackpointeren vil jeg ikke få samme resultat hver gang.

--> doc404 Det er korrekt at jeg får et forskudt resultat og det er forskudt med 8 byte (near call) ellers 10 byte ved "far call".

Forskydningen er ligegyldig i mit tilfælde - det eneste jeg skal vide er om jeg aflæser den korrekt. ?

Jeg har forsøgt med forskellige testprogrammer og får desværre nogle underlige resultater ind i mellem. Det kan være at problemet ligger andet sted i programmet - måske er stacken allerede overskredet som doc404 siger.
Mit værste eksempel er at jeg kalder en procedure i en komponent med 1160 byte som parametre - men forbruget på stacken viser 3780. ?

--> doc404 hvis du smider et svar er pointene dine.
Avatar billede doc404 Novice
25. september 2002 - 21:12 #11
Det lyder som en udfordring ;-) Må man spørge, hvad du er igang med?

;-)
Avatar billede coltau Juniormester
25. september 2002 - 22:07 #12
Jeg er på 4 år igang med et regnskabsprogram i Delphi 1 på efterhånden 133.000 linier. Jeg har lige udvidet programmet med en ny funktion, der anvender en komponent som anvendes 5 andre steder i programmet.
Pludselig får jeg en stack-fejl 202. (Som delphi 1 er dårlig til at håndtere.)
Derfor gik jeg i gang med at måle lidt på stackforbruget. Jeg kan ikke udvide stacken da det jo tager af datasegmentet som også er belastet - så koden skal vel bare efterses for "sløseri". :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester