Aktuelle Zeit: 03.07.2020 16:18

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Forumsregeln


Die Forumsregeln lesen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 30.07.2016 12:10 
Offline
Benutzeravatar

Registriert: 17.12.2011 13:01
Wohnort: Arnsberg
Hallo!

Ich habe unter Win7 64bit folgenden Fehler beim compilieren:
https://drive.google.com/file/d/0B6T0p7hlaS8adWJsb0doUnVMTFE/view

... allerdings habe ich das Problem weder unter Linux x64, noch unter Win x32???
Es sieht für mich so aus, als würden Sprungziele, die noch nicht initialisiert sind, nicht erkannt. (Vorwärtssprung)
Ist das nun ein Bug, oder mache ich etwas falsch? Hier der Code, den ich aus dem Forum habe:

Code:
EnableExplicit

EnableASM
Procedure.l FastCRC32(lBuffer.l, lBufLen.l)
  Protected lResult.l = 0
  MOV esi, lBuffer   ;esi = ptr to buffer
  MOV edi, lBufLen   ;edi = length of buffer
  MOV ecx, -1        ;ecx = -1
  MOV edx, ecx       ;edx = -1
  nextbyte:          ;next byte from buffer
  XOr eax, eax       ;eax = 0
  XOr ebx, ebx       ;ebx = 0
  DB 0xAC            ;"lodsb" instruction to get next byte
  XOr al, cl         ;xor al with cl
  MOV cl, ch         ;cl = ch
  MOV ch, dl         ;ch = dl
  MOV dl, dh         ;dl = dh
  MOV dh, 8          ;dh = 8
  nextbit:           ;next bit in the byte
  SHR bx, 1          ;shift bits in bx right by 1
  RCR ax, 1          ;(rotate through carry) bits in ax by 1
  JNC l_nocarry_     ;jump to nocarry if carry flag not set ; <-- hier tritt der Fehler auf
  XOr ax, 0x08320    ;xor ax with 33568
  XOr bx, 0x0EDB8    ;xor bx with 60856
  nocarry:           ;if carry flag wasn't set
  DEC dh             ;dh = dh - 1
  JNZ l_nextbit_     ;if dh isnt zero, jump to nextbit
  XOr ecx, eax       ;xor ecx with eax
  XOr edx, ebx       ;xor edx with ebx
  DEC edi            ;finished with that byte, decrement counter
  JNZ l_nextbyte_    ;if edi counter isnt at 0, jump to nextbyte
  Not edx            ;invert edx bits - 1s complement
  Not ecx            ;invert ecx bits - 1s complement
  MOV eax, edx       ;mov edx into eax
  ROL eax, 16        ;rotate bits in eax left by 16 places
  MOV ax, cx         ;mov cx into ax
  MOV lResult, eax   ;crc32 result is in eax
  ProcedureReturn lResult
EndProcedure
DisableASM
; Checksum.l = 0
; Buffer.s = "Wayne Diamond"
; Checksum = FastCRC32(@Buffer, Len(Buffer))


Gruß,
pcfreak


Zuletzt geändert von pcfreak1201 am 01.08.2016 18:57, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 30.07.2016 16:07 
Offline
Benutzeravatar

Registriert: 14.08.2007 15:41
Wohnort: Lelbach
Code:
;EnableExplicit

EnableASM
Procedure.l FastCRC32(lBuffer.l, lBufLen.l)
  Protected lResult.l = 0
  MOV esi, lBuffer   ;esi = ptr to buffer
  MOV edi, lBufLen   ;edi = length of buffer
  MOV ecx, -1        ;ecx = -1
  MOV edx, ecx       ;edx = -1
  nextbyte:          ;next byte from buffer
  XOR eax, eax       ;eax = 0
  XOR ebx, ebx       ;ebx = 0
  DB 0xAC            ;"lodsb" instruction to get next byte
  XOR al, cl         ;xor al with cl
  MOV cl, ch         ;cl = ch
  MOV ch, dl         ;ch = dl
  MOV dl, dh         ;dl = dh
  MOV dh, 8          ;dh = 8
  nextbit:           ;next bit in the byte
  SHR bx, 1          ;shift bits in bx right by 1
  RCR ax, 1          ;(rotate through carry) bits in ax by 1
  JNC ll_fastcrc32_nocarry     ;jump to nocarry if carry flag not set ; <-- hier tritt der Fehler auf
  XOR ax, 0x08320    ;xor ax with 33568
  XOR bx, 0x0EDB8    ;xor bx with 60856
  nocarry:           ;if carry flag wasn't set
  DEC dh             ;dh = dh - 1
  JNZ ll_fastcrc32_nextbit     ;if dh isnt zero, jump to nextbit
  XOR ecx, eax       ;xor ecx with eax
  XOR edx, ebx       ;xor edx with ebx
  DEC edi            ;finished with that byte, decrement counter
  JNZ ll_fastcrc32_nextbyte    ;if edi counter isnt at 0, jump to nextbyte
  NOT edx            ;invert edx bits - 1s complement
  NOT ecx            ;invert ecx bits - 1s complement
  MOV eax, edx       ;mov edx into eax
  ROL eax, 16        ;rotate bits in eax left by 16 places
  MOV ax, cx         ;mov cx into ax
  MOV lResult, eax   ;crc32 result is in eax
  ProcedureReturn lResult
EndProcedure
DisableASM
Checksum.l = 0
Buffer.s = "Wayne Diamond"
Checksum = FastCRC32(@Buffer, Len(Buffer))


tja..das mit dem Assembler-Sprungmarken-Handling bei Purebasic wird immer verrückter. Die Sprungmarke beginnt immer mit "ll_[name der procedur]_sprungmarke. Ausserhalb von Proceduren wir logischerweise der Name der Procedure weggelassen.

Den Umstieg auf eine andere Purebasic-Version schiebe ich immer so lange wie möglich hinaus wie es geht. Denn wenn ich bei jeder neuen Version den "Change"-Log lese, könnte ich jedesmal kotzen.

_________________
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 30.07.2016 17:45 
Offline
Benutzeravatar

Registriert: 17.12.2011 13:01
Wohnort: Arnsberg
OK, DAS hatte ich nicht probiert, weil in der Hilfe ja steht:

Zitat:
- Wenn Sie auf eine Sprungmarke verweisen, müssen Sie das Zeichen 'll_' vor dem Namen einfügen. Dies erfolgt, weil PureBasic ein 'll_' vor einer BASIC Sprungmarke einfügt, um Konflikte mit internen Sprungmarken zu vermeiden. Bei Verwendung des Inline-ASM muss der Verweis auf die Sprungmarke in Kleinschreibung erfolgen. Wird die Sprungmarke innerhalb einer Prozedur definiert, dann lautet ihr Präfix 'l_procedurename_', in Kleinbuchstaben.


.. allerdings hat das Compilieren mit NOP statt JNC funktioniert, also ist es wirklich nur der Vorwärtssprung.
Aber die Konvention
Code:
ll_fastcrc32_nocarry
werde ich am Montag gleich probieren. (Habe hier kein aktuelles Windows mehr).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 01.08.2016 17:53 
Offline
Benutzeravatar

Registriert: 14.08.2007 15:41
Wohnort: Lelbach
pcfreak1201 hat geschrieben:
OK, DAS hatte ich nicht probiert, weil in der Hilfe ja steht:
Zitat:
...dann lautet ihr Präfix 'l_procedurename_'.....


Da hast du Recht. Ein Fall für @Andre...Schreibfehler in der Hilfe. Richtig wäre: "ll_procedurename_..."

Warum dass der Compiler das erforderliche Präfix bei ASM-Sprünge nicht selbst erzeugt, ist mir ein Rätsel. Schliesslich durchlaufen die ASM-Instruktionen ohne vorangestelltes "!" eh` den PB-Pre-Compiler.

Weiterhin erschliesst sich mir der SINN eines expliziten "EnableASM/DisableASM" nicht. Entweder ich benutze ASM oder eben nicht.

_________________
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 01.08.2016 18:57 
Offline
Benutzeravatar

Registriert: 17.12.2011 13:01
Wohnort: Arnsberg
Moin!

OK, ist besätigt, mit ll_prozedurname_sprungmarke funktioniert es sofort und problemlos.

Wenn es mehr nicht ist, dann sehe ich das Problem als gelöst an, auch wenn die Hilfe noch korrigiert werden muß.
Außerdem glaube ich nicht, daß noch viele Assembler verwenden. Wer lernt das denn noch?
Zu meiner Zeit hatte ich das noch im Studium (8086er), aber auch nur auf DOS-Basis.
Wo es heute noch Sinn macht, sind Mikrocontroller, aber das ist ja hier /OFF_TOPIC :mrgreen:

Gruß,
pcfreak


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 01.08.2016 19:09 
Offline
Benutzeravatar

Registriert: 17.12.2011 13:01
Wohnort: Arnsberg
... übrigens gerade gesehen:
CSHW89 hat geschrieben:
http://www.purebasic.com/german/documentation/reference/inlinedasm.html
Zitat:
- Wenn Sie auf eine Sprungmarke verweisen, müssen Sie das Zeichen 'll_' vor dem Namen einfügen. Dies erfolgt, weil PureBasic ein 'll_' vor einer BASIC Sprungmarke einfügt, um Konflikte mit internen Sprungmarken zu vermeiden. Bei Verwendung des Inline-ASM muss der Verweis auf die Sprungmarke in Kleinschreibung erfolgen. Wird die Sprungmarke innerhalb einer Prozedur definiert, dann lautet ihr Präfix 'l_procedurename_', in Kleinbuchstaben.

Ist genau andersrum. Präfix für global Labels ist 'l_' und für lokale 'll_'. Ist in der englischen Hilfe auch falsch. Habs im englischen Forum auch schon reportet.


:allright:

im Beitrag "Fehler in der Online-Hilfe" ...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 02.08.2016 08:44 
Offline
Benutzeravatar

Registriert: 14.08.2007 15:41
Wohnort: Lelbach
pcfreak1201 hat geschrieben:
Außerdem glaube ich nicht, daß noch viele Assembler verwenden. Wer lernt das denn noch?

Ein Leben ohne Assembler ist zwar möglich...aber sinnlos! :lol:

_________________
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: [gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!
BeitragVerfasst: 02.08.2016 09:42 
Offline

Registriert: 12.11.2015 17:41
???


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye