Seite 1 von 1

Größe einer Prozedur

Verfasst: 20.02.2022 14:15
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.

Re: Größe einer Prozedur

Verfasst: 20.02.2022 14:29
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.

Re: Größe einer Prozedur

Verfasst: 20.02.2022 14:42
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.

Re: Größe einer Prozedur

Verfasst: 20.02.2022 15:07
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)

Re: Größe einer Prozedur

Verfasst: 20.02.2022 15:19
von mk-soft
Wofür sollte man das brauchen? Ist doch nicht relevant.

Re: Größe einer Prozedur

Verfasst: 21.02.2022 20:47
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 

Re: Größe einer Prozedur

Verfasst: 22.02.2022 09:58
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.