Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Assembler » GCC Inline Assembler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.12.2004, 23:46 Uhr
~Kevin
Gast


Warum geht das nicht? Ich hab versucht es möglichst nach AT&T Syntax zu machen was warscheinlich nicht geklappt hat weil ichs net kann :/

C++:
int main(int argc, char *argv[])
{
   void realprint(char* string)
   {
      int i = 0;
      while(i<200)
      {
         __asm("movb %dl, string[i]"
               :"movb %ah, 0Eh"
               :"int 10h");
           i++;
      }  
   }  
  
   char realscan()
   {
   }
  
   return 0;
}



Meldung:
C:\Dev-Cpp\liteos\main.c In function `realprint':
10 C:\Dev-Cpp\liteos\main.c parse error before ':' token
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.12.2004, 11:02 Uhr
RedEagle



Ich hab zwar keine ahnung von asm. aber müsste nicht anstatt ":" ein "," dahin:


C++:
__asm("movb %dl, string[i]"
               ,"movb %ah, 0Eh"
               ,"int 10h");


--
MFG RedEagle

Dieser Post wurde am 21.12.2004 um 11:03 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.12.2004, 11:19 Uhr
~Kevin
Gast


Danke das geht jetzt aber leider kommen jetzt weitere Fehler...

C++:
int main(int argc, char *argv[])
{
   void realprint(char string[200])
   {
      int i = 0;
      while(i<200)
      {
         __asm("movb %dl, string[i]"
               ,"movb %ah, 0Eh"
               ,"int 10h");
           i++;
      }  
   }  
  
   char realscan()
   {
      int i = 0;
      char string[200] = "";
      while(i<200)
      {
         __asm("movb AH,00h"
               ,"int 16h"
               ,"movb %dl, string[i]");
           i++;
      }
      return string;
   }
  
   return 0;
}



Meldung:
C:\Dev-Cpp\liteos\main.c In function `realscan':
26 C:\Dev-Cpp\liteos\main.c [Warning] return makes integer from pointer without a cast
26 C:\Dev-Cpp\liteos\main.c [Warning] function returns address of local variable
\DOKUME~1\Labor\LOKALE~1\Temp/ccQ3aaaa.s C:\Dev-Cpp\liteos\C Assembler messages:
Error C:\DOKUME~1\Labor\LOKALE~1\Temp\ccQ3aaaa.s:17 junk `h' after expression
Error C:\DOKUME~1\Labor\LOKALE~1\Temp\ccQ3aaaa.s:17 suffix or operands invalid for `int'
Error C:\DOKUME~1\Labor\LOKALE~1\Temp\ccQ3aaaa.s:50 junk `[i]' after expression
C:\Dev-Cpp\liteos\Makefile.win [Build Error]  [main.o] Error 1
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.12.2004, 11:40 Uhr
~Kevin
Gast


Ok ich habe fast alles behoben bis auf:

Code:
C:\Dev-Cpp\liteos\main.c In function `realscan':
26 C:\Dev-Cpp\liteos\main.c [Warning] return makes integer from pointer without a cast
26 C:\Dev-Cpp\liteos\main.c [Warning] function returns address of local variable
\DOKUME~1\Labor\LOKALE~1\Temp/ccQ3aaaa.s C:\Dev-Cpp\liteos\C Assembler messages:
Error C:\DOKUME~1\Labor\LOKALE~1\Temp\ccG8aaaa.s:50 junk `[i]' after expression
C:\Dev-Cpp\liteos\Makefile.win [Build Error]  [main.o] Error 1



C++:
int main(int argc, char *argv[])
{
   void realprint(char string[200])
   {
      int i = 0;
      while(i<200)
      {
         __asm("movb (string[i]),%dl"
               ,"movb 0Eh,%ah"
               ,"int $0x10");
           i++;
      }  
   }  
  
   char realscan()
   {
      int i = 0;
      char string[200] = "";
      while(i<200)
      {
         __asm("movb 00h,%ah"
               ,"int $0x16"
               ,"movb string[i],%dl");
           i++;
      }
      return string;
   }
  
   return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.12.2004, 11:53 Uhr
(un)wissender
Niveauwart


Das wird nichts.
Du kannst im 32Bit-Modus keine Interrupts nutzen, es sei denn dein Programm hat Privileg 0, was ich aber bezweifel. Dafür gibt es das API.
Generellkannst du auch nicht mit jedem Compiler lokale Varibalen ansprechen, zumindest nicht direkt. Mit dieser kruden gcc-asm-Syntax (ich meine nicht AT&T) geht das (für den gcc), ansonsten gegen statics immer. Beim VC kannste tatsächlich auch lokale Varibalen ansprechen, der Compiler dreht das korrekt hin.
Außerdem ist die __asm-Sache nicht protabel. Das einzige was wirklich portabel ist, ist asm("opcode");, da aber inline-asm schon unter den Comilern nicht portabel ist, ist das auch egal, wollte es nur mal erwähnt haben.


Bearbeitung:

Außerdem kann man in C/C++ keine Funktionen in anderen definieren (wie du es tust), sondern höchstens deklarieren (in C++ überflüssig und sehr schlecht Stil).


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 21.12.2004 um 11:54 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.12.2004, 15:35 Uhr
~Kevin
Gast


Naja ich würde behaupten das mein Programm im Ring 0 läuft aber eigendlich solls im real Mode laufen wenn der GCC solche Real Mode Binarys erzeugen kann. Kann ein GNU Tool (as oder gcc) Real Mode Binarys erzeugen?

Öm ich hab es erlichgesagt garnet gemerkt das ich ne Funktionen in main deklariere...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.12.2004, 15:48 Uhr
Bruder Leif
dances with systems
(Operator)


Öhm... Real Mode is nich mit GCC. Der erzeugt nur Protected Mode-Binaries, mit dem alten Rattenschwanz ist da nix mehr zu machen...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.12.2004, 17:38 Uhr
(un)wissender
Niveauwart



Zitat von ~Kevin:
Naja ich würde behaupten das mein Programm im Ring 0 läuft

Nein, das brauchst du nicht behaupteten, entweder du richtest das explizit ein (aufwändig (Neue Rechtschreibung->Wortstamm:aufwand )) oder du hast Ring 3.
as kann real mode.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.12.2004, 14:20 Uhr
~Kevin
Gast



Zitat von (un)wissender:

Zitat:
Naja ich würde behaupten das mein Programm im Ring 0 läuft

Nein, das brauchst du nicht behaupteten, entweder du richtest das explizit ein (aufwändig (Neue Rechtschreibung->Wortstamm:aufwand )) oder du hast Ring 3.
as kann real mode.

Mein Programm ist im Ring 0 weils zum Kernel gehört...

Dieser Post wurde am 22.12.2004 um 15:36 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.12.2004, 16:58 Uhr
(un)wissender
Niveauwart


Aha.
Na mal gut das die meistens Kernelprogrammierer mehr Ahnung haben...
Der Real Mode kennt übrigens keine Privilegien, da darf jedes Programm alles.
Egal, viel Erfolg, was auch immer du machen willst.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Assembler ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: