Seite 1 von 1

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

Verfasst: 30.07.2016 12:10
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

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

Verfasst: 30.07.2016 16:07
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.

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

Verfasst: 30.07.2016 17:45
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).

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

Verfasst: 01.08.2016 17:53
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.

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

Verfasst: 01.08.2016 18:57
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

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

Verfasst: 01.08.2016 19:09
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" ...

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

Verfasst: 02.08.2016 08:44
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:

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

Verfasst: 02.08.2016 09:42
von C h r i s :)
???