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.