AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Assemler Routine ummodeln - wer kann bitte helfen
Thema durchsuchen
Ansicht
Themen-Optionen

Assemler Routine ummodeln - wer kann bitte helfen

Ein Thema von turboPASCAL · begonnen am 7. Okt 2007 · letzter Beitrag vom 7. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#1

Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 14:48
Hi,

ich habe volgende Procedure:

Delphi-Quellcode:
{------------------------------------------------------------------}
{  Swap bitmap format from BGR to RGB                              }
{------------------------------------------------------------------}
procedure SwapRGB(data : Pointer; Size : Integer);
asm
  mov ebx, eax
  mov ecx, size

@@loop :
  mov al,[ebx+0]
  mov ah,[ebx+2]
  mov [ebx+2],al
  mov [ebx+0],ah
  add ebx,3
  dec ecx
  jnz @@loop
end;
und möchte sie wiefolgt verändern:

Delphi-Quellcode:
procedure SwapRGB(data : Pointer; Size : Integer; Step: Byte);
asm
  mov ebx, eax
  mov ecx, size
  mov ???, step

@@loop :
  mov al,[ebx+0]
  mov ah,[ebx+2]
  mov [ebx+2],al
  mov [ebx+0],ah
  add ebx, ??? (4)
  dec ecx
  jnz @@loop
end;
Das soll ein Array umformen in etwa so:

Code:
BGRA, BGRA, BGRA...
// nach:
RGBA, RGBA, RGBA...

und das ergibt dann eine Bitmapladeroutiene für zB. OpenGl:

Delphi-Quellcode:
function LoadBMPTexture(ResID: Integer; var Texture : GLuint) : Boolean;
var
  BitmapLength: LongWord;
  bmpBits: array of byte;
  hBmp: HBitmap;
  bi: tagBITMAP;
begin
  hBmp := Loadimage(HInstance, MAKEINTRESOURCE(ResID), IMAGE_BITMAP, 0,0,0);
  GetObject(hBmp, sizeof(bi), @bi);
  BitmapLength := bi.bmWidth * bi.bmHeight * bi.bmBitsPixel Div 8;
  SetLength(bmpBits, BitmapLength+1);
  GetBitmapBits(hBmp, BitmapLength, @bmpBits[0]);

  if @bmpBits[0] <> nil then
  begin
    SwapRGB(@bmpBits[0], bi.bmWidth * bi.bmHeight); // Swap Bitmap Bits BGR(A) to RGB(A)
    Texture := CreateTexture(bi.bmWidth, bi.bmHeight, GL_RGBA, @bmpBits[0]);
    Result := (Texture <> 0);
  end else
    Result := False;

  DeleteObject(hBmp);
end;
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
kolbaschedder

Registriert seit: 24. Aug 2006
Ort: Schwäbisch Gmünd
55 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 14:54
Hallo,

wenn ich das richtig verstehe, macht das die vorhandene Funktion bereits.
Delphi-Quellcode:
  dec ecx <-- size um 1 erniedrigen
  jnz @@loop <--jnz = jump if not zero, also springe nach @@loop wenn size noch nicht null
MfG

Kolbaschedder
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 14:55
Also:
1. Diese Routine ist ganz gefährlich, da sie ebx verändert und nicht zurücksetzt!
Bsp: Falls du sie aus einer längeren Methode aufrufst (Delphi legt self meist in ebx) wird self verändert du hast einen fehler beim Zugriff auf Objekteigene Properties etc. Auch sonst kann etwas wichtiges in ebx liegen, was die aufrufende Routine gerne so wieder vorfinden möchte. Hingegen darf eax, ecx und edx verändert werden.
2. wäre ja noch edx frei, da muss ich mal schauen. Warum willst du es eigentlich in Assembler?

Edit: und 3. Was soll jetzt step bei dir bzw. dem Beispiel bewirken?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 15:05
Ich glaube, ich weis jetzt, was du meinst.
Für deinen Fall müsstest du in step 1 übergeben.
Delphi-Quellcode:
procedure SwapRGB(data : Pointer; Size : Integer; Step: Integer);
asm
  push ebx
  add ecx,3
  test edx,edx
  jz @@end

@@loop :
  mov bl,[eax+0]
  mov bh,[eax+2]
  mov [eax+2],bl
  mov [eax+0],bh
  add eax, ecx
  dec edx
  jnz @@loop
@@end:
  pop ebx
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#5

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 15:29
Tja, nun steig ich nicht mehr so recht druch. wo werden denn
die Parameter wie step übergeben (an den asm-Teil)?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 15:32
Aufrufkonvention ist Register, folglich liegt Data in EAX, Size in EDX und Step in ECX.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#7

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 16:03
thx Apollonius.


Also nochmal für Dummies, wie müsste folgender Code als ASM aussehen ?

Delphi-Quellcode:
 // pData als Pointer übergeben ?!... (to do...)

  procedure _SwapRGB(pData: TByteArray; pDataLength: DWORD; Alpha: Byte);
  var
    n: DWORD;
    b, r: byte;
  begin
    n := 0;
    while n <= pDataLength-4 do
    begin
      b := pData[n];
      r := pData[n + 2];
      pData[n] := r;
      pData[n + 2] := b;
      pData[n + 3] := Alpha;
      inc(n, 4);
    end;
  end;

oder macht das keinen Sinn für die Geschwindigkeit (Delphi oder ASM)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 16:11
Wenn es einen Unterschied gibt, dann dürfte er sehr gering sein.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#9

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 16:19
Bei grossen Bitmaps (1024*1024) scheint es noch recht zügig zu laufen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Assemler Routine ummodeln - wer kann bitte helfen

  Alt 7. Okt 2007, 16:35
Kannst ja die probieren:
Delphi-Quellcode:
procedure SwapRGB(data : Pointer; Size : Integer; Alpha:byte);
asm
  push ebx
  test edx,edx
  jz @@end

@@loop :
  mov bl,[eax+0]
  mov bh,[eax+2]
  mov [eax+2],bl
  mov [eax+0],bh
  mov [eax+3],cl

  add eax, 4
  sub edx, 4
  jnle @@loop
@@end:
  pop ebx
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz