Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C, ASM]Funkcje o zmiennej liczbie argumentów

Ostatnio zmodyfikowano 2013-08-22 14:01
Autor Wiadomość
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:
C/C++
void print( const char * s,...)
{
    byte i;
    for( i = 0; * s; s++ )
    {
        if( i != 0 )
        {
            switch( * s )
            {
            case '%':
                put_c( '%', & con0 );
                break;
            case 'x':
                //kod
                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
P-89411
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ć.
P-89416
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ć.
P-89437
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.
P-89443
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 ]
;
P-89455
pekfos
» 2013-08-04 13:35:19
Tak tego nie zrobisz, chyba, że typ będzie miał dobry rozmiar.
P-89457
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...>
.
P-89464
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.
P-89467
« 1 » 2 3
  Strona 1 z 3 Następna strona