В Visual Studio Code ошибок нет но некомпилируется файл port.cpp

200
10 июня 2018, 06:00

Вывожу ошибки там знак присваивания = постоянно в ошибке фигурирует что делать

sergey@COMPUTER:~/Рабочий стол/myOS5$ make clean
rm -f loader.o gdt.o port.o kernel.o mykernel.bin mykernel.iso
sergey@COMPUTER:~/Рабочий стол/myOS5$ make run
as --32 -o loader.o loader.s
g++ -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore -o gdt.o -c gdt.cpp
g++ -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore -o port.o -c port.cpp
port.cpp: In member function ‘virtual void Port8Bit::Write(uint8_t)’:
port.cpp:31:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp: In member function ‘virtual void Port8BitSlow::Write(uint8_t)’:
port.cpp:62:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp: In member function ‘virtual void Port16Bit::Write(uint16_t)’:
port.cpp:84:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp: In member function ‘virtual void Port32Bit::Write(uint32_t)’:
port.cpp:118:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp: In member function ‘virtual void Port8Bit::Write(uint8_t)’:
port.cpp:31:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp:31:6: error: invalid lvalue in asm output 0
port.cpp: In member function ‘virtual void Port8BitSlow::Write(uint8_t)’:
port.cpp:62:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp:62:6: error: invalid lvalue in asm output 0
port.cpp: In member function ‘virtual void Port16Bit::Write(uint16_t)’:
port.cpp:84:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp:84:6: error: invalid lvalue in asm output 0
port.cpp: In member function ‘virtual void Port32Bit::Write(uint32_t)’:
port.cpp:118:6: error: output operand constraint lacks ‘=’
     );
      ^
port.cpp:118:6: error: invalid lvalue in asm output 0
Makefile:9: ошибка выполнения рецепта для цели «port.o»
make: *** [port.o] Ошибка 1
sergey@COMPUTER:~/Рабочий стол/myOS5$

файл port.cpp

#include "port.h"
Port::Port(uint16_t portnumber)
{
    this->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;
} 

файл port.h

#ifndef __PORT_H
#define __PORT_H

#include "types.h"

    class Port
    {
    protected:
        uint16_t portnumber;
        Port(uint16_t portnumber);
        ~Port();
    };
    class Port8Bit : public Port
    {
    public:
        Port8Bit(uint16_t portnumber);
        ~Port8Bit();
        virtual void Write(uint8_t data);
        virtual uint8_t Read();
    };
    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 void Write(uint16_t data);
        virtual uint16_t Read();
    };
    class Port32Bit : public Port
    {
    public:
        Port32Bit(uint16_t portnumber);
        ~Port32Bit();
        virtual void Write(uint32_t data);
        virtual uint32_t Read();
    };

#endif
Answer 1

В методах Write, вы хотите записать данные в порт, номер которого хранится в переменной. Соответственно, выходных переменных в ассемблерной вставке у вас нету, только входные (данные и номер порта). Поэтому после первого двоеточия у вас должно быть пусто:

void Port8Bit::Write(uint8_t data)
{
    __asm__ volatile (
        "outb %0, %1" 
        : /* нет выходных переменных */
        : "a" (data), "Nd" (portnumber) /* входные переменные */
    );
}
READ ALSO
шаблонные классы

шаблонные классы

помогите разобраться с шаблонными классами

264
OpenCV Какой алгоритм лучше выбрать?

OpenCV Какой алгоритм лучше выбрать?

у меня такая ситуация : нужно сделать софт который будет по видео распознавать машины и какой размер они занимают на картинке, на фоне дороги,...

159
Как подключить jpg картинку в API

Как подключить jpg картинку в API

Пробую через olectlh- почему не получается

239
Vue router, пошаговая регистрация

Vue router, пошаговая регистрация

Хочу сделать пошаговою регистрацию с помощью Vue routerНо, не понимаю как можно реализовать задумку

259