Я работаю над проектом cpp. Проект должен быть перенесен на 64 бит. Он содержит некоторый код сборки Inline, который не может компилироваться на x64. Это функция, которая содержит код сборки:Преобразовать встроенный код сборки в C++
void ExternalFunctionCall::callFunction(ArgType resultType, void* resultBuffer)
{
#if defined(_NT_) || defined(__OS2__)
// I386
// just copy the args buffer to the stack (it's already layed out correctly)
int* begin = m_argsBegin;
int* ptr = m_argsEnd;
int arr[1000], i=0;
while (ptr > begin) {
int val = *(--ptr);
__asm push val
}
void* functionAddress = m_functionAddress;
// call the function & handle the return value. use __stdcall calling convention
switch (resultType) {
case voidType:
__asm {
call functionAddress
}
break;
case pointerType:
case int32Type:
__asm {
call functionAddress
mov ebx, resultBuffer
mov dword ptr [ebx],eax
}
break;
case floatType:
__asm {
call functionAddress
mov ebx, resultBuffer
fstp dword ptr [ebx]
}
break;
case doubleType:
__asm {
call functionAddress
mov ebx, resultBuffer
fstp qword ptr [ebx]
}
break;
}
Я использовал стек, массив перенести это «ассемблерный толчок VAL», но не работает. Хотя, он не бросает ошибки компиляции, но логика не сработала.
Итак, я хочу спросить: что я могу использовать на C++ вместо «__asm push val». Любая помощь будет оценена.
Несомненно, это не единственная инструкция по сборке в программе? Как вы используете толкаемое значение? На данный момент информации недостаточно, чтобы помочь вам. –
Вам нужно будет показать больше кода, чтобы мы могли знать, что делается со значением, наложенным на стек. –
Стандарт C++ не включает встроенный язык ассемблера или любые операции для непосредственного изменения стека процессора .... У вас больше шансов получить полезный совет, если вы объясните, что делает ваша функция с стеком впоследствии? Если он готовит значения для вызова функции или чего-то еще, может быть другой способ предоставить аргументы. Вероятно, это очень специфично для вашей ОС и/или компилятора, о чем вы не указали. –