Ahoj.
Spájam C a asm.
Formát ELF, Linux.
Povedzme, že mám funkciu v ASM...
A v C to chcem spracovať takto:
printf("%d", asm_funkcia());
Ako vrátim hodnotu z asm tak, aby vyššie uvedený kód fungoval?
#1 Tango
Je logicky lepší psát ASM v C/C++, než naopak. Je tam mnohem snazší propojení. A ještě snazší je to z D/D2 do ASM... (Kdy D/D2 má C++ výsledek.) Bude ti totiž stačit pojmenovaná adresa, namísto fixace na určitou hodnotu. Každopádě vracet hodnotu ASM samozřejmě nemůže - měj zkrátka proměnnou s výstupem - jako v Bashi, Dashi atd.
Uděláš-li to jak ti radím, můžeš mít normální návratovou funkci v C/C++/D/D2 s inline ASM...
#3 Tango
Když celý program zkompiluješ pomocí kompilátoru C/C++/D/D2 s jednou sekcí ASM, můžeš tu část nahrát já nevím - třeba jako disk. A zbytek se bude tvářit jako samotný program. Jde o to, že ve vyšším jazyku bude vždy méně práce... ASM je jazyk nižší - umí jen spravovat hradla či tak něco. Neumí však brát parametry (opět je tu podobný princip jako u Bashe - třeba NASM, ovšem po překladu je to opět jen pomocná adresa), či vracet hodnoty, či vytvářet proměnné, či... Sice je možné v něm volat vyšší funkce, ale rozhodně se to nedá srovnat s jazykem C/C++, natož ještě vyšším D/D2. Pokud nechceš inline ASM, tak s výše opsaným modulem jsem zvládl vše, co s izolací obou složek. Různé části programu můžeš od sebe libovolně vzdálit pomocí přepočtu adres - rezervace bytů.
Obecně jsem odpověděl. Je však možné, že tu pomocnou adresu pojme tvůj překladač (assembler) nějak abstraktněji! Jenže tys jej nespecifikoval a stejně bych tě poslal nechť si vygooglíš jeho manuál. Obecně platí, že ASM lze propojovat s C/C++ knihovnami, hlavičkovými soubory, proměnnými - syntax dle assembleru.
Hodnoty se obvykle předávají přes zásobník nebo přes registry, záleží to na tom, jaký používáš kompilátor, volací konvenci (stdcall, fastcall, ...), jestli je funkce inlinovaná apod.
Určitě si pročti http://en.wikipedia.org/wiki/X86_calling_conventions , třeba to aspoň trochu napoví.
#5 Satik
Každopádě vracet hodnotu ASM samozřejmě nemůže - měj zkrátka proměnnou s výstupem - jako v Bashi, Dashi atd.
Však píši - ať to předává nějakému externímu elementu. Nutno podotknout, že nejčastěji se používá EDI, EBX,... Někdy se výstup předává i na port - kupříkladu v moderní nadstavbě BIOSu mi tamní funkce nechávala první cluster v portu. (jakože otevřený stream)
BTW: Jakože do EDI dáš adresu, kam uložit výsledek.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku