Návratová hodnota z asm pre C – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Návratová hodnota z asm pre C – Assembler – Fórum – Programujte.comNávratová hodnota z asm pre C – Assembler – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Tango0
Newbie
25. 11. 2014   #1
-
0
-

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?

Nahlásit jako SPAM
IP: 195.91.11.–
Reklama
Reklama
Matěj Andrle+1
Grafoman
25. 11. 2014   #2
-
0
-

#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...

Nahlásit jako SPAM
IP: 78.136.143.–
Tango0
Newbie
25. 11. 2014   #3
-
0
-

#2 Matěj Andrle
Ale u funkcií vrámci Cčka to funguje. 
 

int zvys(int i) {
  return i++;
}

int main(inn argc, char *argv[]) {
  printf("%d", zvys(5));
}

Tak nejak sa to musí dať prepojiť.

Inline assembly nechcem použiť.

Nahlásit jako SPAM
IP: 195.91.11.–
Matěj Andrle+1
Grafoman
26. 11. 2014   #4
-
0
-

#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.

Nahlásit jako SPAM
IP: 78.136.148.–
Řešení
Satik0
Stálý člen
26. 11. 2014   #5
-
0
-
Vyřešeno Nejlepší odpověď

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í.

Nahlásit jako SPAM
IP: 86.49.188.–
Matěj Andrle+1
Grafoman
26. 11. 2014   #6
-
0
-

#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.

Nahlásit jako SPAM
IP: 78.136.148.–
Satik0
Stálý člen
26. 11. 2014   #7
-
0
-

#6 Matěj Andrle
Tvoje příspěvky jsou na mě moc složité, většinou se v nich dost ztrácím, tak jsem jen přímo odpověděl na původní dotaz :)

Nahlásit jako SPAM
IP: 86.49.188.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 337 hostů

Podobná vlákna

Návratová hodnota — založil RePRO

Návratová hodnota — založil Luckaa

Návratová hodnota z vlákna — založil Filip0913

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý