[gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
pcfreak1201
Beiträge: 38
Registriert: 17.12.2011 13:01
Computerausstattung: Linux Mint 17.3 (Rosa) x64 | PB 5.42LTS x64 (Linux+Win)
Wohnort: Arnsberg

[gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Beitrag von pcfreak1201 »

Hallo!

Ich habe unter Win7 64bit folgenden Fehler beim compilieren:
https://drive.google.com/file/d/0B6T0p7 ... VMTFE/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: Alles auswählen

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.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Beitrag von 7x7 »

Code: Alles auswählen

;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
Benutzeravatar
pcfreak1201
Beiträge: 38
Registriert: 17.12.2011 13:01
Computerausstattung: Linux Mint 17.3 (Rosa) x64 | PB 5.42LTS x64 (Linux+Win)
Wohnort: Arnsberg

Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Beitrag von pcfreak1201 »

OK, DAS hatte ich nicht probiert, weil in der Hilfe ja steht:
- 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: Alles auswählen

ll_fastcrc32_nocarry
werde ich am Montag gleich probieren. (Habe hier kein aktuelles Windows mehr).
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Beitrag von 7x7 »

pcfreak1201 hat geschrieben:OK, DAS hatte ich nicht probiert, weil in der Hilfe ja steht:
...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
Benutzeravatar
pcfreak1201
Beiträge: 38
Registriert: 17.12.2011 13:01
Computerausstattung: Linux Mint 17.3 (Rosa) x64 | PB 5.42LTS x64 (Linux+Win)
Wohnort: Arnsberg

Re: ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Beitrag von pcfreak1201 »

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
Benutzeravatar
pcfreak1201
Beiträge: 38
Registriert: 17.12.2011 13:01
Computerausstattung: Linux Mint 17.3 (Rosa) x64 | PB 5.42LTS x64 (Linux+Win)
Wohnort: Arnsberg

Re: [gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Beitrag von pcfreak1201 »

... übrigens gerade gesehen:
CSHW89 hat geschrieben:http://www.purebasic.com/german/documen ... edasm.html
- 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" ...
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: [gelöst] ASM-Bug unter Win7 (x64) und PB5.42LTS ?!

Beitrag von 7x7 »

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
Antworten