title: inline asm: operand type mismatch for 'out'
body: <p>I don't know assembly in depth. Following code is for writing to hardware port. </p>
  
  <p>Compiler gives operand type mismatch error in every line where inline asm is used.When I compile I get these errors:</p>
  
  <blockquote>
  <pre><code>port.cpp: Assembler messages:  
  port.cpp:27: Error: operand type mismatch for 'out'
  port.cpp:34: Error: operand type mismatch for 'in' 
  port.cpp:51: Error: operand type mismatch for 'out' 
  port.cpp:69: Error: operand type mismatch for 'out' 
  port.cpp:75: Error: operand type mismatch for 'in' 
  port.cpp:94: Error: operand type mismatch for 'out' 
  port.cpp:100: Error: operand type mismatch for 'in'
  </code></pre>
  </blockquote>
  
  <p><strong>port.h</strong></p>
  
  <pre><code>#ifndef __PORT_H
  #define __PORT_H
  
  #include "types.h"
  
  
  class Port
  {
      protected:
          Port(uint16_t portnumber);
          ~Port();
          uint16_t portnumber;
  };
  
  
  class Port8Bit : public Port
  {
      public:
          Port8Bit(uint16_t portnumber);
          ~Port8Bit();
  
          virtual uint8_t Read();
          virtual void Write(uint8_t data);
  };
  
  
  
  class Port8BitSlow : public Port8Bit
  {
      public:
          Port8BitSlow(uint16_t portnumber);
          ~Port8BitSlow();
  
          virtual void Write(uint8_t data);
  };
  
  
  
  class Port16Bit : public Port
  {
      public:
          Port16Bit(uint16_t portnumber);
          ~Port16Bit();
  
          virtual uint16_t Read();
          virtual void Write(uint16_t data);
  };
  
  
  
  class Port32Bit : public Port
  {
      public:
          Port32Bit(uint16_t portnumber);
          ~Port32Bit();
  
          virtual uint32_t Read();
          virtual void Write(uint32_t data);
  };
  
  #endif
  </code></pre>
  
  <p><strong>port.cpp</strong></p>
  
  <pre><code>#include "port.h"
  
  
  Port::Port(uint16_t portnumber)
  {
      this-&gt;portnumber = portnumber;
  }
  
  Port::~Port()
  {
  }
  
  
  
  Port8Bit::Port8Bit(uint16_t portnumber)
      : Port(portnumber)
  {
  }
  
  Port8Bit::~Port8Bit()
  {
  }
  
  void Port8Bit::Write(uint8_t data)
  {
      __asm__ volatile("outb %0, %1" :: "a" (data), "Nd" (portnumber));
  }
  
  uint8_t Port8Bit::Read()
  {
      uint8_t result;
      __asm__ volatile("inb %1, %0" : "=a" (result) : "Nd" (portnumber));   
      return result;
  }
  
  
  
  Port8BitSlow::Port8BitSlow(uint16_t portnumber)
      : Port8Bit(portnumber)
  {
  }
  
  Port8BitSlow::~Port8BitSlow()
  {
  }
  
  void Port8BitSlow::Write(uint8_t data)
  {
      __asm__ volatile("outb %0, %1\njmp 1f\n1: jmp 1f\n1:" :: "a" (data),       "Nd" (portnumber));
  }
  
  
  
  
  
  Port16Bit::Port16Bit(uint16_t portnumber)
      : Port(portnumber)
  {
  }
  
  Port16Bit::~Port16Bit()
  {
  }
  
  void Port16Bit::Write(uint16_t data)
  {
      __asm__ volatile("outw %0, %1" :: "a" (data), "Nd" (portnumber));
  }
  
  uint16_t Port16Bit::Read()
  {
      uint16_t result;
      __asm__ volatile("inw %1, %0" : "=a" (result) : "Nd" (portnumber));   
      return result;
  }
  
  
  
  
  
  Port32Bit::Port32Bit(uint16_t portnumber)
      : Port(portnumber)
  {
  }
  
  Port32Bit::~Port32Bit()
  {
  }
  
  void Port32Bit::Write(uint32_t data)
  {
      __asm__ volatile("outl %0, %1" :: "a" (data), "Nd"   (portnumber));
  }
  
  uint32_t Port32Bit::Read()
  {
      uint32_t result;
      __asm__ volatile("inl %1, %0" : "=a" (result) : "Nd" (portnumber));   
     return result;
  }
  </code></pre>
  
  <p>How can i correct it? Is there anything wrong with structure of program? </p>