Thread View: pl.comp.lang.asm
7 messages
7 total messages
Started by milion
Thu, 10 Apr 2008 17:18
REQ: połączenie programu w C z funkcją w ASM
Author: milion
Date: Thu, 10 Apr 2008 17:18
Date: Thu, 10 Apr 2008 17:18
65 lines
2476 bytes
2476 bytes
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);
int main()
{
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:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
fun:
mov eax,[koniec]
push eax
mov eax, [ebp-92] ;mov eax, info ;-92(%ebp)
mov ebx, [ebp-96] ;mov cx,[dlugosc] ;-96(%ebp)
poloz: ;odkładanie kolejnych znaków na stos
mov edx,[eax]
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 "$"
--
e-Milion
Re: REQ: połączenie programu w C z funkcją w ASM
Author: Bogdan (bogdro)
Date: Fri, 11 Apr 2008 15:33
Date: Fri, 11 Apr 2008 15:33
37 lines
2114 bytes
2114 bytes
milion pisze: > 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); [...] > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > i odwr.asm: > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > fun: [...] Etykieta "fun" musi być widoczna na zewnątrz modułu asm, brakuje więc global fun -- Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS) Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: REQ: połączenie programu w C z funkcją w ASM
Author: asmaniak
Date: Fri, 11 Apr 2008 16:04
Date: Fri, 11 Apr 2008 16:04
18 lines
1415 bytes
1415 bytes
milion wyszesnastkował:
> /tmp/ccgJ000q.o: In function `main':
> maincc.c:(.text+0x6a): undefined reference to `fun' collect2: ld
> returned 1 exit status
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> i odwr.asm:
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Oczywiście potrzebujesz oznaczyć etykietę ‟fun” jako globalną z domyślnej lokalnej.
W odmianie AT&T asemblera ‟gcc” to byłoby proste:
.global fun
> fun:
--
qo |) CPL: cs[0..1] (ss[0..1]) p lvl of curr code!
_x/ , RPL: seg_sel[0..1] privilege lvl of seg_sel!
| ng __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-,
,__ -- __ -- DPL: 2._word_of_seg_desc[13..14]:`f seg_desc ,
Re: REQ: połączenie programu w C z funkcją w ASM
Author: 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ć?
Re: REQ: połączenie programu w C z funkcją w ASM
Author: milion
Date: Tue, 15 Apr 2008 20:21
Date: Tue, 15 Apr 2008 20:21
61 lines
2377 bytes
2377 bytes
Bernard pisze:
[...]
w kodzie było mnóstwo błędów i (teraz) jestem tego świadom ;) a metoda z
odkładaniem literek na stos nie jest nejefektywniejsza.
Kod działa mi poprawnie na 32-bitowym kompie. A jak zrobić żeby działał
poprawnie na 64-bitowym?
działający kod:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
w c:
#include <stdio.h>
#include <string.h>
extern void start (char text [],int dlugosc);
int main()
{
char text[100];
scanf("%s", text);
start(text,strlen(text));
printf("%s\n", text);
return 0;
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
w asm:
section .text
global start
start: push ebp ;standardowy prolog procedury
mov ebp,esp
push esi
push ebx
mov ecx,[ebp+12] ;ilosc znakow
mov ebx,[ebp+8] ;adres początku tablicy
dec ecx
add ecx,ebx ;adres końca tablicy
;~~~~~~odwracanie z wykorzystaniem rej 8b~~~~~
zamien:
mov al,[ebx] ;komórka z przodu do al
mov ah,[ecx] ;komórka z tyłu do ah
mov [ebx], ah
mov [ecx], al
inc ebx ;adresy poczatku i konca schodza sie do środka
dec ecx
cmp ebx,ecx ; jezeli adr poczatku zrówna sie lub mialby przekroczyc
jb zamien ; adr konca, wtedy przerwij petle
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pop ebx ;zdejmij rejestry ze stosu
pop esi
pop ebp ;epilog programu - przywrocenie poprzedniej wartosci ebp
ret ;Powrot z procedury
end
Re: REQ: połączenie programu w C z funkcją w ASM
Author: Bogdan (bogdro)
Date: Wed, 16 Apr 2008 15:19
Date: Wed, 16 Apr 2008 15:19
21 lines
1820 bytes
1820 bytes
milion pisze: > Bernard pisze: > [...] > > > w kodzie było mnóstwo błędów i (teraz) jestem tego świadom ;) a metoda z > odkładaniem literek na stos nie jest nejefektywniejsza. > > Kod działa mi poprawnie na 32-bitowym kompie. A jak zrobić żeby działał > poprawnie na 64-bitowym? Jeśli chodzi o wywoływanie funkcji i przekazywanie parametrów, to 64-bitowy komp nie robi różnicy. Dopiero 64-bitowy system. Zapoznaj się z "x64 Application Binary Interface" (x64 ABI). Wyszukaj w necie na przykład "x64-abi.pdf" lub "x64-abi-0.96.pdf". -- Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS) Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Re: REQ: połączenie programu w C z funkcją w ASM
Author: asmaniak
Date: Wed, 16 Apr 2008 17:30
Date: Wed, 16 Apr 2008 17:30
14 lines
1736 bytes
1736 bytes
Bogdan (bogdro) wyszesnastkował:
> milion pisze:
>> Kod działa mi poprawnie na 32-bitowym kompie. A jak zrobić żeby działał
>> poprawnie na 64-bitowym?
> Jeśli chodzi o wywoływanie funkcji i przekazywanie parametrów, to
> 64-bitowy komp nie robi różnicy. Dopiero 64-bitowy system. Zapoznaj się
> z "x64 Application Binary Interface" (x64 ABI). Wyszukaj w necie na
> przykład "x64-abi.pdf" lub "x64-abi-0.96.pdf".
Drobne różnice są w trybie 32-bitowym maszyny 64-bitowej. Związane chyba ze sposobem rozwijania liczb przypisywanych do podrejestrów rejestrów.
--
qo |) CPL: cs[0..1] (ss[0..1]) p lvl of curr code!
_x/ , RPL: seg_sel[0..1] privilege lvl of seg_sel!
| ng __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-,
,__ -- __ -- DPL: 2._word_of_seg_desc[13..14]:`f seg_desc ,
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads