Größe einer Prozedur

Anfängerfragen zum Programmieren mit PureBasic.
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

Größe einer Prozedur

Beitrag von TKRoth »

Wie kann ich feststellen, wie groß eine Prozedur ist? Also wieviel Speicherplatz diese verbraucht (Ohne lokale Variablen).

Mit ?Start und ?End gibt es 0. Das funktioniert wohl nur im Datenbereich.
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Größe einer Prozedur

Beitrag von STARGÅTE »

Also bei mir funktioniert das mit den Sprungmarken:

Code: Alles auswählen

Procedure Beispiel(Wert.i)
	Debug ?Ende - ?Start
	Start:
	Wert + 1
	If Wert > 3
		ProcedureReturn #True
	Else
		ProcedureReturn #False
	EndIf
	Ende:
EndProcedure

Beispiel(6)
124
Wobei die 124 nur als Richtwert dienen sollten. Da solltest du mal gucken, wo die im ASM-Code landen, ob davor und danach nicht noch "Sauermach-Sachen" stehen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

Re: Größe einer Prozedur

Beitrag von TKRoth »

Ok. Erst einmal vielen Dank. Das hilft schon einmal grob.

Gibt es vielleicht auch eine Lösung ausserhalb einer Prozedur? So muss ich diese ja irgendwie aufrufen, um einen Wert zu bekommen.

Diese Version hilft mir aber schon ein gutes Stück weiter.
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Größe einer Prozedur

Beitrag von STARGÅTE »

Naja aufgerufen muss die Prozedur irgendwo eh, da sie ja sonst erst gar nicht kompiliert wird.
Da in PureBasic Sprungmarken in Prozeduren inzwischen geschirmt sind, geht es aktuell nur so:

Code: Alles auswählen

Procedure Beispiel(Wert.i)
	Start:
	Wert + 1
	If Wert > 3
		ProcedureReturn #True
	Else
		ProcedureReturn #False
	EndIf
	Ende:
EndProcedure


Global Size.i
! MOV rax, ll_beispiel_ende  ; ll_<Prozedurname in kleinbuchstaben>_ende/start
! MOV rdx, ll_beispiel_start
! SUB rax, rdx
! MOV [v_Size], rax
Debug Size

Beispiel(1)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Größe einer Prozedur

Beitrag von mk-soft »

Wofür sollte man das brauchen? Ist doch nicht relevant.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Größe einer Prozedur

Beitrag von juergenkulow »

Code: Alles auswählen

; Länge einer Procedure 
Procedure Beispiel(Wert.i)
  Wert+1
  If Wert>3 
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf 
EndProcedure

SetClipboardText(Str(Beispiel(6)))

; pbcompiler /Commented  len.pb 
; ; Procedure Beispiel(Wert.i)
; _Procedure0:
;   MOV    qword [rsp+8],rcx
;   PUSH   r15
;   PS0=64
;   XOr    rax,rax
;   PUSH   rax
;   SUB    rsp,40
; ; Wert+1
;   MOV    r15,qword [rsp+PS0+0]
;   INC    r15
;   MOV    qword [rsp+PS0+0],r15
; ; If Wert>3 
;   MOV    r15,qword [rsp+PS0+0]
;   CMP    r15,3
;   JLE   _EndIf2
; ; ProcedureReturn #True
;   MOV    rax,1
;   JMP   _EndProcedure1
; ; Else
;   JMP   _EndIf1
; _EndIf2:
; ; ProcedureReturn #False
;   XOr    rax,rax
;   JMP   _EndProcedure1
; ; EndIf 
; _EndIf1:
; ; EndProcedure
; _EndProcedureZero1:
;   XOr    rax,rax
; _EndProcedure1:
;   ADD    rsp,48
;   POP    r15
;   RET
; ; 

; Debugger x64dbg
; 00000001400010E1 | 48:894C24 08             | mov qword ptr ss:[rsp+8],rcx                                  |
; 00000001400010E6 | 41:57                    | push r15                                                      |
; 00000001400010E8 | 48:31C0                  | XOr rax,rax                                                   |
; 00000001400010EB | 50                       | push rax                                                      |
; 00000001400010EC | 48:83EC 28               | sub rsp,28                                                    |
; 00000001400010F0 | 4C:8B7C24 40             | mov r15,qword ptr ss:[rsp+40]                                 |
; 00000001400010F5 | 49:FFC7                  | inc r15                                                       |
; 00000001400010F8 | 4C:897C24 40             | mov qword ptr ss:[rsp+40],r15                                 |
; 00000001400010FD | 4C:8B7C24 40             | mov r15,qword ptr ss:[rsp+40]                                 |
; 0000000140001102 | 49:83FF 03               | cmp r15,3                                                     |
; 0000000140001106 | 7E 0B                    | jle len.140001113                                             |
; 0000000140001108 | 48:C7C0 01000000         | mov rax,1                                                     |
; 000000014000110F | EB 0A                    | jmp len.14000111B                                             |
; 0000000140001111 | EB 05                    | jmp len.140001118                                             |
; 0000000140001113 | 48:31C0                  | XOr rax,rax                                                   |
; 0000000140001116 | EB 03                    | jmp len.14000111B                                             |
; 0000000140001118 | 48:31C0                  | XOr rax,rax                                                   |
; 000000014000111B | 48:83C4 30               | add rsp,30                                                    |
; 000000014000111F | 41:5F                    | pop r15                                                       |
; 0000000140001121 | C3                       | ret                                                           |
; $140001122-$1400010E1=$41=65 Byte 
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Größe einer Prozedur

Beitrag von DrShrek »

mk-soft hat geschrieben: 20.02.2022 15:19 Wofür sollte man das brauchen? Ist doch nicht relevant.
Vielleicht vergleichen mit anderen Sprachen. Aber auch dann sehr unwichtig.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Antworten