Fehler beim compilieren von ASM

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Fehler beim compilieren von ASM

Beitrag von alter Mann »

ich wollte mal mit ASM anfangen und habe dazu aus dem Codearchiv einen Teil der Real10_Calculation.pb compliert

Code: Alles auswählen

Structure r10 
  StructureUnion 
    fw.w[5] 
    tb.b[10]      
  EndStructureUnion 
EndStructure 


Procedure LongToR10(i.l,*x.r10) 
! finit 
! mov eax,[esp+4] ;x 
! fild dword [esp];i 
! fstp tword [eax];x 
ProcedureReturn 
EndProcedure 


LongToR10(2,@w3.r10)
beim Ausführen kommt der Fehler
Invalid memory access. (write error at address 10) beim Ausführen der Procedure
was mache ich falsch ?
Win11 64Bit / PB 6.0
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Versuch doch mal auf die Variablen nicht ueber esp sondern ueber deren
Namen zu zugreifen. Oder alles um +4 erweitern, da die Variablen auf
dem Stack mit +4 anfangen und nicht mit +0.
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

danke edel, scheint zu klappen. hat sich da eigentlich was geändert, da das Beispiel ja aus dem Codearchiv ist ?
Win11 64Bit / PB 6.0
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

alter Mann hat geschrieben:hat sich da eigentlich was geändert, da das Beispiel ja aus dem Codearchiv ist ?
Beim Übergang von PB 3 nach PB 4 hat sich - wie schon von edel beschrieben - der Stack-Offset um +4 verschoben.
In PB 3 wird ein Parameter in folgender Weise vom Stack gelesen

Code: Alles auswählen

Procedure ConvertLongIntToASCII(LongInteger.L)
!		MOV     EAX,DWORD[ESP]
               ...
EndProcedure
Dies muß in PB 4 folgendermaßen erfolgen:

Code: Alles auswählen

Procedure ConvertLongIntToASCII(LongInteger.L)
!		MOV     EAX,DWORD[ESP+4]
               ...
EndProcedure
Dieses Problem erspart man sich, wenn man den Parameter über den Variablennamen (wie von edel vorgeschlagen) einliest:

Code: Alles auswählen

Procedure ConvertLongIntToASCII(LongInteger.L)
!		MOV     EAX,DWORD[p.v_LongInteger]
               ...
EndProcedure
Antworten