Asm v C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Asm v  C++ – C / C++ – Fórum – Programujte.comAsm v C++ – C / C++ – Fórum – Programujte.com

 

Sir_E0
Duch
8. 10. 2008   #1
-
0
-

Zdravim,

snažím se do C++ vložit kód assembleru. Našel jsem pár návodů na internetu. Mnoho se jich neosvědčilo. Nechtěl jsem žádné vychytávky z C (nechci se ani učit C), tak jsem narazil na jednu syntaxi, kterou mi kompiler bere. Ale mám-li kód např.:

inline int scitani(int a, int b)

{
int sum = 0;
asm (

"mov eax, a"
"add eax, b"
"mov sum, eax"
);
return sum;
}
tak mi jen kompiler vypíše: "Assembler messages: too many memory references for 'mov' ". Používám Dev-C++.
Bylo mnoho způsobů, jak tam vložit asm, ale např. __asm {...}, __asm__ {} etc. kompiler považoval za chybu, i když v tutorialech to bylo součástí kódu (a bylo to pro C++). Díky za pomoc

Nahlásit jako SPAM
IP: 212.71.151.–
Nikdo učený z nebe nespadl. Ani já ne...
o-lox0
Super člen
9. 10. 2008   #2
-
0
-

Spravne syntakticky je myslim toto:

int a,b,sum;

inline int scitani(int aa, int bb)
{
a=aa;b=bb;
asm (
"mov _a,%eax;"
"add _b,%eax;"
"mov %eax,_sum;"
);
return sum;
}

ale dev-cpp neni asi ten nejlepsi kompilator a moc nepocitej ze to bude delat to co ma..

Nahlásit jako SPAM
IP: 85.71.152.–
o-lox0
Super člen
9. 10. 2008   #3
-
0
-

Omluva - věnoval jsem tomu ze zájmu delší chvíli,
a správně je to (ověřeně v Dev-cpp 4.9.9.2) takto:

        "movl _a,%eax;"

"addl _b,%eax;"
"movl %eax,_sum;"

jsou tam obráceně operandy oproti klasickymu assembleru
nahore to opravim...

Nahlásit jako SPAM
IP: 85.71.152.–
Sir_E0
Duch
9. 10. 2008   #4
-
0
-

To 'l' za názvem instrukce lze asi vynechat, výsledek to dává stejný. Jen mi není jasné, proč to musí být obráceně, snadno si to člověk splete. Také užité proměnné musí mít globální rozsah, což mi přijde poněkud "nešťastné". Díky za pomoc

Nahlásit jako SPAM
IP: 212.71.151.–
Nikdo učený z nebe nespadl. Ani já ne...
bukaj0
Věrný člen
9. 10. 2008   #5
-
0
-

Sir_E
Jen mi není jasné, proč to musí být obráceně
Kompilátor asi nevyužívá Inteláckou, ale AT&T syntax (nebo obráceně, teď si nejsem jistý). (Neříkej hned, že je to špatně, je to prostě možnost.)

Také užité proměnné musí mít globální rozsah, což mi přijde poněkud "nešťastné".
U GCC např. jde určit, jaké hodnoty budou vstupními a výstupními (viz [1]).

[1] http://www.ibm.com/developerworks/linux/library/l-ia.html

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
tmi0
Věrný člen
9. 10. 2008   #6
-
0
-

To o-lox : jen poznamecka: Dev-Cpp neni kompilator, je to vyvojove prostredi ktere vyuziva externiho kompilatoru, pokud se nemylim tak defaultne MinGW, tedy minimalistic gnu for windows...

Nahlásit jako SPAM
IP: 85.160.41.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
imcold0
Newbie
9. 10. 2008   #7
-
0
-
Nahlásit jako SPAM
IP: 89.173.112.–
luky
~ Anonymní uživatel
25 příspěvků
11. 10. 2008   #8
-
0
-

V dotazech vynechavej nesmyslne poznamky o vecech, kterym nerozumis. Nebudes vypadat jako hlupak a nebudes rozcilovat lidi, kteri tomu rozumi.

Nicmene k veci, C++ (ani C) samozrejme nijak nespecifikuje syntaxi pro inline assembler a volba je veci jen autoru prekladace. Dve ustalene notace jsou Intel a AT&T, ale nektere prekladace pouzivaji uplne jinou a nektere proste zadnou. A nejde jen o samotny zapis instrukci, ale i asm() jako takoveho. Mysli na to pri psani asm kodu (napsanim i ne-asm verzi tech funkci), pokud mas v planu prelozitelnost i pod jinym prekladacem (nebo jinou jeho verzi).

A jak uz napsali kolegove vyse, tak Dev-C++ pouziva prekladac Gcc (resp. jeho port pro Windows z projektu MinGW) a tudiz zapis AT&T, ktery je ponekud slozitejsi nez Intelacky, ale o to blizsi skutecne funkci zapsanych instrukci.

Nahlásit jako SPAM
IP: 213.211.51.–
o-lox0
Super člen
11. 10. 2008   #9
-
0
-

To luky : Tak tady se budu hádat, jak to myslíš bližší?? Nazýváš bližším něco, co je
strojové a už u CPU, tady jde (u efektivnosti) snad max. o využívání maker a strukturovaný konvence zápisu.
Navíc mi v dotazech nevadí že někdo vyjmenuje co chápe a čemu nerozumí, vím na čem s dotyčným jsem
a už vůbec mne to neštve číst!!
Btw Ano Gcc je v Dev-C++ kaju se já ignorant..

Nahlásit jako SPAM
IP: 85.71.152.–
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, 86 hostů

Podobná vlákna

Násobení v ASM — založil AIPHEE

Podminka v ASM — založil Mutagen

Asm 8086: OUT DX,AX — založil Mircosoft

Asm - tlink - pomoc — založil Jaroslav

Asm 8080 chyba — založil Ezechiel

Moderátoři diskuze

 

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