GCC és Assembly

 ( Ariel | 2013. február 10., vasárnap - 1:02 )

Sziasztok!

Elég fura a kérdés, ezért talán fura a megfogalmazás is. Linux/Gcc vel Assemblyzik közületek valaki?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Valahol a vilagban biztos van valaki, aki latta mar a $RANDOM dolgot.

Attol mert talalsz itt valakit, aki assemblyzik, meg nem biztos, hogy meg fogja tudni oldani a problemadat. Vagy meg fog tudni tanitani az alapokra.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

+1

Csak kódszintű ellenőrzésre használom a gcc -S kimenetét - főként mikrovezérlőnél időkritikus részeken.
Legutóbb a Raspberry-n jött jól, kibogózva hogy a C-ben írt tesztprogimra miért vert rá a lua-ban írt és luaJIT-tel futtatott kódom.
Csak akkor javaslom az assemblyt, ha a C kódod átrendezésével sem érsz célt. Ekkor ebbe a .s fájlba nyúlnék bele és ezt fordítanám tovább.

Lásd: mpg123 forráskódját. Ott is így csinálják SSE optimalizálás miatt, de adnak generic C megoldást is.
Assembly egyik veszélye: nem lesz hordozható a kódod. Óvatosan vele, csak ahol tényleg indokolt.

elofordul. gcc, vagy gas? bar nagy kulonbseg nincs

--
NetBSD - Simplicity is prerequisite for reliability

pop és push utasításokkal valami gondja van. Más operációs rendszeren más környezetben ugyanaz a kód lefordul és rendben működik is. Linux alatt gcc vel én két gcc paraméterezést próbáltam

gcc asm.c -o asm (nem fordul le)
gcc -S -masm=intel asm.c (fordul, fut csak seg fault van)

__asm("call PASS ;\
jmp EXIT ;\
PASS : ;\
pop %eax ;\
push %eax ;\
ret ;\
EXIT :

gcc-vel ez megy nekem:

asm ("pop %eax; push %eax");

Mindenesetre, ha fordítási hibát kapsz, esetleg segít, ha be is idézed.

+1

:-)

(Off: a [szerkeszt] helyett a [like] gombot nyomtam le, elnézést;)

64 biten is? Neten bogarászva látom, hogy ott okoz gondot.

Szerk: ez vígan végzi a semmittevést:

int main()
{
__asm("call PASS ;\
jmp EXIT ;\
PASS : ;\
pop %rax ;\
push %rax ;\
ret ;\
EXIT :");
return 1;
}

Megjegyzem: soha az életben nem használtam még inline assemblyt gcc alatt. Na jó, most.

Akkor most fordul? Debugger nevű szoftvereszközzel próbáltad? (lásd: display/$i meg stepi/nexti utasítások)

Hmm. Próbáld ki. :-)

Egyébként fordul pöpecül, fut pöpecül, csak nem csinál semmi látványosat.

Amúgy ha megnézed, annyit csinál, hogy leveszi a stack tetejéről a legfelső értéket (ami régmúlt emlékeim szerint, mivel nincsen argumentumod, a visszatérés címe, de rég használtam már :-) ), aztán vissza is rakja.
Persze felmerül számomra a kérdés, hogy a kolléga ezzel mit is akart csinálni. Ha argumentumokat használna, akkor miért nem építi fel a veremkeretet, ha meg nem, (például mert regisztert mentene), akkor miért cserélte fel a push és pop utasításokat.

Meg miért nem tud kérdést feltenni :-).

Megjegyzem, az utolsó INTEL processzor assembly kód, amit írtam/olvastam, az a 80386-os processzorhoz volt. Ami azért kevés már.

Off: rögtön beírhattad volna a topicba...

Amúgy ezt a "-masm=intel" -lel fordul, fut-ot honnan veszed? Kiegészítve értelmes körítéssel -S nélkül elhal, -S-sel meg assembly kódot generál, hiszen a -S jelentése "Compile only; do not assemble or link"

Legyen szabad megjegyeznem, hogy ez egy rettenetesen kreten modon feltett kerdes. Mi a fenenek kell megkerdezni, hogy valaki ert-e hozza, majd egy fel nappal kesobb leirni a tenyleges problemat? Ird le a kerdest elsore _ertelmesen_ (mondjuk meg a kodot sem sikerult helyesen idebiggyeszteni) es vagy kapsz ra egy hasznalhato valaszt, vagy nem. Na mindegy, vissza a problemadhoz. A gcc azert mekeg, mert 64 bites architekturan (bar meg ez sem derult ki a kerdesbol) a pop es push 64 bites utasitas, viszont te egy 32 bites regisztert hasznalsz. Az EAX ugyanis a RAX regiszter also 32 bitjenek felel meg. A kerdes most az, hogy 32 bites vagy 64 bites kodot akarsz generalni? Ha 64 bit a cel, akkor hasznald a RAX regisztert a fenti kodban, ha viszont 32 bites kodot szeretnel, akkor ezt kozold a gcc-vel: gcc -m32 asm.c Az utobbihoz persze szukseged lesz a 32 bites libekre (gcc-multilib csomag, disztrotol fuggoen).

+1, ld. fentebb, bár nem fogalmaztam meg ilyen szépen.

+1

igen

Külön köszönöm mindenkinek! Sokat segítettetek! :)

Ilyen időszakom volt és most így sikerült feltennem a kérdést.

Ja, es legkozelebb, mikor azt irnad le, hogy "nem fordul le", inkabb kopipasztazz egyet. Ertjuk, hogy melyen elkeserit, hogy nem fordul le, es ezt kozlod velunk - csakhogy ez szamunkra tokeletesen erdektelen. Viszont egy hibauzenet - na az aztan jo zaftos talalgatasok taptalaja lehet. :-)
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal