Kezdőlap › Fórumok › Programozás › asm kódot hogyan c++-ban?
- This topic has 8 hozzászólás, 4 résztvevő, and was last updated 20 years, 8 months telt el by
gabaman.
-
SzerzőBejegyzés
-
2004-10-06-20:45 #1976688
1. Az inline-nak mûködnie kell.
2. Másik lehetõség komplett függvény írása mondjuk, és ennek a behelyezése a c kódba.
3. nekem kevésbé szimpatikus as szintaktika használata, és annak a behelyezése a c kódba, azzal a paranccsal, hogy adja át a assemblernek a kódot.
4. talán lehet más assemblert is megadni.2.
Code:global fuggvenyfuggveny:
push ebp
mov ebp,esp
sub esp,0x40; stack lefoglalása, ha kell
mov ebx,[ebp+8]; az elsõ paraméter; a további kód
mov esp,ebp
pop ebp
retinnentõl kezdve ugyanúgy lehet meghívni c-bõl, mintha c függvény lenne
3.
Code:asmfile.S tartalma:mov %eax,$2
int $5asmincfile.c tartalma
int main(int argc, char **argv) {
asm(„#include „asmfile.S””); //utasítás a fordítónak, hogy ezt a kódot adja át az assemblernek
}
2004-10-06-21:19 #1976689Köszi a tanácsokat, de sajnos nem megy!
Visual Studio 6.0-val dolgozom, a .s .S fájlokra azt irja ki, h nincs szabály hogyan forditsa le õket.
aasm(„#include „asmfile.S””);
-re azt irja ki, hogy inkább használjak __asm-t, majd arra pedig h :
inline assembler syntax error in ‘opcode’; found ‘(‘
megpróbáltam minden varit, nem megy.A komplett függvényt meg nem igazán értem.
A c forrásba irom bele?Kipróbáltam, nem megy..
Igazából az asm{} blokk az mûködik,csak interruptot nem tudok hivni, arra nincs vmi függvény, ilyesmit olvastam egy forrásban, h geninterrupt(), ami elvileg a dos.h-ban van, de igazából nincs…a forrás eléggé régi, szóval elhiszem,h még 95-ben ott volt..de akkor is kéne lennie vmi ilyennek..2004-10-06-21:39 #1976690A Visual Studio 6.0 nem ismerem. (ráadásul nem is ingyenes, ha jól tudom, bár azt nem tudom, hogy van-e linuxra, mert ha van is, akkor nem szerencsés azt használni)
Az elõbbi egyébként nasm kód volt, az utóbbi gcc+as(saját assemblere)Megszakítás hívása egy multitasking rendszeren nem túl szerencsés, és nem is divat, fõként linux alatt nem divat.
Minek neked megszakítás?2004-10-07-13:29 #1976691Elõször is leszögezem:kezdõ ASm, és vmit tudó C programozó vagyok..
Hát igazság szerint a mostani esetben azt szeretném megcsinálni, h kiirok vmit a képernyõre,teszem azt 10 sort, és aztán azt felül akarom irni, azaz 10 sorral feljebb akarom pozicionálni a kurzort.
Mivel nem tudko egyetlen ilyen c függvényt sem, se nem linuxban, se nem vonfis alatt, ezért azt gondoltam ki, hogy egy int10,2-t hivok meg asm-ben..
Ha tudtok vmi ilyen függvényt, lécci irjátok le..köszi2004-10-07-17:57 #1976692Nos erre aztán tényleg fölösleges megszakítást alkalmazni.
Megszakítás = A processzoron semmi más nem futhat (elõtte el kell menteni minden sz@rt, utána elõ kell csalni) -> lassú, ráadásul leginkább, ezért vannak a pörgõ homokórák (mert semmi más nem futhat), ezért a jobb rendszerek meg sem engedik (legalábbis egyszerûen), hogy a programok megszakítást hívjanak.
Windows alatt én a virtuális (mert védett módban vagyunk kiv. 16 bites módban) (0xb0000,) 0xb8000, vagy 0xa00000 memóriacímeket írnám, a módnak megfelelõen. Ezt linux alatt is lehet, bár az (curses,) ncurses lib tartalmaz olyan függvényeket, melyekkel ezek gyorsan megvalósíthatóak. (egyikhez sem kell asm)
Na de ne kelljen már mindent felsorolni, mert még mindig nem árultad el, hogy valójában mi alatt, akarod megírni.2004-10-07-19:32 #1976693Elõször is leszögezem:kezdõ ASm, és vmit tudó C programozó vagyok..
+
Windows alatt én a virtuális (mert védett módban vagyunk kiv. 16 bites módban) (0xb0000,) 0xb8000, vagy 0xa00000 memóriacímeket írnám, a módnak megfelelõen.
és
Na de ne kelljen már mindent felsorolni, mert még mindig nem árultad el, hogy valójában mi alatt, akarod megírni.
+
Visual Studio 6.0-val dolgozom,
Na szóval:
1: a memóriacimeket hova irjam, miként irjam, miért irjam?honnan tudom meg, h miért pont 0xa00000, stb..
2: van-e erre direkt csinált beépitett c függvény?pl setcursor_position_to_0_0(),érthetõbben nem tudom leirni
3: nekem elsõsorban linuxban kéne, de ugyanugy meg szeretném tanulni windowsban is..Tehát mintha uj topicot nyitnék: én azt szeretném megtudni, h Te, Ti hogy rakjátok 10 sorral feljebb a kurzort mind linuxban, mind windowsban.Igy talán érthetõbb leszek..csak azért irtam le a köritést is legelõször, nehogy STFW, és RTFM -t kapjak..
köszi elõre is2004-10-07-21:45 #19766941: a memóriacimeket hova irjam, miként irjam, miért irjam?honnan tudom meg, h miért pont 0xa00000, stb..
Windows alatt is van különbözõ ilyen függvény lásd gotoxy pl. tc, viszont ezek lassúak. (Hogy vs-ben mi van fogalmam sincs)
Karakteres kódban, 0xb8… a cím, grafikusban, 0xa0….
Ezek úgy mûködnek, hogy a memóriába beírod a kiválasztott betû kódját, és az attribútumot – ez lesz a bal felsõ sarokban, a következõ mellette…, aztán a második sor bal oldalán, és így tovább.2004-10-09-13:19 #1976695Gondolatok a témához:
Az assembly egy nyelvcsalád, és jónéhány dialektusa létezik (pl. MASM, TASM, NASM, GAS, …). A GCC a GAS-t ismeri (GNU assembler). A fent említett kódok inkább MASM/TASM-re emlékeztetnek.
A linux azért nem szereti az int 10h-t mert a terminallal ellentétben (ncurses) hátózaton nehézkes átküldeni a képernyõ tartalmát. :o)
2009-12-04-19:56 #1876354Sziiasztok!
Szeretnék c++-ban olyan függvényeket irni, ami asm kódot hajt végre.
Találtam egy-kt példát, amik a köv szintaxist irják le:Code:funk()
{
asm{
push ax
…
pop ax}
}illetve inline módon : __asm__
kipróbáltam, de az interruptok nem mûködnek, hiszen az int-t a forditó annak veszi, mintha egy változót deklarálnék!!!
Szóval ha tudjátok h hogyan kell az ilyet csinálni (mind inline, tehát pl 1 parancs,v akár egy hosszabb programocska blokkban)akkor segitsetek!
Elöre is köszi! -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz