Wymiana danych między assemblerem a c++


(fedora24x) #1

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


(stasinek) #2

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 :wink:

jak widać GCC - to ograniczenia, ograniczenia...widze linuxa w avatarze

  • powodzenia :wink:

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


(fedora24x) #3

a nie zalżnie od systemu hosta? jakoś odwołać się do pamięci?


(Razi) #4

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.


(fedora24x) #5

Powiedzmy że potrzebuje odczytać z rejestru.


(kostek135) #6

http://stackoverflow.com/questions/2114 ... c-variable


(fedora24x) #7

ok, mam