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
?
hvilken platform og processor er koden fokuseret på?
./psycosoft-funware :)
Har aldrig prøvet, men kan du ikke lave det direkte i BASM, i delphis kode?
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
Der er ikke bare:
procedure foo(v : integer); external;
function bar(v : integer) : integer; external;
?
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å
Calling convention problem maaske ?
Der skere nogle forskellige ting med navn alt efter calling convention.
hmm muligvis..
hvordan sker det og hvordan skal jeg løse problemet? :)
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
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
Hvad er det forresten for noget asm du bruger?
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.
:-)
haha okay jeg vil lige forsøge det
Virker stadig ikke kan sagtens compilere .pas filen uden fejl, men når jeg så linker med ld får jeg fejlen ?
Du har ikke mulighed for ligesom mig at lade fpc kommandoen linke ?
Nej desværre ikke da det ikke er til windows den binære fil skal køres
Findes samme mulighed ikke på *nix ?
Det skal køre på mit eget lille system hehe =)
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
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
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.
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?