Задаваемые 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 синтаксическая ошибка во встроенном коде на языке ассемблера в “код операции”; обнаружено “(“
Дело в том, что код, который содержится в 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.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками
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: В итоге, я бы Вам всеже рекомендовал огласить условия задачи и контекст в котором данная задача выполняется.
Запустил из под ДОСа, работает! Спасибо за советы!