[VC++ 6] inline-asm

Piesbruhder

Mitglied
Hallo!
Kann mir jemand zeigen, wie ich bei VC++ (Ich arbeite hier mit der Version 6) inline-assembler anwende? Also mein Code (bzw. der Code des Tutorials, was ich durcharbeiten will) sieht so aus:
Code:
void SetVideoMode(int mode)
  {
    asm {
      mov ax, mode     // drop desired mode in ax
      int 0x10         // et voila...
    }
  }
WIe ihr vielleicht erkannt habt will ich in einen anderen Modus (in diesem Fall Mode13h :) ) Aber Wenn ich das so kompiliere, dann bekomme ich nichts außer vielen Fehlermeldungen raus (insgesamt sieben Stück plus eine Warnung), die eigentlich alle besagen, es würden Semikolons fehlen und mov und ax sein undeclared identifiers. Ich hab natürlich etwas rumprobiert und folgendes hinbekommen:
Code:
void SetVideoMode(int mode);
{
    asm; {
      mov ax, mode     // drop desired mode in ax
      int 0x10         // et voila...
    }
}
So entsteht nur noch ein Fehler und zwar:
error C2447: missing function header (old-style formal list?)
Kann mir jemand sagen, was ich tun muss, damit VC++ das kompiliert?

Vielen Dank im Vorraus,
Paul
 
Microsoft hält sich ja nicht gerne an Standards... das im C++-Standard enthaltene Schlüsselwort 'asm' funktioniert in VC++ i.d.R. nicht. Stattdessen muss man '__asm' verwenden.

Desweiteren wäre es nicht schlecht, wenn man alle Register, die man in seinem Assembler-Code modifiziert, auf den Stack schiebt und danach wieder zurück in die Register schreibt.

Und noch was: nimm als Datentyp für 'mode' lieber unsigned short, da ein int spätestens beim 'mov ax, mode' zu einen short verkürzt wird... (int: 4 Bytes; ax: 2 Bytes!)

Code:
void SetVideoMode(unsigned short mode)
{
   __asm {
      push	ax
      mov	ax, mode     // drop desired mode in ax
      int	0x10         // et voila...
      pop	ax
   }
}

Bleibt natürlich nur noch die Frage, ob man unter Windows so mir nichts dir nichts BIOS-Interrupts aufrufen kann...
 

chibisuke

Erfahrenes Mitglied
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHH !

*shock lass nach*

sag mal wer kommt denn auf die idee aus dem Protected mode heraus irgendwas mit bios interupts anzufangen? ich meine wenn du damit nich das ganze system crasht ist es ein wunder!

vergiss solche sachen wir BIOS interupts und so weiter sehr schnell wenn du mit windows arbeiten willst, oder du beschrenkst dich auf realmode und benutzt bitte einen anderen kompiler denn VC++ ist nicht dafür geeignet realmode code zu erzeugen, es schreibt ausschließlich protected mode code...


aber prinziell wenn du inline assembler nutzen willst

__asm und dann einfach entweder ein komando und newline oder mehrere komandos in { }

beispiel:

__asm {
xor eax, eax
mov ss, eax
mov esp, eax
}

(den code bitte nicht ausprobieren, dabei stürzt nur irgendwas ab, ob es nur das progy is oder ganz windows... weiß ich net...)