asm kódot hogyan c++-ban?

Kezdőlap Fórumok Programozás asm kódot hogyan c++-ban?

9 bejegyzés megtekintése - 1-9 / 9
  • Szerző
    Bejegyzés
  • #1976688
    pointux
    Felhasználó

      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 fuggveny

      fuggveny:
      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
      ret

      innentõ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 $5

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

      }

      #1976689
      Fawaid
      Felhasználó

        Kö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.
        a

        asm(„#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..

        #1976690
        pointux
        Felhasználó

          A 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?

          #1976691
          Fawaid
          Felhasználó

            Elõ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öszi

            #1976692
            pointux
            Felhasználó

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

              #1976693
              Fawaid
              Felhasználó

                Elõ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 is

                #1976694
                pointux
                Felhasználó

                  1: 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.

                  #1976695
                  gabaman
                  Felhasználó

                    Gondolatok 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)

                    http://www.gnu.org/software/binutils/manua…s-2.9.1/as.html

                    #1876354
                    csaba
                    Felhasználó

                      Sziiasztok!
                      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!

                    9 bejegyzés megtekintése - 1-9 / 9
                    • Be kell jelentkezni a hozzászóláshoz.