Volani funkci v C pres tabulku vektoru

Petr Labaj labaj na volny.cz
Středa Březen 28 01:29:03 CEST 2012


Diky za odpoved.

Na pevnych adresach to byt musi, protoze ta knihovna a nasledny
program nemaji spolu nic spolecneho, muzou se menit kazdy
nezavisle na tom druhem, takze jediny pevny bod je definice
funkci a absolutni adresa, kde na ni lezi ukazatel.

Udelat to jako pole skoku a nikoli pole vektoru by v nejhorsim
slo taky, ma to jen drobnou nevyhodu v tom skoku navic (ten
samozrejme vyplachne pipeline) a navic v omezeni rozsahu
skoku. U 32-bit vektoru muzu zarucene naadresovat cely adresni
prostor, u skoku napr. u ARMu asi uz bude omezeni na vzdalenost
mezi tabulkou vektoru a vlastnim kodem (skok ma taky 32 bit,
ale krome adresy tam musi byt i kod instrukce).
Nerozumim te "dvoji indirekci". Podle me je to jen jedna indirekce
(call na adresu, jejiz hodnota lezi na fixni adrese v tabulce vektoru).

S temi Vami naznacenymi typedef zkusim udelat pokus.

PL

************************************

From: "Jindroush" <kubecj na asw.cz>
To: "HW-news" <hw-list na list.hw.cz>
Sent: Wednesday, March 28, 2012 1:10 AM
Subject: Re: Volani funkci v C pres tabulku vektoru


On 28.3.2012 0:59, Petr Labaj wrote:
> Potreboval bych pres tabulku vektoru volat v C knihovni funkce, ktere
> budou ulozene nekde ve Flash.
>
> Vyrobit tu tabulku vektoru na definovane adrese snad nebude moc
> velky problem, v linker scriptu tomu vyrobim sekci na pevne adrese
> a udelam tu tabulku treba v ASM:
>
> .section ".vectors"
> .long func1
> .long func2
>
> Ale jak pak ty funkce volat z jineho programu v C, kdyz jedine co vim je,
> ze funkce maji prototypy napr.
>
> void func1 (int par1);
> int func2 (int par1, char *par2);
>
> a ze tabulka vektoru zacina na absolutni adrese treba 0x100000, tedy
> ze adresa funkce func1 je ulozena na 0x100000 a adresa funkce func2
> je na 0x100004.

A jsou tam nejaka špecifiká, ktere vas nuti mit to na pevnych adresach a 
jeste jako dvoji indirekci?

Ale jiste to muze jit nejak jako:
typedef void (*func1Type)( int );
long* pfnArray = 0x100000;
func1Type f1ptr = (func1Type) pfnArray[0];

f1ptr( 1 );

Urcite jsem tam zapomel nejaky hvezdicky nebo tak, pisu z hlavy ;o)


Dalsi reseni by mohly byt wrappery/stuby obsahujici pouze indirect jump.
tj.
void func1(int par1)
{
__asm( jmp [0x100000] ); //urcite spatna syntaxe
}
-- 
Jindroush (kubecj na avast.com)
http://www.kostky.org - Pro fany stavebnic LEGO.



Další informace o konferenci Hw-list