Встроенный ассемблер
Я делаю 64-битную миграцию, и мне нужно перенести встроенный код сборки на cpp. Вот он код
void ExternalFunctionCall::callFunction(ArgType resultType, void* resultBuffer)
{
// I386
// just copy the args buffer to the stack (it's already layed out correctly)
int* begin = m_argsBegin;
int* ptr = m_argsEnd;
while (ptr > begin) {
int val = *(--ptr);
__asm push val
}
}
Я хочу перенести этот __asm push val в cpp. Эта функция вызывается четыре раза, и для каждого вызова мы получаем разные значения m_argsBegin и m_argsEnd (и m_argsBegin, и m_argsEnd являются динамическими массивами). Этот цикл while выполняется 4 раза для каждого вызова этой функции callFunction. Таким образом, в общей сложности 4x4 = 16 значений должны храниться в «НЕПРЕРЫВНОЙ ячейке памяти», это то, что «__asm push val», я думаю. Мне нужно реализовать это в C ++. Я пробовал все возможные способы (стек, массив, список Lnked, очередь даже разделил это в отдельный файл asm, но ни один не работает) Кто-нибудь может помочь?
Я разделил эту встроенную функцию сборки на отдельный файл сборки. Вот код:
.386
.model c,flat
public callFunction_asm
CSEG segment public 'CODE'
callFunction_asm PROC
push ebp
mov ebp, esp
mov ecx, [ebp+8] ;val
push dword ptr [ecx]
mov esp, ebp
pop ebp
RETN
callFunction_asm ENDP
CSEG ends
END
где callFunction_asm - внешняя функция, я объявил ее как:
extern "C" void callFunction_asm (int val);
и я называю эту функцию как:
while (ptr > begin) {
int val = *(--ptr);
callFunction_asm(val); //possible replacement
}
но даже это не работает, кто-нибудь может сказать, где я иду не так. Я новичок в кодировании сборки.