Article View: pl.comp.lang.asm
Article #1781Re: REQ: połączenie programu w C z funkcją w ASM
From: Bernard
Date: Sat, 12 Apr 2008 12:29
Date: Sat, 12 Apr 2008 12:29
85 lines
3272 bytes
3272 bytes
milion wrote:
> mam problem z połączeniem 2 cześci programu w C i ASM (nasm). program ma
> wyświetlać na monitorze string wprowadzony z klawiatury w kolejności
> odwrotnej. przy linkowaniu < gcc maincc.c odwr.o -o program >
> wywala mi błąd:
>
> /tmp/ccgJ000q.o: In function `main':
> maincc.c:(.text+0x6a): undefined reference to `fun'
> collect2: ld returned 1 exit status
>
> co mam źle i jak to zmienić? (maszyna 32bit)
> a moje pliki wyglądają tak:
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> maincc.c :
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> #include <stdio.h>
> #include <string.h>
> extern fun (char *info, int dlugosc);
słowo extern zbędne, a typ funkcji domniemany na int. Słyszałeś o
prototypach?
> int main()
j.w.
> {
> char info[80];
> int dlugosc;
>
> printf("Podaj stringa: \n");
> scanf("%s", info);
> dlugosc=strlen(info);
>
> fun ( info, dlugosc);
>
>
> printf("%s\t %d\n", info, dlugosc);
> return 0;
> }
>
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> i odwr.asm:
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Przydałoby się "global fun"
> fun:
> mov eax,[koniec]
> push eax
>
> mov eax, [ebp-92] ;mov eax, info ;-92(%ebp)
> mov ebx, [ebp-96] ;mov cx,[dlugosc] ;-96(%ebp)
Ciekawe, co właśnie załadowałeś do rejestrów eax i ecx. Trudno to
zgadnąć, ale jeżeli są to argumenty funkcji, to wyłącznie przez czysty
przypadek. Poczytaj coś o konwencji wołania zanim zaczniesz pisać kod
asemblerowy wołany z C. Polecam dokumencik "abi386-4.pdf" do wygooglania.
Przy okazji - ebx nie wolno używać bez uprzedniego zapamiętania.
>
> poloz: ;odkładanie kolejnych znaków na stos
> mov edx,[eax]
Tu pobierasz i odkładasz 4 bajty
> push edx
> add eax,1
> cmp eax, [ebx]
> jne poloz
>
> mov eax, [ebp-92] ;mov eax, info ;-92(%ebp)
> mov cx, [ebp-92] ;mov cx,[dlugosc] ;-96(%ebp)
> add cx, 1
> pobierz: ; pobieranie kolejnych znaków ze stosu
> pop edx ; w kolejnoci odwrotnej
> mov [eax],edx
> add eax,1
> sub cx, 1
> jnz pobierz
>
> ret
> koniec db "$"
A to niby co miało być?
Technical Details
Message-ID:
<4800ab47$0$31402$f69f905@mamut2.aster.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.astercity.net!news.aster.pl!not-for-mailReferences:
<ftli4l$kuu$2@news.ds.pg.gda.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.astercity.net!news.aster.pl!not-for-mail Date: Sat, 12 Apr 2008 14:29:58 +0200 From: Bernard <bernard@earth.net> User-Agent: Thunderbird 2.0.0.12 (Windows/20080213) MIME-Version: 1.0 Newsgroups: pl.comp.lang.asm Subject: Re: REQ: połączenie programu w C z funkcją w ASM References: <ftli4l$kuu$2@news.ds.pg.gda.pl> In-Reply-To: <ftli4l$kuu$2@news.ds.pg.gda.pl> X-Antivirus: avast! (VPS 080412-0, 2008-04-12), Outbound message X-Antivirus-Status: Clean Lines: 86 Message-ID: <4800ab47$0$31402$f69f905@mamut2.aster.pl> NNTP-Posting-Date: 12 Apr 2008 12:29:59 GMT NNTP-Posting-Host: 82.210.165.187 X-Trace: 1208003399 mamut2.aster.pl 31402 82.210.165.187:2669 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit