Ошибка c2400 синтаксическая ошибка во встроенном коде на языке ассемблера в код операции

Я получал странную ошибку, когда разрабатывал свою операционную систему. Я делал драйвер ввода-вывода, используя outb и inb . Моя функция outb выглядит следующим образом:

static inline void outb(uint16_t port, uint8_t val) < __asm(«outb %0, %w1» //
Я получаю эту ошибку в Visual Studio:

C2400: синтаксическая ошибка встроенного ассемблера в «коде операции»; нашел ‘(‘

Кто-нибудь знает, почему я получаю эту ошибку? Как исправить эту ошибку? Какие-либо предложения?
person Community schedule 09.02.2016 source источник

VS? Как в Visual Studio?

Код, который вы разместили, не использует синтаксис Microsoft для встроенной сборки. Похоже на что-то предназначенное для GCC. — person Michael nbsp schedule 09.02.2016

Ответы (1)

Visual Studio VC++ не поддерживает шаблоны ассемблера GNU, доступные в GCC. Поскольку вы определяете port как 16-битное целое число без знака, вам нужно использовать форму OUT , который принимает 16-битный номер порта. Вам нужно поместить 16-битный номер порта в DX. Вы также должны рассматривать имена переменных во встроенной сборке как указатели, поскольку вы используете стандартное соглашение о вызовах CDECL для своих функций. Образец кода:

ЯЗЫК АССЕМБЛЕРА за 3 МИНУТЫ


static inline void outb(uint16_t port, uint8_t val) < __asm < mov dx, port mov al, val out dx, al >>
Функцию inb можно выполнить примерно так:
static inline uint8_t inb(uint16_t port) < uint8_t data; __asm < mov dx, port in al, dx mov data, al >return data; >

Это можно упростить, удалив переменную data и сохранив прочитанный символ в переменной port , а затем выполнив return (uint8_t)port; . Так что это также будет работать:

static inline uint8_t inb(uint16_t port) < __asm < mov dx, port in al, dx mov byte ptr[port], al // Need to cast since port is 16-bit variable >return (uint8_t)port; >

Дополнительные сведения об использовании встроенной сборки VC++ можно найти в документации Microsoft Developer Network (MSDN)

person Michael Petch schedule 09.02.2016
Я бы не назвал это упрощением. — person user253751; 09.02.2016

Источник: questu.ru

Вставка комментария в __asm ​​приводит к ошибке C2400 (VS2012)

Я пытался проверить скомпилированный ассемблер некоторого кода в VS 2012. Я добавил две строки (до и после моего кода) как таковые:

__asm ; it begins here! // My code __asm ; it ends here!

Однако VS не понравилось это. я получил

ошибка C2400: ошибка синтаксиса встроенного ассемблера в ‘код операции’; найден «плохой токен»

Поэтому я добавил NOP что я не хотел:

__asm NOP ; Comment!

Это работало нормально. Мой вопрос двоякий.

  1. Почему VS не позволил мне добавить комментарий сборки?
  2. Есть ли другой способ добавить комментарий сборки без добавления инструкции, в том числе NOP ?

Решение

Причина, по которой это не работает, заключается в том, что __asm это ключевое слово, так же, как int является ключевым словом, оно не может появляться само по себе и должно следовать правильному синтаксису. Возьмем следующий фрагмент кода в качестве примера:

Быстрое введение в ассемблер MASM64. Урок 2.1.


int main() < int // here’s a comment, but it’s ignored by the compiler return 0; >

Следующий код потерпит неудачу с ошибкой компиляции, более конкретно в VS2012 вы получите error C2143: syntax error : missing ‘;’ before ‘return’ , Это очевидная ошибка, поскольку у нас нет конечной точки с запятой для обозначения конца инструкции; добавьте точку с запятой, и она прекрасно скомпилируется, потому что мы не нарушали синтаксис языка C (или C ++ в данном случае):

int main() < int // here’s a comment, but it’s ignored by the compiler ; // white space and comments are ignored by the compiler return 0; >

То же самое относится и к следующему коду:

int main()

Кроме здесь мы получаем ошибку error C2400: inline assembler syntax error in ‘opcode’; found ‘constant’ потому что это лечит все после __asm Ключевое слово в качестве инструкции на ассемблере, и комментарий по праву игнорируется .. поэтому будет работать следующий код:

int main() < __asm ; here’s a comment but it’s ignored NOP ; white space and comments are ignored by the compiler __asm // outside of __asm block so only C style comments work return 0; >

Так что это отвечает на ваш первый вопрос: Why didn’t VS allow me to add an assembly comment? .. потому что это является синтаксическая ошибка.

Теперь для вашего второго вопроса: Is there a different way to add an assembly comment without adding an instruction, including NOP?

Прямо нет, нет, но косвенно да есть. Стоит отметить, что __asm Ключевое слово компилируется во встроенную сборку в вашей программе, поэтому комментарии будут удаляться из скомпилированной сборки так же, как если бы это был стандартный комментарий C / C ++, поэтому пытаться «принудительно» вызвать комментарий в вашей сборке с помощью этого метода, вместо этого , вы можете использовать /FAs флаг компилятора, и он сгенерирует сборку (машинный код), смешанную с исходным кодом, например:

Учитывая следующий (очень простой) код:

int main() < // here’s a normal comment __asm < ; here’s an asm comment and empty block >// here’s another normal comment return 0; >

Когда скомпилировано с /FAs флаг компилятора file.asm было получено следующее:

; Listing generated by Microsoft (R) Optimizing Compiler Version 18.00.31101.0 TITLE C:testfile.cpp .686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES PUBLIC _main ; Function compile flags: /Odtp ; File c:testfile.cpp _TEXT SEGMENT _main PROC ; 2 : < push ebp mov ebp, esp ; 3 : // here’s a normal comment ; 4 : __asm < ; here’s an asm comment and empty block ; 5 : >// here’s another normal comment ; 6 : return 0; xor eax, eax ; 7 : > pop ebp ret 0 _main ENDP _TEXT ENDS END

Обратите внимание, как он включает в себя источник и комментарии. Если бы этот код сделал больше, вы бы увидели больше ассемблера и связанный с ним источник.

Если вы хотите поместить комментарии в саму встроенную сборку, то вы можете использовать обычные комментарии в стиле C / C ++, а также комментарии сборки внутри __asm сам блок:

int main() < // here’s a C comment __asm < ; here’s an asm comment // some other comments NOP ; asm type comment NOP // C style comment >// here’s another comment return 0; >

Надеюсь, что это может помочь.

РЕДАКТИРОВАТЬ:

Следует отметить, что следующий фрагмент кода также компилируется без ошибок, и я не уверен на 100%, почему:

int main() < __asm __asm ; comment // also just doing it on a single line works too: __asm __asm return 0; >

Компиляция этого кода с единственным __asm ; comment выдает ошибку компиляции, но с обоими компилирует нормально; добавление инструкций к приведенному выше коду и проверка .asm выход показывает, что второй __asm игнорируется для любых других команд сборки, предшествующих ему. Так что я не уверен на 100%, если это ошибка синтаксического анализа или часть __asm Синтаксис ключевого слова, так как нет документации по этому поведению.

Источник: web-answers.ru

Вывод ассемблеровского кода в с++

Добрый день. Столкнулся с проблемой компиляции кода asm в с++. Есть переменная asmCode — sting. А в ней, собственно, содержится код asm. Пример кода будет в конце вопроса.

А вопрос заключается в следующем: если я вывожу, допустим, cout

Ошибка C2400 синтаксическая ошибка во встроенном коде на языке ассемблера в «код операции»; обнаружено «newline».

Ошибка C2400 синтаксическая ошибка во встроенном коде на языке ассемблера в «код операции»; обнаружено «(«

Дело в том, что код, который содержится в gencode автоматически создаётся в зависимости от содержимого определённого файла(своего рода компилятор), и просто вписать часть кода в _asm вручную не получится. В проекте, который должен компилировать asm код включен masm. Каким способом можно вывести результат asm кода из asmCode в консоль? Если нужны будут какие-то коды, предоставлю(ибо, мне кажется, вопрос не нуждается в предоставлении кода(учитывая, что он состоит из 30 файлов). Пример кода asm, содержащийся в asmCode(извиняюсь за корявость, не получилось его красивым сделать):

.586 .model flat, stdcall includelib kernel32.lib includelib libucrt.lib includelib StatLibC.lib ExitProcess PROTO : DWORD SetConsoleTitleA PROTO :DWORD GetStdHandle PROTO : DWORD writei PROTO : SDWORD writes PROTO : DWORD strl PROTO : DWORD ipow PROTO : DWORD, : DWORD sum PROTO : DWORD, : DWORD .stack 4096 .data .const csname db ‘BNI-2016’, 0 Overflow db ‘ERROR overflow’, 0 DIV_NULL db ‘ERROR DBN’, 0 newline db ‘0’,0 L0 SDWORD 5 L1 SDWORD 0 .stack 4096 .code main PROC push offset csname call SetConsoleTitleA push L0 call writei jmp EXIT EXIT_div_on_NULL: push offset DIV_NULL call writes push — 1 call ExitProcess EXIT_overflow: push offset Overflow call writes push — 2 call ExitProcess EXIT: push L1 call ExitProcess main ENDP end main

Источник: husl.ru

«ошибка C2400: ошибка синтаксиса встроенного ассемблера в ‘opcode’ компиляция pxor ffmpeg с включенным флагом mmx

Я пытаюсь скомпилировать (visual studio 2005) ffmpeg с включенным флагом mmx (HAVE_MMX), но получить следующую ошибку: «ошибка C2400: ошибка синтаксиса inline ассемблера в» opcode «И он жалуется на xpor_r2r Идеи? [Update] Джеттер указал, что это, вероятно, проблема с макросом: #define mmx_r2r(op,regs,regd)__asm__ volatile (#op » %» #regs «, %» #regd) Непосредственно использование: __asm__ pxor mm7 mm7 works Добавление volatile (как в упомянутом макросе) дает ту же ошибку, синтаксическую ошибку, как и раньше, в ‘opcode’, найденном ‘data_type’. Просто удаление volatile из макроса не работает, вместо этого дает ошибку в ‘opcode’ found ‘(‘ Вместо этого удаление паратетов дает ошибку в ‘opcode’, найденном ‘bad_token’

спросил(а) 2013-10-02T18:33:00+04:00 9 лет, 3 месяца назад

добавить комментарий

пожаловаться

Еще в рубрике

Каков правильный способ явного использования оператора литья в производном классе?

Как исключить нулевые значения из функции Count() в службах отчетов 2005?

Проблема компиляции Eliza chatbot С++ error LNK2019

Связывание функций пространства имен

Другие вопросы

Visual Studio Team Suite: как веб-тест программно?

не может создать приложение смарт-устройства mfc в Visual Studio 2005

Текст на изображении не отображается, в обработчике предварительного просмотра vs2005.net2

  1. Вопросы
  2. Visual-studio-2005
  3. «ошибка C2400: ошибка синтаксиса встроенного ассемблера в ‘opcode’ компиляция pxor ffmpeg с включенным флагом mmx

Вопросы и ответы представляются на сайте progi.pro сугубо для ознакомительных целей.

Источник: progi.pro

Рейтинг
( Пока оценок нет )
Загрузка ...