Синтаксическая ошибка встроенного ассемблера во «втором операнде»; найдено ‘зарегистрироваться’

Задаваемые 11 лет, 5 месяцев

Я столкнулся с ошибкой компиляции при работе с инструкциями по сборке в VC ++ в виде встроенных ассемблерных блоков MACRO.

error C2400: inline assembler syntax error in ‘second operand’; found ‘register’

Доброго времени суток!
Редактирую исходник программки на MS Visual С++ с ассемблерными вставками. Программа изначально была написана вроде под Борланд С++, но его у меня нет. По этому переделываю под MS Visual C++. Все ошибки устранил, но одну побороть не могу. А именно:

db 0x66,0x59   // получаем так сказать ECX

int 0x1A       // выполняем прерывание
        mov b_h,bh        // читаем
        mov b_l,bl        // данные
        mov a_h,ah        // в
        mov s_i,si       //  переменные
        }

Ругается на: db 0x66,0x59

Ошибка: error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в “код операции”; обнаружено “constant”

Программу писал не я. Надеюсь на вашу помощь. Спасибо!

Добрый день. Столкнулся с проблемой компиляции кода asm в с++. Есть переменная asmCode – sting. А в ней, собственно, содержится код asm. Пример кода будет в конце вопроса. А вопрос заключается в следующем: если я вывожу, допустим, cout << asmCode; – мне выводит не скомпилированный код asm. Если я пытаюсь вывести _asm(asmCode); – мне бьёт либо

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

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

Читайте также:  Ошибка unarc dll вернул код ошибки 1 error archive data decompression

Дело в том, что код, который содержится в 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

csname db ‘BNI-2016’, 0

newline db ‘0’,0

L0 SDWORD 5

L1 SDWORD 0

push offset csname

push offset DIV_NULL

push offset Overflow

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

2 ответы

Создан 21 фев.

Синтаксическая ошибка встроенного ассемблера во «втором операнде»; найдено 'зарегистрироваться'

Видеть эта страница msdn.

Читайте также:  Код ошибки p0037 тойота авенсис

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

c++
visual-studio-2010
assembly
inline-assembly

or задайте свой вопрос.

25 ответов

12 июня 2011 года

889 / / 29. 2009

это pop cx

23 / / 15. 2010

Как правильно записать в VC++ ? Чтобы не ругалось.

7K / / 26. 2011

pop ecx
хотя не уверен.

С компилировалось, но под win 7 результат не запускается

А эта прога случайно не под дос была раньше?

Да, программка для доса. Пойду гуглить.

У доса ж прерывания другие. Естественно, что инструкции вида int. у вас работают некорректно.

Подскажите, что сделать то? Чтобы программа заработала 🙂

эта программа не для доса. в досе это прерывание устанавливаетчитает системное время.

INT 1A – PCI BIOS v2. 0c+ – FIND PCI CLASS CODE
AX = B103h
ECX = class code (see also #F0085,#00878)
bits 31-24 unused
bits 23-16 class
bits 15-8 subclass
bits 7-0 programming interface
SI = device index (0-n)
Return: CF clear if successful
CF set on error
AH = status (00h,86h) (see #00729)
00h successful
BH = bus number
BL = device/function number (bits 7-3 device, bits 2-0 func)
86h device not found
EAX, EBX, ECX, and EDX may be modified
all other flags (except IF) may be modified
Notes: this function may require up to 1024 byte of stack; it will not enable
interrupts if they were disabled before making the call
the meanings of BL and BH on return were exchanged between the initial
drafts of the specification and final implementation
all devices sharing the same Class Code may be enumerated by
incrementing SI from 0 until error 86h is returned

Читайте также:  "Не удалось найти получателя отчетности в справочниках ПФР"

наверное, нужно будет делать драйвер.

Программка для сканирования подключенных устройств.

Всем спасибо, буду разбираться с Борландом

1K / / 16. 2003

Мальчик/Девочка (RM/PM) – какая разница.

Вы лучше обозначте то, что вам надо.

Сканер PCI шины, есть исходник, рабочий, но он не компилируется. Код написан на Борланд С++, на VS C++ не компилируется, хотя я и исправил все, вроде как правильно. на экран должно вывести какие устройства подключены к ПК.

Это вам надо сделать под какую платформу Windows али DOS?

PS: А работать ваша программа будет только в ДОСе, причем откомпилированная для него же, VS C++ компилирует как бы для Windows.

Тогда чем откомпилировать код, для ДОСа? Подскажите плз.

13 июня 2011 года

зачем компилировать под дос, если запускаться будет в винде?

С компилировалось, запускается и вроде работает. Спасибо!
Единственно, не показывает устройства.

Вопрос все тот же, про мальчика с девочкой. Где вы ее запускаете в DOSе или в Windows’е?

Запускаю в Windows, программа запускается, выводит сообщение, PCI Bios disabled

mov _ah,ah // если в ah 0 то идем дальше, иначе вывод сообщения PCI Bios disabled

Запускал программу через DOSBox 0. 74, результат точно такой же.

в ДОСе.

PS: Возвращаемся к условию задачи?

Тогда подскажите плз, как мне ее в чистом ДОСе запустить? 🙂

Очевидно, что водрузив ДОС на физической машине, тогда вы получите список реальных PCI устройств. Либо водрузив ДОС в виртуальной машине в этом случае вы получите список виртуальный устройств.

PS: В итоге, я бы Вам всеже рекомендовал огласить условия задачи и контекст в котором данная задача выполняется.

Запустил из под ДОСа, работает! Спасибо за советы!

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *