[ zikaa @ 26.01.2005. 00:04 ] @
dakle funkcija treba samo da zameni dva stringa a pravi dosta gluposti,
ako neko vidi gde gresim , neka mi kaze.

swap.s
Code:


.intel_syntax noprefix

.text
.global swap_strings

    #funkcija swap_strings
    #menja stringove s1 i s2
    #koji se nalaze
    #na adresama [ebp+8] i [ebp+12]
    
swap_strings:
    enter 0,0

    mov eax, [ebp+8]
    mov eax, [eax]
    mov ecx, [ebp+12]
    xchg [ecx], eax
    mov ecx, [ebp+8]
    xchg [ecx], eax

    
    leave
    ret



i jos test.c
Code:

#include <string.h>
#include <malloc.h>

extern void swap_strings(char *s1, char *s2);

int main()
{
  char *s1;
  char *s2;


  s1=strdup("prvi");
  s2=strdup("drugi");

  printf("%s , %s \n",s1,s2);

  swap_strings(s1,s2);
  printf("%s , %s \n",s1,s2);

  return 0;
}


i komande za kompajliranje (pod linuksom)
as swap.s
gcc -c test.c
gcc -o test test.o swap.o

[Ovu poruku je menjao Sundance dana 28.01.2005. u 16:02 GMT+1]
[ Vojislav Milunovic @ 26.01.2005. 02:30 ] @
Nisu glup =) svako ko zeli da radi u asm zna sta hoce i to ne znaci da je covek glup...
Prvo cu ti ukazati na nest osto ja mislim da je bitno pa posle prelazimo na ispravljanje gresaka u kodu:
prvo stringove kad vezujes za pointer moj ti je savet da odmah ides sa
char *prvi="prvi"; umesto strdup, jer je jednostavnoje i lepse za razumevanje, a i preglednije i manje kucanja sto je najbitnije =)))

Naime sto se tice samog predavanja funkciji ovo sto tvoj kod radi je bukvalno sledece ->>
string_swap(0x411111,0x42222)
gde su ove adrese u stvari pointeri na stringove i ti mozes da menjas stringove na tim adresama, medjutim ono sto ti hoces a nisi uradio je greska u samom C delu koda ali ne i u ASM kodu koji radi stvarno ono sto si hteo.
Naime trebao si umesto :
Code:

swap_strings(s1,s2);

da uradis ovo
Code:

swap_strings(&s1, &s2);


asm kod ti je sasvim ok mada bi ga ja skratio malo :
Code:

mov eax, [ebp+8]
mov ecx, [ebp+12]
push [eax]
push [ecx]
pop [eax]
pop [ecx]


Nadam se da sam pomogao sa ovim
[ zikaa @ 26.01.2005. 03:02 ] @
hvala.
Mozes li da mi kazes kako bi napisao funkciju koja
se poziva sa swap_strings(s1,s2)?
[ Vojislav Milunovic @ 26.01.2005. 14:11 ] @
Nazalost tako nesto je nemoguce u C iz ovog razloga.
KAd predas s1 kao argument funkciji ti ne predajes adresu gde se cuva adresa stringa, vec predajes samo adresu stringa, tako da zamena argumenata koju si radio u prvobitnom kodu samo radi kao da od pocetka predato umest s1,s2 ->> s2, s1... zato moras adresu pointera da menjas, mislim da C++ ima nesto sto se zovu reference i mislim da bi preko njih to bilo moguce, ali nisam siguran jer davno (5godina) nisam radio u C++...
[ zikaa @ 27.01.2005. 00:45 ] @
hvala jos jednom