Pregunta

He estado tratando con Nasm en un entorno Linux desde hace algún tiempo y esta función funcionó muy bien ... pero ahora me cambio a un entorno de ventanas y quiero utilizar Masm (con VS2008) Me parece que no puede conseguir que esto el trabajo ...

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

Cuando escribo algo como esto ...

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

asm no es más reconocido y volátil lanza un error que dice "cadena", también intenté escribir _asm volátil pero me da un error que dice "error de sintaxis ensamblador en línea en 'opcode'; encontré 'tipo de datos'"

¿Fue útil?

Solución

Si se asume que está hablando conjunto de comandos x86, aquí hay algunas cosas a tener en cuenta:

  1. la instrucción "outb" salidas de un byte, lo que sería equivalente a escribir "char" o "unsigned char" en C / C ++. Para dar salida a una de 16 bits (ya que estás usando "corto sin signo") la palabra es necesario utilizar "outw"
  2. una vez dicho esto, se recomienda por Intel (y requerido por VS) que utilice la instrucción mnemónica "fuera" y el tamaño del puerto se reconoce desde el tamaño del operando. Por ejemplo "fuera dx, ax " sería equivalente para "outw", mientras que "fuera dx, al " es equivalente para "outb"
  3. en x86 el "fuera" instrucción requiere el puerto y el valor de salida a ser colocado en (e) dx y {eax / AX / AL} registros, respectivamente. Mientras Nasm podría hacerlo por usted (no tengo el compilador a mano, por lo que no puedo confirmar que), en VS usted tiene que hacerlo de la manera que se hace en el nivel de la CPU.
  4. no hay ninguna razón para especificar la palabra clave "volátil" con __asm. Cualquier instrucción de ensamblador en línea VS causa compilador para deshabilitar el almacenamiento en caché de lectura (lo que la palabra clave es volátil para)

Este es el código (que suponiendo que está escribiendo en el puerto de 16 bits):

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

En el caso de que usted está escribiendo en el puerto de 8 bits, el código debe parecerse a lo siguiente:

void outportb(unsigned short port, unsigned char data)
{
    __asm  mov al, data; 
    __asm  mov dx, port; 
    __asm  out dx, al;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top