Problem mit inline Assembler - STOSW

Für allgemeine Fragen zur Programmierung mit PureBasic.
sverson
Beiträge: 19
Registriert: 06.02.2005 01:42
Wohnort: Deutschland

Problem mit inline Assembler - STOSW

Beitrag von sverson »

Hallo!

Ich wollte folgende Funktion sauberer/schneller programmieren und dachte an die String-Funktion STOSW. Der Compiler scheint aber nur STOS zu akzeptieren?!? :cry:

Code: Alles auswählen

Procedure.s BinToHex(binBuffer.l, binSize.l)
  Protected hexBuffer.s
  hexBuffer = Space(binSize*2)

  MOV Esi, binBuffer ;/ Zeiger auf binBuffer nach Source Index (ESI)
  MOV Ecx, binSize   ;/ binBuffer Länge nach Counter (ECX)
  MOV Edi, hexBuffer ;/ Zeiger auf hexBuffer nach Destination Index (EDI)
  label1:
  MOV AL, [Esi]      ;/ Byte aus binBuffer in AL einlesen
  MOV AH, AL         ;/ und in AH kopieren
  And AL, 15         ;/ nur die unteren 4 Bit in AL behalten
  SHR AH, 4          ;/ nur die oberen 4 Bit in AH behalten
  CMP AL, 10         ;/ ist AL < 10 ("0".."9")
  JB l_label2        ;/ weiter, wenn ja
  ADD AL, 7          ;/ ASCII Offset von "A" ab "9" addieren, wenn nein
  label2:
  ADD AL, 48         ;/ ASCII Offset von "0" addieren
  CMP AH, 10         ;/ ist AH < 10 ("0".."9")
  JB l_label3        ;/ weiter, wenn ja
  ADD AH, 7          ;/ ASCII Offset von "A" ab "9" addieren, wenn nein
  label3:
  ADD AH, 48         ;/ ASCII Offset von "0" addieren
  MOV [Edi], AH      ;/ HiByte als ASCII an HexBuffer übergeben
  INC Edi            ;/ hexBuffer-Zeiger auf nächste Position setzen
  MOV [Edi], AL      ;/ LoByte als ASCII an HexBuffer übergeben
  INC Edi            ;/ hexBuffer-Zeiger auf nächste Position setzen
  INC Esi            ;/ binBuffer-Zeiger auf nächste Position setzen
  DEC Ecx            ;/ binSize Counter zurückzählen
  JNZ l_label1       ;/ wiederholen, solange binSize Counter > 0
  MOV AL, 0          ;/ AL auf NULL setzen
  MOV [Edi], AL      ;/ Stringende an HexBuffer übergeben
  
  ProcedureReturn hexBuffer
EndProcedure


Str01$="Test u.s.w." ;/ Statt String01$ wird normalerweise ein Binärbuffer eingesetzt
str02$=BinToHex(@Str01$,Len(Str01$))
Debug Str01$
Debug Len(Str01$)
Debug str02$
Debug Len(str02$)

Hat jemand dazu 'nen Tipp?

P.S. Weiss jemand, was mit dem Englischen Forum los ist?
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Re: Problem mit inline Assembler - STOSW

Beitrag von traumatic »

Geht es so?

Code: Alles auswählen

!STOSW
So wird ganze direkt an FASM durchgereicht...
sverson
Beiträge: 19
Registriert: 06.02.2005 01:42
Wohnort: Deutschland

Beitrag von sverson »

Danke, traumatic

!STOSW funktioniert.

Ich muß zu meiner Schande gestehen, daß ich das schon probiert hatte, weil der Debugger aber 'drübergehopst' ist, hatte ich nicht mehr weitergetestet.

So gibt's das gleiche Ergebnis:

Code: Alles auswählen

Procedure.s BinToHex(binBuffer.l, binSize.l)
  Protected hexBuffer.s
  hexBuffer = Space(binSize*2)
  MOV Esi, binBuffer ;/ Zeiger auf binBuffer nach Source Index (ESI)
  MOV Ecx, binSize   ;/ binBuffer Länge nach Counter (ECX)
  MOV Edi, hexBuffer ;/ Zeiger auf hexBuffer nach Destination Index (EDI)
  label1:
  MOV AL, [Esi]      ;/ Byte aus binBuffer in AL einlesen
  MOV AH, AL         ;/ und in AH kopieren
  SHR AL, 4          ;/ nur die oberen 4 Bit in AL behalten
  And AH, 15         ;/ nur die unteren 4 Bit in AH behalten
  CMP AL, 10         ;/ ist AL < 10 ("0".."9")
  JB l_label2        ;/ weiter, wenn ja
  ADD AL, 7          ;/ ASCII Offset von "A" ab "9" addieren, wenn nein
  label2:
  ADD AL, 48         ;/ ASCII Offset von "0" addieren
  CMP AH, 10         ;/ ist AH < 10 ("0".."9")
  JB l_label3        ;/ weiter, wenn ja
  ADD AH, 7          ;/ ASCII Offset von "A" ab "9" addieren, wenn nein
  label3:
  ADD AH, 48         ;/ ASCII Offset von "0" addieren
  !STOSW             ;/ umgewandeltes Byte als ASCII-"Wort" an HexBuffer übergeben
  INC Esi            ;/ binBuffer-Zeiger auf nächste Position setzen
  DEC Ecx            ;/ binSize Counter zurückzählen
  JNZ l_label1       ;/ wiederholen, solange binSize Counter > 0
  MOV AL, 0          ;/ AL auf NULL setzen
  MOV [Edi], AL      ;/ Stringende an HexBuffer übergeben
  ProcedureReturn hexBuffer
EndProcedure
Antworten