Ошибка с 2400 как исправить

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 выдал такую ошибку
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в «код операции»; обнаружено «SHL».
что это значить?



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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{
int x, y = 0; //Объявляем целочисленные переменные x и y
cout << "x = ";
cin >> x;    //Считываем значение в переменную x
_asm
{
xor EAX, EAX //обнуляем регистр EAX xor EBX, EBX //обнуляем регистр EBX mov EAX, x   //EAX = x
mov EBX, 3   //EBX = 3
mul EBX      //EAX = EAX*EBX = 3*x
mov EBX, 9   //EBX = 9
add EAX, EBX //EAX = EAX + EBX = 3*x+9
mov y, EAX   //Записываем результат в y
}
cout << "y = " << y << endl; //Выводим результат на экран
}



0



obivan

Падаван С++

447 / 261 / 89

Регистрация: 11.11.2014

Сообщений: 916

18.08.2016, 14:58

4

Лучший ответ Сообщение было отмечено Anette666k как решение

Решение

Anette666k, ну судя по коментариям то вопервых код не так как надо будет работать потому что результат всегда будет 9

Assembler
1
2
3
xor EAX, EAX //обнуляем регистр EAX xor EBX, EBX //обнуляем регистр EBX mov EAX, x   //EAX = x
mov EBX, 3   //EBX = 3
mul EBX

потому что в коде сверху всегда 0
Теперь вопрос где компилируете, в vs2015 все норм скомпилировалось и результат как и должен быть 9

Добавлено через 2 минуты

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
void main()
{
    int x, y = 0; 
    cout << "x = ";
    cin >> x;    
    _asm
    {
        mov EAX, x 
        mov EBX, 3   
        mul EBX      
        mov EBX, 9   
        add EAX, EBX 
        mov y, EAX   
    }
    cout << "y = " << y << endl; 
}

вот вам код если хотите чтобы было решение на 3*x + 9



0



MansMI

Заблокирован

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!

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

  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

Причина, по которой это не работает, заключается в том, что __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

Icon Ex Номер ошибки: Ошибка 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) | Лицензия | Политика защиты личных сведений | Условия | Удаление

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Найти песню таких как ты на свете
  • Как найти стрелка по кошкам
  • Как найти удаленные сообщения на авито
  • Как найти интернет друга подростку
  • Подключение не защищено как исправить опера андроид

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии