🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #1781

Re: REQ: połączenie programu w C z funkcją w ASM

#1781
From: Bernard
Date: Sat, 12 Apr 2008 12:29
85 lines
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 kolejnoœci 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-mail
References: <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