Witam jak moge pobrać dane z rejestrów assemblera z poziomu c++,
mam na myśli dwukierunkowy transfer z asm do c, c do asm
Witam jak moge pobrać dane z rejestrów assemblera z poziomu c++,
mam na myśli dwukierunkowy transfer z asm do c, c do asm
w assemblerze made in Microsoft lub Borland - normalnie np.
__int32 blabla;
__asm {
mov EAX, blabla // wówczaz samoczynnie zamieni blabla na np. dword ptr [(EBP-0x8)] - adres zmiennej na stosie, plus ewentualnie indeks(jeśli to tablica) np.
mov eax,blabla[0] -> dword ptr [(EBP-0x8)+0] czyli kompilator potraktuje blabla jako adres i da zwyczajne odwołanie do pamieci tak jak to robi podczas kompilacji w C
jeśli skopiujesz ten adres(nie zawartość zmiennej) do rejestru ESI, EDI
mov ESI, &blabla // adres zmiennej skopiuje do ESI
to możesz sobie adresować dowoli, np. tablice
mov [ESI+index liczbowo],EBX
mov [ESI+EAX],EBX // index pośrednio - w EAX
mov blabla,EBX
}
gcc jest dla reptilianów i odechciewa się używać assemblera z intel syntax da sie jakoś żyć
do ścieżki kompilatora trzeba dopisać -masm=intel co zmieni globalnie
niestety później jest problem ze zmiennymi
solucja 1:
http://stackoverflow.com/questions/1635 … d-with-gcc
dobrze zoptymalizowany kod C jest lepszy niż assembler(przenośność), wystarczy kilka dobrych nawyków jak np.
parametry przekazywane w funkcji (int a, int b);
przepisać na poczatku do nowych zmiennych register int an, bn; deklarowanych tuż przed użyciem
dzieki temu kompilator wie że może użyć rejestru i traktować je tymczasowo nie musi odwoływać się za każdym razem do stosu - RAM co powoduje spore straty cykli procesora
stosować krótkie przypisania w jednej linijce - wyobrażać sobie operacje assemblera a pisać w C
w praktyce - obserwacji jak Borland radzi sobie z kompilowaniem(debuger) potrafi tworzyć kod równie dobry jak optymalizowane wstawki recznie, lepiej skupić sie na algorytmach
jak widać GCC - to ograniczenia, ograniczenia…widze linuxa w avatarze
z Visual Studio, Borlandem, IAR, CodeVision(mikrokontrolery) jest dużo wygodniej ale jeśli masz pecha używać gcc a chcesz bardzo asemblera to zmień kompilator i doklejaj wstawki w osobnych plikach kompilowanych przy jego pomocy lub zmień środowisko na takie dla ludzi nie reptilian.
Mam nadzieje ze ktoś napisze - jest metoda w gcc, generalnie - lepiej sobie tym nie zawracać gitary
a nie zalżnie od systemu hosta? jakoś odwołać się do pamięci?
Generalnie w C/C++ nie m sensu odwoływać się do rejestrów, bo niby z którego momentu?
GCC nie jest takie złe, jest całkiem ładny interfejs Asm Extended, ale nie pozwala on czytać rejestrów – bo niby po co? Podaje się tylko nazwy zmiennych i on już sam ustala których rejestrów użyć.
Trzeba po prostu sobie skompilować z ‘-s’ i obejrzeć w asmie jak tam wygląda pobranie argumentów i zwracanie wartości.
GCC ma ABI dość uniwersalne, ale bezpieczniej będzie jak prześledzisz asmowy kod wynikowy z kompilacji pod Linuksa i pod Windowsa.
Powiedzmy że potrzebuje odczytać z rejestru.
ok, mam