[asm] open() , write()

0

Witam, tam mam pytanie, dla przykladu taki kod:


int main()
{
int fd;
char msg[] = "jakis tekst";

fd = open ("plik", O_RDONLY);
write (fd, msg, strlen (msg));
close (fd);

return 0;
}

No i teraz mam takie pytanie, gdybym chciał takowy kod napisać w wstawkach asemblerowych, mam na myśli:


int main()
{
asm (" "); / itd /
}

To jakby to miało wyglądać, chodzi mi o składnie AT&T na linuxie.
No to tak na szybko:


int open(const char *pathname, int flags);

Do rejestru %ebx wrzucam char *pathname, a do rejestru %ecx flags,
potem do %eax wrzucam numer odwolania systemowego, mianowicie: 5,
no i potem int $0x80, no i potem jeśli mam:


ssize_t write(int fd, const void *buf, size_t count);

No i tutaj mi głównie chodzi o pierwszy argument tej funkcji, wcześniej w kodzie w C, zrobiłem: fd = open ("plik", O_RDONLY);
i ten fd to pierwszy argument w funkcji write(), i nie wiem właśnie jak się odwołać do tego pierwszego argumentu w asmie, mam nadzieje że ktoś zrozumiał mi o co chodzi, albo inaczej, napisałem już w asmie, że plik mi otwiera, i dochodzę do write(), ale nie wiem co dać jako pierwszy argument..tzn nie wiem co gdzie mam wrzucić :) mam nadzieje że ktoś zrozumiał o co mi chodzi, wiem że tutaj zawile to opisalem, ale jednak..

Dziękuje za pomoc.
Pozdrawiam.

0

Jeśli masz debugger... To badzo szybko sie zorientujesz jak :> Wystarczy skompilować program w pierwszej postaci i obejrzec rozkaz po rozkazie jak działa...

Druga mozliwośc... compilation via assembly... nawet nie musisz odpalac debuggera, ogladasz tylko zródło przetłumaczone na asma

0

Jako fd dajesz to co zwrocila funkcja open w eax.

0

int asdf( int a, int b, int c ); <=- mamy taka funckje sobie

xxx = asdf( 1, 2, 3 ); <=- i jej wywolanie

tlumaczone jest ono na:
push 3
push 2
push 1
call asdf // tutaj oczywiscie adres asdf
add esp, 12 // funkcja nie popuje argumentow, wiec trzeba ich ze stosu sie pozbyc, zazwyczaj jest to wlasnie tak robione
mov xxx, eax // gdzie xxx to [adres xxx]
parametry jak widac sa wrzucane na stos od konca

w skladni at&t wygladalo by to tak (thx Unav ;>):
pushl $3
pushl $2
pushl $1
call asdf
addl $12, %esp
movl %eax, xxx

pozdrawiam

0

Dzięki za pomoc, poradziłem sobie za pomocą strace, przupuściłem przez niego program, i było wszystko jasne :) a swoją drogą teraz to już zupełnie głupie pytanie, jak zrobię:


int fd = open ("plik", O_RDWR);
write (fd, buffor, strlen (buffor));

Funkcja write() nadpisuje wcześniejszą zawartość pliku, w sensie kasuje ją, jaki inny parametr jest do open() żeby write() tylko dopisywał ? :) Sorry, za tak głupie pytanie.

Dzięki za pomoc.
Pozdrawiam.

0
int fd = open ("plik", O_RDWR);
lseek(fd, 2, 0);
write (fd, buffor, strlen (buffor));

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