Siema.
Mam pewien problem, mianowicie: próbuję przerobić niewielki fragment kodu assemblerowego napisanego w składni Intel'owskiej na kod w notacji AT&T ale mi nie za bardzo wychodzi, ciągle dostaję jakieś błędy kompilatora wiele z nich już poprawiłem ale reszty nie dam rady.
Oto kod:
//buffer to wskaźnik do danych wyciągniętych z bitmapy(tylko obrazek bez nagłówka)
//size to rozmiar tej bitmapy
void flipIt(void* buffer, unsigned int size) // Flips The Red And Blue Bytes (256x256)
{
void* b = buffer; // Pointer To The Buffer
//poniższa forma dla kompilatora GCC
asm("movl $_size, %ecx\n\t" //?
"movl $_b, %ebx\n\t" //?
"label:\n\t"
"movb 0(,%ebx,), %al\n\t"
"movb 2(,%ebx,), %ah\n\t"
"movb %al, 2(,%ebx,)\n\t"
"movb %ah, 0(,%ebx,)\n\t"
"addl $3, %ebx\n\t"
"decl %ecx\n\t"
"jnz label\n\t");
//poniższa forma dla kompilatora VC++ lub Borland'a
/*__asm // Assembler Code To Follow
{ //w miejscu size poniżej było 256*256
mov ecx, size // Set Up A Counter (Dimensions Of Memory Block)
mov ebx, b // Points ebx To Our Data (b)
label: // Label Used For Looping
mov al,[ebx+0] // Loads Value At ebx Into al
mov ah,[ebx+2] // Loads Value At ebx+2 Into ah
mov [ebx+2],al // Stores Value In al At ebx+2
mov [ebx+0],ah // Stores Value In ah At ebx
add ebx,3 // Moves Through The Data By 3 Bytes
dec ecx // Decreases Our Loop Counter
jnz label // If Not Zero Jump Back To Label
}*/
}
A teraz błędy kompilatora i linkera:
files.cpp: In function `void flipIt(void*, unsigned int)':
files.cpp:6: warning: unused variable 'b'
Linking...
D:\dokumenty\programowanie\zrodla\GreenHell2\..\GreenHell_Debug\files.o(.text+0x175): In function `Z6flipItPvj':
D:\dokumenty\programowanie\zrodla\GreenHell2\files.cpp:18: undefined reference to `size'
D:\dokumenty\programowanie\zrodla\GreenHell2\..\GreenHell_Debug\files.o(.text+0x17a):D:\dokumenty\programowanie\
zrodla\GreenHell2\files.cpp:18: undefined reference to `b'
collect2: ld returned 1 exit status
Prawie w ogóle się nie znam na assemblerze a kod ten bardzo mi się przyda, gdyż piszę pewien program używający OpenGL'a w którym jest potrzeba szybkiego zamieniania formatu kolorów BGR na RGB a powyższa funkcja ma za zadanie właśnie to robić.
Ps. Szukałem już wszędzie czegoś na temat assemblera i AT&T ale to co znalazłem było niestety niewystarczające.
Z góry bardzo dziękuję za pomoc.