Frage

Ich habe den Umgang mit Nasm auf eine linux-Umgebung für einige Zeit, und diese Funktion hat Super funktioniert...aber jetzt bin ich Wechsel auf eine windows-Umgebung und die will ich mit Masm (mit VS2008) ich kann nicht scheinen, um dies funktioniert...

void outportb (unsigned short _port, unsigned short _data)
{
  __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

Wenn ich etwas schreiben wie dieses...

void outportb (unsigned short _port, unsigned short _data)
{
  asm volatile ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

asm ist nicht mehr erkannt und flüchtige wirft die Fehlermeldung "string", ich versuchte auch zu schreiben _asm flüchtigen, aber ich bekomme die Fehlermeldung "inline-assembler-syntax error in 'opcode';found 'data-type'"

War es hilfreich?

Lösung

Angenommen, Sie sprechen über x86-Befehlssatz, sind hier ein paar Dinge zu erinnern:

  1. die Anweisung "outb" Ausgänge ein byte, das entspricht Typ "char" oder "unsigned char", die in C/C++.Für die Ausgabe einer 16-bit - (da bist du mit "unsigned short") Wort, das man verwenden muss "outw"
  2. having said that, es wird empfohlen, die von Intel (und von VS), dass Sie verwenden Sie den Befehl mnemonic "out" und die port-Größe ist anerkannt von der operand Größe.Zum Beispiel "out dx, ax"wäre gleichbedeutend für "outw", während "out dx, al"ist gleichbedeutend für "outb"
  3. auf x86-den "aus" - Befehl muss den port und die Ausgabe von Wert zu platziert werden in die (e)dx und {eax/ax/al} registriert, beziehungsweise.Während Nasm, könnte es für Sie tun (ich habe nicht den compiler praktisch, so kann ich nicht bestätigen, dass), in VS, die Sie zu tun haben, wie es ist getan auf der CPU-Ebene.
  4. es gibt keinen Grund angeben "volatile" keyword mit __asm.Alle inline-assembly instructions verursachen VS-compiler zu deaktivieren, Lesen Sie Zwischenspeichern (was volatile-Schlüsselwort ist)

Hier ist der code (vorausgesetzt, Sie schreiben in 16-bit-port):

void outportw(unsigned short port, unsigned short data)
{
    __asm  mov ax, data; 
    __asm  mov dx, port; 
    __asm  out dx, ax;
}

in Fall, Sie schreiben in 8-bit-port, der code sollte wie folgt Aussehen:

void outportb(unsigned short port, unsigned char data)
{
    __asm  mov al, data; 
    __asm  mov dx, port; 
    __asm  out dx, al;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top