🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#1778
Author: milion
Date: Thu, 10 Apr 2008 17:18
65 lines
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 kolejnoœci 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
#1779
Author: Bogdan (bogdro)
Date: Fri, 11 Apr 2008 15:33
37 lines
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
#1780
Author: asmaniak
Date: Fri, 11 Apr 2008 16:04
18 lines
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
#1781
Author: 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ć?
Re: REQ: połączenie programu w C z funkcją w ASM
#1782
Author: milion
Date: Tue, 15 Apr 2008 20:21
61 lines
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
#1783
Author: Bogdan (bogdro)
Date: Wed, 16 Apr 2008 15:19
21 lines
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
#1784
Author: asmaniak
Date: Wed, 16 Apr 2008 17:30
14 lines
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