Я получал странную ошибку, когда разрабатывал свою операционную систему. Я делал драйвер ввода-вывода, используя 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!
Это работало нормально. Мой вопрос двоякий.
- Почему VS не позволил мне добавить комментарий сборки?
- Есть ли другой способ добавить комментарий сборки без добавления инструкции, в том числе 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
- Вопросы
- Visual-studio-2005
- «ошибка C2400: ошибка синтаксиса встроенного ассемблера в ‘opcode’ компиляция pxor ffmpeg с включенным флагом mmx
Вопросы и ответы представляются на сайте progi.pro сугубо для ознакомительных целей.
Источник: progi.pro