Avatar billede baxos Nybegynder
14. januar 2009 - 18:42 Der er 22 kommentarer

Externt kode i fpc

Hej eksperter!
Sidder og skriver noget kode og har brug for at køre noget assembler fra dens egen fil, og tænkte på om det ikke kan lade sig gøre at køre nogle af funktionerne gennem pascal programmet altså externt?

compilere med nasm til en object fil og derefter vil jeg så linke det?
Avatar billede arne_v Ekspert
14. januar 2009 - 18:52 #1
Du spoerger til:
- hvad du skal skrive i Pascal koden for en funktion som du har lavet i assembler
- hvordan du fortaeller FPC at den skal linke en .OBJ fil med ind
?
Avatar billede psycosoft-funware Nybegynder
14. januar 2009 - 19:10 #2
hvilken platform og processor er koden fokuseret på?

./psycosoft-funware :)
Avatar billede hrc Mester
15. januar 2009 - 12:14 #3
Har aldrig prøvet, men kan du ikke lave det direkte i BASM, i delphis kode?
Avatar billede baxos Nybegynder
15. januar 2009 - 17:18 #4
Arne_v kun det første spørgsmål..
Det er bare på x86
og hrc nej det kan desværre ikke gøres direkte
Avatar billede arne_v Ekspert
15. januar 2009 - 17:29 #5
Der er ikke bare:

procedure foo(v : integer); external;
function bar(v : integer) : integer; external;

?
Avatar billede baxos Nybegynder
16. januar 2009 - 16:50 #6
kernel.o: In function `kmain':
kernel.pas:(.text+0x3a): undefined reference to `KERNEL_KTEST'

Får bare denne fejl når jeg linker den så
Avatar billede arne_v Ekspert
16. januar 2009 - 17:11 #7
Calling convention problem maaske ?

Der skere nogle forskellige ting med navn alt efter calling convention.
Avatar billede baxos Nybegynder
17. januar 2009 - 20:27 #8
hmm muligvis..
hvordan sker det og hvordan skal jeg løse problemet? :)
Avatar billede arne_v Ekspert
17. januar 2009 - 23:18 #9
Følgende viser noget som virker:

C:\>type add.c
int add_c(int a, int b)
{
    return a + b;
}

C:\>type add.s
        .text
.globl _add_asm
_add_asm:
        pushl  %ebp
        movl    %esp, %ebp
        movl    12(%ebp), %eax
        addl    8(%ebp), %eax
        popl    %ebp
        ret

C:\>type testasm.pas
program testasm;

{$L add_c.obj}
{$L add_asm.obj}

function add_c(a, b : integer) : integer; cdecl; external;
function add_asm(a, b : integer) : integer; cdecl; external;

begin
  writeln(add_c(2, 3));
  writeln(add_asm(2, 3));
end.

C:\>gcc -c add.c -o add_c.obj

C:\>gcc -c add.s -o add_asm.obj

C:\>fpc testasm.pas
Free Pascal Compiler version 2.2.0 [2007/09/09] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Win32 for i386
Compiling testasm.pas
Linking testasm.exe
12 lines compiled, 0.1 sec, 23632 bytes code, 1144 bytes data

C:\>testasm
5
5
Avatar billede baxos Nybegynder
18. januar 2009 - 13:55 #10
Det vil jeg straks prøve når jeg lige får mulighed for det :)
Hvis det nu volder problemer skulle jeg måske sige at jeg compilere alle mine pas filer til .obj og derefter linker dem til en elf
Avatar billede baxos Nybegynder
18. januar 2009 - 15:40 #11
Hvad er det forresten for noget asm du bruger?
Avatar billede arne_v Ekspert
18. januar 2009 - 15:42 #12
Jeg bruger GNU assembler. Mest fordi at jeg har snydt. Jeg fik C compileren
til at outputte assembler for C koden og saa tilrettede jeg den.

:-)
Avatar billede baxos Nybegynder
18. januar 2009 - 15:51 #13
haha okay jeg vil lige forsøge det
Avatar billede baxos Nybegynder
18. januar 2009 - 16:02 #14
Virker stadig ikke kan sagtens compilere .pas filen uden fejl, men når jeg så linker med ld får jeg fejlen ?
Avatar billede arne_v Ekspert
18. januar 2009 - 21:22 #15
Du har ikke mulighed for ligesom mig at lade fpc kommandoen linke ?
Avatar billede baxos Nybegynder
18. januar 2009 - 21:58 #16
Nej desværre ikke da det ikke er til windows den binære fil skal køres
Avatar billede arne_v Ekspert
18. januar 2009 - 22:00 #17
Findes samme mulighed ikke på *nix ?
Avatar billede baxos Nybegynder
19. januar 2009 - 16:56 #18
Det skal køre på mit eget lille system hehe =)
Avatar billede arne_v Ekspert
20. januar 2009 - 04:30 #19
Nu har jeg smidt fpc på min Linux.

int add_c(int a, int b)
{
    return a + b;
}
        .text
.globl add_asm
add_asm:
        pushl  %ebp
        movl    %esp, %ebp
        movl    12(%ebp), %eax
        addl    8(%ebp), %eax
        popl    %ebp
        ret

program testasm;

{$L add_c.o}
{$L add_asm.o}

function add_c(a, b : integer) : integer; cdecl; external;
function add_asm(a, b : integer) : integer; cdecl; external;

begin
  writeln(add_c(2, 3));
  writeln(add_asm(2, 3));
end.

gcc -c add.c -o add_c.o
gcc -c add.s -o add_asm.o
fpc-2.2.2/bin/fpc testasm.pas
./testasm

5
5
Avatar billede baxos Nybegynder
20. januar 2009 - 16:37 #20
Problemet er jo at jeg skal skabe en flad(?) binær fil der skal køres på et helt tredje system ergo jeg bliver nød til at bruge ld til at linke det sammen og det er først der den fejler ikke i selve compileringen af pascal koden
Avatar billede arne_v Ekspert
01. februar 2009 - 19:04 #21
Så bruger du -Cn for at få fpc til kun at compile og ikke linke og -sh for at få genererer
et link script som du kan kalde når du har lyst.
Avatar billede baxos Nybegynder
03. februar 2009 - 17:58 #22
Hmm nu har vi fat i noget af det rigtige, men synes stadig ikke jeg kan få det til at virke .. Sh genere heller intet link
script?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester