[C+Asm] Błędny adres.

0

Witam.
Mam taki problemik. Mam kod w ASM:

_send_msg:
    push ebp
    mov ebp, esp
    mov ebx, [ebp + 8]
    mov ecx, [ebp + 12]
    mov eax, 2
    int 0x80
    leave
    retn

i wywołenie tego kodu w C

 extern int send_msg(unsigned long handle, msg_t * msg);
 msg_t msg; //Taki sobie typ
 msg.message_id = VIDEO_PUTCH;
 unsigned long h = get_task("IDDLE"); //Nie wazne :P
 send_msg(h, &msg); //To
 send_msg(h, &msg); //i to
 send_msg(h, &msg); //i to to wywolania funkcji w asm
 send_msg(h, &msg);

I teraz mam kod podpięty pod przerwanie 0x80, który pokazuje wartości rejestrów:
Po 1 wysolaniu jest tam poprawny adres (0x800034)
Po 2 wartosc 0x30
Po 3 wartosc 0x30
Po 4 wartosc 0x30
Czy ktos wie czemu tak sie dzieje???
Ja juz probowalem ogrolnej ilości sposobów i pomysły mi się zkończyły :/
Pozdro.

0

Nie wiem co robi to przerwanie, ale sporo przerwań zwraca wyniki w rejestrach.
Należy zachować i później, po przerwaniu, odtworzyć rejestry...

0
git napisał(a)

Nie wiem co robi to przerwanie, ale sporo przerwań zwraca wyniki w rejestrach.
Należy zachować i później, po przerwaniu, odtworzyć rejestry...

Czytałeś to:

milyges napisał(a)

I teraz mam kod podpięty pod przerwanie 0x80, który pokazuje wartości rejestrów
???

0

hm, nie jestem dobry w asm'ie, ale robisz tam push ebp, a pop nie powinienes? Chociaz to nie ma nic do gadania. Moze ten int cos produkuje w innych rejestrach, a potem Ty to zostawiasz i jego to za drugim i trzecim razem martwi (tego int'a). Sorry, ze tak pisze po pol miesiacu ^^' ale nikt na temat nie odpowiada...

Ide juz spac, do szkoly rano :P GN8

0
nameczanin napisał(a)

hm, nie jestem dobry w asm'ie, ale robisz tam push ebp, a pop nie powinienes?
Robi pop - nie wprost. Zauważ instrukcję leave

leave

to to samo co:

mov esp, ebp
pop ebp
0

heh, zauwazylem to leave, ale to nie instrukcja procesorowa, nie? (pytam)
Bo - skad wiesz czy robi tego pop'a? :D Zreszta, to nie ma raczej nic do rzeczy.

0

Ależ to są instrukcje procesora klasy x86 począwszy od 286
przykładowy opis

0

ehehe, sorry i dzieki ;)

0

przede wszystkim,polecam zmienić zapis na taki,jeżeli robisz to jako zewnętrzną procedurę asemblerową(składnia MASM,ale i TASM ją załapie po przeróbce ):

_send_msg proc C handle:dword,msg:dword
mov ebx,handle
mov ecx,msg
mov eax,2
int 80h
ret 8
_send_msg endp

instrukcja leave jest w takim przypadku całkowicie zbędna,można ją zawsze zastąpić poleceniem RET n,które skutkuje powrotem z procedury wraz ze zdjęciem X bajtów z wierzchołka stosu

widzę,że twoja procedura zwraca wartość typu int,więc po powrocie z przerwania,a przed wykonaniem RET 8 upewnij się,że w rejestrze AX masz wartość którą chcesz zwracać.Jeżeli przerwanie to nie modyfikuje zawartości AX,to niezmiennie procedura będzie ci zwracała 2

0
MasterBLB napisał(a)

przede wszystkim,polecam zmienić zapis na taki,jeżeli robisz to jako zewnętrzną procedurę asemblerową(składnia MASM,ale i TASM ją załapie po przeróbce ):

To jest N A S M :>
//Pisze ze spacjami bo Error 403

0

hmmm przyznam się że z N A S Mem do czynienia nie miałem,lecz co jak co,ale definiować procedury to w nim się musi udać.Mogą tylko wystapić kłopoty odnośnie specyfikacji języka( to C po proc),to w takim wypadku sprawdź w dokumentacji N A S Ma jak w nim się dokonuje tej specyfikacji.

a tak w ogóle,polecam się przesiąść na MASM8.0,chyba najlepiej ze wszystkich asemblerów wspomaga hybrydyzację z C/C++ ;)

0

Ale MASM jest, zdaje się, tylko pod windows, a skoro milyges wykorzystuje przerwanie 0x80 to jest to raczej Linux albo podobny system.
A NASM jest bardzo fajny :)

0

Nie jest to Linux tylko mój OS :d

0

A masz jeszcze w ogóle z tym problem ?
Bo jak tak to ja bym poprosił pełen kod do prześledzenia.

0

Nie już nie, przepisuje OS'a od początku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1