Brezniew Temat założony przez niniejszego użytkownika |
[C, ASM]Funkcje o zmiennej liczbie argumentów » 2013-08-03 23:00:58 Witam. Jak w temacie potrzebuje funkcji która przyjmuje zmienną liczbę argumentów, ale nie mogę użyć bibliotek standardowych c bo to funkcja w moim własnym systemie. Funkcja ma działać podobnie do funkcji printf() z bibliotek standardowych c, kod ma wyglądać mniej więcej tak: void print( const char * s,...) { byte i; for( i = 0; * s; s++ ) { if( i != 0 ) { switch( * s ) { case '%': put_c( '%', & con0 ); break; case 'x': break; } } else { if( * s == '%' ) i = 1; else put_c( * s, & con0 ); } } }
w bloku case 'x': chciałbym odczytać zmienną podaną w argumencie zmienna znajduje się na stosie, zdjęcie jej ze stosu jest bez sensu więc należy ją teraz odczytać a najlepiej po prostu odczytać adres zmiennej na stosie i wpisać jej go do zmiennej np. void * ptr; z przy następnych po prostu dodawać do niego rozmiar poprzedniej. Nie wiem jak to dokładnie zrobić ale myślałem nad wykorzystaniem wstawek z asemblera i wydaje mi się że na sam koniec funkcje trzeba ściągnąć zmienne ze stosu żeby zrobić miejsce dla innych funkcji. Jeśli ktoś znajdzie rozwiązanie to proszę żeby napisał to w temacie. Pozdrawiam :D |
|
Elaine |
» 2013-08-04 00:07:52 #include <stdarg.h> , tak samo, jak zwykle w takich sytuacjach.
Ten nagłówek powinien być dostępny także w niehostowanych implementacjach, więc możesz i powinieneś go użyć. |
|
Brezniew Temat założony przez niniejszego użytkownika |
» 2013-08-04 12:30:43 Ale ja chce do dopisać do kodu mojego os-a którego pisze od zera, ale może można policzyć offset do pierwszej zmiennej bo następne są kładziona na stos jedna za drugą a między nimi niema przerw więc odczytanie kolejnych nie powinno sprawiać kłopotów tylko zmiana wartości rejestru ESP może stanowić problem ale słyszałem że można za pomocą wstawki zdefiniować zmienną rejestru np. unsigned long zmienna __asm__( "eax" ); nie jestem pewny czy na pewno to tak wyglądała ale mniej więcej powinno być. |
|
Elaine |
» 2013-08-04 12:44:27 Ale ja chce do dopisać do kodu mojego os-a którego pisze od zera |
Powtórzę: ten nagłówek powinien być dostępny w niehostowanych implementacjach. Jeśli kompilujesz z -nostdinc, to przestań. Jeśli zbudowałeś cross-kompilator, to tej opcji nie potrzebujesz, jeśli nie, to zbuduj. |
|
Brezniew Temat założony przez niniejszego użytkownika |
» 2013-08-04 13:30:01 Dobra dzięki ja na razie spróbuję metody (( typ * )( & start_zmienna ) )[ - offset ] ; |
|
pekfos |
» 2013-08-04 13:35:19 Tak tego nie zrobisz, chyba, że typ będzie miał dobry rozmiar. |
|
Elaine |
» 2013-08-04 15:08:07 Tak się tego nie da zrobić, zachowanie czegoś takiego będzie niezdefiniowane. va_arg i rodzinki nie da się poprawnie zaimplementować w samym C, do tego trzeba skorzystać z magicznych funkcji wbudowanych w kompilator. Dlatego powinieneś użyć <stdarg.h>. Jeszcze lepszym rozwiązaniem byłoby użycie C++ i template < typename...> . |
|
Brezniew Temat założony przez niniejszego użytkownika |
» 2013-08-04 15:18:54 Ale do każdej instrukcji sterującej %* będzie określony typ danych jaki przyjmuje, jeszcze pomyśle i po testuje jak mój kod nie wypali to spróbuje tak jak wy piszecie. To są tylko proste operacje odczytu danych ja nie widzę, a jak czegoś nie da się zrobić w c to spróbuje w asemblerze. |
|
« 1 » 2 3 |