Pracuję nad projektem cpp. Projekt musi zostać zmigrowany do wersji 64-bitowej. Zawiera jakiś kod zespołu Inline, którego nie można skompilować na x64. Jest to funkcja, która zawiera kod montaż:Konwertuj kod wbudowanego zestawu do 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;
}
użyłem stos, tablicę do migracji to „asm pchnięcie val” ale nie działa. Mimo, że nie wyrzuci żadnego błędu kompilacji, ale logika nie zadziałała.
Tak, chcę zapytać, co mogę użyć w C++ zamiast "__asm push val". Każda pomoc zostanie doceniona.
Z pewnością nie jest to jedyna instrukcja montażu w programie? Jak korzystać z wartości pchanej? W tej chwili nie ma wystarczającej ilości informacji, aby ci pomóc. –
Będziesz musiał pokazać więcej kodu, abyśmy wiedzieli, co robimy z wartością pchaną na stos. –
Standardowy C++ nie zawiera wbudowanego języka asemblera lub jakichkolwiek operacji służących do bezpośredniego modyfikowania stosu procesora. Masz większą szansę na przydatną poradę, jeśli wyjaśnisz, co robi twoja funkcja ze stosem? Jeśli przygotowuje wartości dla wywołania funkcji lub czegoś, może istnieć inny sposób dostarczenia argumentów. Prawdopodobnie jest to bardzo specyficzne dla twojego systemu operacyjnego i/lub kompilatora, którego nie podano. –