I am facing compilation error while working with assembly instructions in VC++ as MACRO inline based assembler blocks.
error C2400: inline assembler syntax error in 'second operand'; found 'register'
Here is the code:
_asm {
mov esi,dword ptr [pMemBlock]
sub esp,sizeOfblock
mov ebx,sizeOfblock
mov shrResult,ebx
shr shrResult,2
mov ecx,shrResult
mov shrResult,0
mov edi,esp
rep movs dword ptr es:[edi],dword ptr[esi]
}
Regards
Usman
0 / 0 / 0 Регистрация: 10.06.2015 Сообщений: 136 |
|
1 |
|
18.08.2016, 12:33. Показов 4229. Ответов 4
visual studio выдал такую ошибку
0 |
1550 / 875 / 179 Регистрация: 05.12.2015 Сообщений: 2,555 |
|
18.08.2016, 12:45 |
2 |
Anette666k, Код в студию.
0 |
Anette666k 0 / 0 / 0 Регистрация: 10.06.2015 Сообщений: 136 |
||||
18.08.2016, 14:46 [ТС] |
3 |
|||
0 |
obivan Падаван С++ 447 / 261 / 89 Регистрация: 11.11.2014 Сообщений: 916 |
||||||||
18.08.2016, 14:58 |
4 |
|||||||
РешениеAnette666k, ну судя по коментариям то вопервых код не так как надо будет работать потому что результат всегда будет 9
потому что в коде сверху всегда 0 Добавлено через 2 минуты
вот вам код если хотите чтобы было решение на 3*x + 9
0 |
Заблокирован |
|
18.08.2016, 15:32 |
5 |
и кто тут SHL?
0 |
Я получал странную ошибку, когда разрабатывал свою операционную систему. Я делал драйвер ввода-вывода, используя 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
Причина, по которой это не работает, заключается в том, что __asm
это ключевое слово, так же, как int
является ключевым словом, оно не может появляться само по себе и должно следовать правильному синтаксису. Возьмем следующий фрагмент кода в качестве примера:
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()
{
__asm ; here's a comment but it's ignored
return 0;
}
Кроме здесь мы получаем ошибку 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 {; here's an __asm 'block'
} // 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
Синтаксис ключевого слова, так как нет документации по этому поведению.
2
Номер ошибки: | Ошибка 2400 | |
Название ошибки: | Microsoft Access Error 2400 | |
Описание ошибки: | The row you inserted in the grid exceeds the limit of 255 rows (fields) for a table or 1,000 rows (actions) for a macro.@@@1@@@1. | |
Разработчик: | Microsoft Corporation | |
Программное обеспечение: | Microsoft Access | |
Относится к: | Windows XP, Vista, 7, 8, 10, 11 |
Сводка «Microsoft Access Error 2400
Обычно люди ссылаются на «Microsoft Access Error 2400» как на ошибку времени выполнения (ошибку). Разработчики программного обеспечения пытаются обеспечить, чтобы программное обеспечение было свободным от этих сбоев, пока оно не будет публично выпущено. Хотя эти превентивные действия принимаются, иногда ошибки, такие как ошибка 2400, будут пропущены.
Ошибка 2400, рассматриваемая как «The row you inserted in the grid exceeds the limit of 255 rows (fields) for a table or 1,000 rows (actions) for a macro.@@@1@@@1.», может возникнуть пользователями Microsoft Access в результате нормального использования программы. Сообщение об этой ошибке 2400 позволит разработчикам обновить свое приложение и исправить любые ошибки, которые могут вызвать его. Затем Microsoft Corporation исправляет эти дефектные записи кода и сделает обновление доступным для загрузки. Чтобы исправить такие ошибки 2400 ошибки, устанавливаемое обновление программного обеспечения будет выпущено от поставщика программного обеспечения.
Что генерирует ошибку времени выполнения 2400?
В большинстве случаев вы увидите «Microsoft Access Error 2400» во время загрузки Microsoft Access. Следующие три наиболее значимые причины ошибок выполнения ошибки 2400 включают в себя:
Ошибка 2400 Crash — Ошибка 2400 является хорошо известной, которая происходит, когда неправильная строка кода компилируется в исходный код программы. Обычно это происходит, когда Microsoft Access не может обработать данные в удовлетворительной форме и поэтому не может получить ожидаемый результат.
Утечка памяти «Microsoft Access Error 2400» — ошибка 2400 утечка памяти приводит к тому, что Microsoft Access использует все больше памяти, что делает ваш компьютер запуск медленнее и замедляет вывод системы. Повреждение памяти и другие потенциальные ошибки в коде могут произойти, когда память обрабатывается неправильно.
Error 2400 Logic Error — Ошибка программной логики возникает, когда, несмотря на точный ввод от пользователя, производится неверный вывод. Обычные причины этой проблемы связаны с ошибками в обработке данных.
Как правило, такие Microsoft Corporation ошибки возникают из-за повреждённых или отсутствующих файлов Microsoft Access Error 2400, а иногда — в результате заражения вредоносным ПО в настоящем или прошлом, что оказало влияние на Microsoft Access. Как правило, самый лучший и простой способ устранения ошибок, связанных с файлами Microsoft Corporation, является замена файлов. Запуск сканирования реестра после замены файла, из-за которого возникает проблема, позволит очистить все недействительные файлы Microsoft Access Error 2400, расширения файлов или другие ссылки на файлы, которые могли быть повреждены в результате заражения вредоносным ПО.
Ошибки Microsoft Access Error 2400
Наиболее распространенные ошибки Microsoft Access Error 2400, которые могут возникнуть на компьютере под управлением Windows, перечислены ниже:
- «Ошибка Microsoft Access Error 2400. «
- «Недопустимая программа Win32: Microsoft Access Error 2400»
- «Возникла ошибка в приложении Microsoft Access Error 2400. Приложение будет закрыто. Приносим извинения за неудобства.»
- «Файл Microsoft Access Error 2400 не найден.»
- «Отсутствует файл Microsoft Access Error 2400.»
- «Проблема при запуске приложения: Microsoft Access Error 2400. «
- «Не удается запустить Microsoft Access Error 2400. «
- «Ошибка Microsoft Access Error 2400. «
- «Ошибка в пути к программному обеспечению: Microsoft Access Error 2400. «
Проблемы Microsoft Access Microsoft Access Error 2400 возникают при установке, во время работы программного обеспечения, связанного с Microsoft Access Error 2400, во время завершения работы или запуска или менее вероятно во время обновления операционной системы. При появлении ошибки Microsoft Access Error 2400 запишите вхождения для устранения неполадок Microsoft Access и чтобы HelpMicrosoft Corporation найти причину.
Источники проблем Microsoft Access Error 2400
Проблемы Microsoft Access Error 2400 вызваны поврежденным или отсутствующим Microsoft Access Error 2400, недопустимыми ключами реестра, связанными с Microsoft Access, или вредоносным ПО.
В основном, осложнения Microsoft Access Error 2400 связаны с:
- Недопустимая (поврежденная) запись реестра Microsoft Access Error 2400.
- Загрязненный вирусом и поврежденный Microsoft Access Error 2400.
- Microsoft Access Error 2400 ошибочно удален или злонамеренно программным обеспечением, не связанным с приложением Microsoft Access.
- Другое приложение, конфликтующее с Microsoft Access Error 2400 или другими общими ссылками.
- Поврежденная установка или загрузка Microsoft Access (Microsoft Access Error 2400).
Продукт Solvusoft
Загрузка
WinThruster 2023 — Проверьте свой компьютер на наличие ошибок.
Совместима с Windows 2000, XP, Vista, 7, 8, 10 и 11
Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление